/ Hex Artifact Content
Login

Artifact 49022d3c155a3af14298459d6990c0c9f096f42afa1edb6d86e8f4ac45a6301e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 45 78  Int.h"../*.** Ex
0360: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
0370: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
0380: 65 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  end of sqlite3_i
0390: 6e 64 65 78 5f 69 6e 66 6f 20 62 75 74 20 6e 6f  ndex_info but no
03a0: 74 0a 2a 2a 20 76 69 73 69 62 6c 65 20 74 6f 20  t.** visible to 
03b0: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 66  the xBestIndex f
03c0: 75 6e 63 74 69 6f 6e 2c 20 61 74 20 6c 65 61 73  unction, at leas
03d0: 74 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 2e 20  t not directly. 
03e0: 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   The.** sqlite3_
03f0: 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  vtab_collation()
0400: 20 69 6e 74 65 72 66 61 63 65 20 6b 6e 6f 77 73   interface knows
0410: 20 68 6f 77 20 74 6f 20 72 65 61 63 68 20 69 74   how to reach it
0420: 2c 20 68 6f 77 65 76 65 72 2e 0a 2a 2a 0a 2a 2a  , however..**.**
0430: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
0440: 6e 6f 74 20 61 6e 20 41 50 49 20 61 6e 64 20 63  not an API and c
0450: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 66 72  an be changed fr
0460: 6f 6d 20 6f 6e 65 20 72 65 6c 65 61 73 65 20 74  om one release t
0470: 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 2e 20 20  o the.** next.  
0480: 41 73 20 6c 6f 6e 67 20 61 73 20 61 6c 6c 6f 63  As long as alloc
0490: 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 61  ateIndexInfo() a
04a0: 6e 64 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  nd sqlite3_vtab_
04b0: 63 6f 6c 6c 61 74 69 6f 6e 28 29 0a 2a 2a 20 61  collation().** a
04c0: 67 72 65 65 20 6f 6e 20 74 68 65 20 73 74 72 75  gree on the stru
04d0: 63 74 75 72 65 2c 20 61 6c 6c 20 77 69 6c 6c 20  cture, all will 
04e0: 62 65 20 77 65 6c 6c 2e 0a 2a 2f 0a 74 79 70 65  be well..*/.type
04f0: 64 65 66 20 73 74 72 75 63 74 20 48 69 64 64 65  def struct Hidde
0500: 6e 49 6e 64 65 78 49 6e 66 6f 20 48 69 64 64 65  nIndexInfo Hidde
0510: 6e 49 6e 64 65 78 49 6e 66 6f 3b 0a 73 74 72 75  nIndexInfo;.stru
0520: 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e  ct HiddenIndexIn
0530: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
0540: 73 65 20 2a 70 57 43 3b 20 20 20 2f 2a 20 54 68  se *pWC;   /* Th
0550: 65 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 62  e Where clause b
0560: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
0570: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0580: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ;      /* The pa
0590: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
05a0: 0a 7d 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  .};../* Forward 
05b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d  declaration of m
05c0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
05d0: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
05e0: 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57  size(sqlite3*, W
05f0: 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b  hereLoop*, int);
0600: 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72 69 61 62  ../* Test variab
0610: 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  le that can be s
0620: 65 74 20 74 6f 20 65 6e 61 62 6c 65 20 57 48 45  et to enable WHE
0630: 52 45 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  RE tracing */.#i
0640: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
0650: 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
0660: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
0670: 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69 74 65  /***/ int sqlite
0680: 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
0690: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
06a0: 52 65 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d  Return the estim
06b0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
06c0: 75 74 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20  utput rows from 
06d0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  a WHERE clause.*
06e0: 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69 74 65 33  /.LogEst sqlite3
06f0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
0700: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
0710: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
0720: 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
0730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0740: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  n one of the WHE
0750: 52 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78  RE_DISTINCT_xxxx
0760: 78 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69  x values to indi
0770: 63 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a  cate how this.**
0780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0790: 74 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f  turns outputs fo
07a0: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
07b0: 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssing..*/.int sq
07c0: 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
07d0: 69 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a  inct(WhereInfo *
07e0: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
07f0: 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  n pWInfo->eDisti
0800: 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nct;.}../*.** Re
0810: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0820: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0830: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
0840: 44 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a  DER BY order..**
0850: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
0860: 20 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64   the output need
0870: 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a  s to be sorted..
0880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
0890: 65 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65  ereIsOrdered(Whe
08a0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
08b0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
08c0: 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a  ->nOBSat;.}../*.
08d0: 2a 2a 20 49 6e 20 74 68 65 20 4f 52 44 45 52 20  ** In the ORDER 
08e0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
08f0: 61 74 69 6f 6e 2c 20 69 66 20 74 68 65 20 69 6e  ation, if the in
0900: 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 20 69 73  ner-most loop is
0910: 20 6b 6e 6f 77 6e 0a 2a 2a 20 74 6f 20 65 6d 69   known.** to emi
0920: 74 20 72 6f 77 73 20 69 6e 20 69 6e 63 72 65 61  t rows in increa
0930: 73 69 6e 67 20 6f 72 64 65 72 2c 20 61 6e 64 20  sing order, and 
0940: 69 66 20 74 68 65 20 6c 61 73 74 20 72 6f 77 20  if the last row 
0950: 65 6d 69 74 74 65 64 20 62 79 20 74 68 65 0a 2a  emitted by the.*
0960: 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f  * inner-most loo
0970: 70 20 64 69 64 20 6e 6f 74 20 66 69 74 20 77 69  p did not fit wi
0980: 74 68 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  thin the sorter,
0990: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 73 6b 69   then we can ski
09a0: 70 20 61 6c 6c 0a 2a 2a 20 73 75 62 73 65 71 75  p all.** subsequ
09b0: 65 6e 74 20 72 6f 77 73 20 66 6f 72 20 74 68 65  ent rows for the
09c0: 20 63 75 72 72 65 6e 74 20 69 74 65 72 61 74 69   current iterati
09d0: 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  on of the inner 
09e0: 6c 6f 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  loop (because th
09f0: 65 79 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  ey.** will not f
0a00: 69 74 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  it in the sorter
0a10: 20 65 69 74 68 65 72 29 20 61 6e 64 20 63 6f 6e   either) and con
0a20: 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 73  tinue with the s
0a30: 65 63 6f 6e 64 20 69 6e 6e 65 72 0a 2a 2a 20 6c  econd inner.** l
0a40: 6f 6f 70 20 2d 20 74 68 65 20 6c 6f 6f 70 20 69  oop - the loop i
0a50: 6d 6d 65 64 69 61 74 65 6c 79 20 6f 75 74 73 69  mmediately outsi
0a60: 64 65 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  de the inner-mos
0a70: 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  t..**.** When a 
0a80: 72 6f 77 20 64 6f 65 73 20 6e 6f 74 20 66 69 74  row does not fit
0a90: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 28   in the sorter (
0aa0: 62 65 63 61 75 73 65 20 74 68 65 20 73 6f 72 74  because the sort
0ab0: 65 72 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 6f  er already.** ho
0ac0: 6c 64 73 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  lds LIMIT+OFFSET
0ad0: 20 72 6f 77 73 20 74 68 61 74 20 61 72 65 20 73   rows that are s
0ae0: 6d 61 6c 6c 65 72 29 2c 20 74 68 65 6e 20 61 20  maller), then a 
0af0: 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20  jump is made to 
0b00: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 72 65 74  the.** label ret
0b10: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
0b20: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
0b30: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c 49   the ORDER BY LI
0b40: 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  MIT optimization
0b50: 20 61 70 70 6c 69 65 73 2c 20 74 68 65 20 6a 75   applies, the ju
0b60: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73  mp destination s
0b70: 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20  hould.** be the 
0b80: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72  continuation for
0b90: 20 74 68 65 20 73 65 63 6f 6e 64 2d 69 6e 6e 65   the second-inne
0ba0: 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20 20 49 66  r-most loop.  If
0bb0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
0bc0: 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74   LIMIT optimizat
0bd0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  ion does not app
0be0: 6c 79 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d  ly, then the jum
0bf0: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73 68  p destination sh
0c00: 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20 63  ould.** be the c
0c10: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72 20  ontinuation for 
0c20: 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c  the inner-most l
0c30: 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  oop..**.** It is
0c40: 20 61 6c 77 61 79 73 20 73 61 66 65 20 66 6f 72   always safe for
0c50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
0c60: 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 74   return the cont
0c70: 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  inuation of the.
0c80: 2a 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f  ** inner-most lo
0c90: 6f 70 2c 20 69 6e 20 74 68 65 20 73 65 6e 73 65  op, in the sense
0ca0: 20 74 68 61 74 20 61 20 63 6f 72 72 65 63 74 20   that a correct 
0cb0: 61 6e 73 77 65 72 20 77 69 6c 6c 20 72 65 73 75  answer will resu
0cc0: 6c 74 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e 69  lt.  .** Returni
0cd0: 6e 67 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ng the continuat
0ce0: 69 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ion the second i
0cf0: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 61 6e 20  nner loop is an 
0d00: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
0d10: 74 68 61 74 20 6d 69 67 68 74 20 6d 61 6b 65 20  that might make 
0d20: 74 68 65 20 63 6f 64 65 20 72 75 6e 20 61 20 6c  the code run a l
0d30: 69 74 74 6c 65 20 66 61 73 74 65 72 2c 20 62 75  ittle faster, bu
0d40: 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61  t should not cha
0d50: 6e 67 65 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c  nge.** the final
0d60: 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
0d70: 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65  sqlite3WhereOrde
0d80: 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c  rByLimitOptLabel
0d90: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0da0: 66 6f 29 7b 0a 20 20 57 68 65 72 65 4c 65 76 65  fo){.  WhereLeve
0db0: 6c 20 2a 70 49 6e 6e 65 72 3b 0a 20 20 69 66 28  l *pInner;.  if(
0dc0: 20 21 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72   !pWInfo->bOrder
0dd0: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
0de0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
0df0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
0e00: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ation does not a
0e10: 70 70 6c 79 2e 20 20 4a 75 6d 70 20 74 6f 20 74  pply.  Jump to t
0e20: 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 69  he .    ** conti
0e30: 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  nuation of the i
0e40: 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20  nner-most loop. 
0e50: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 57  */.    return pW
0e60: 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b  Info->iContinue;
0e70: 0a 20 20 7d 0a 20 20 70 49 6e 6e 65 72 20 3d 20  .  }.  pInner = 
0e80: 26 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66  &pWInfo->a[pWInf
0e90: 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 3b 0a 20 20  o->nLevel-1];.  
0ea0: 61 73 73 65 72 74 28 20 70 49 6e 6e 65 72 2d 3e  assert( pInner->
0eb0: 61 64 64 72 4e 78 74 21 3d 30 20 29 3b 0a 20 20  addrNxt!=0 );.  
0ec0: 72 65 74 75 72 6e 20 70 49 6e 6e 65 72 2d 3e 61  return pInner->a
0ed0: 64 64 72 4e 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ddrNxt;.}../*.**
0ee0: 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42 45   Return the VDBE
0ef0: 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62 65   address or labe
0f00: 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e 20  l to jump to in 
0f10: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e 75  order to continu
0f20: 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
0f30: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72   with the next r
0f40: 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63 6c  ow of a WHERE cl
0f50: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
0f60: 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
0f70: 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  eLabel(WhereInfo
0f80: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
0f90: 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ert( pWInfo->iCo
0fa0: 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 72  ntinue!=0 );.  r
0fb0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 43  eturn pWInfo->iC
0fc0: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
0fd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
0fe0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
0ff0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
1000: 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b 0a   order to break.
1010: 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45 52  ** out of a WHER
1020: 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  E loop..*/.int s
1030: 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
1040: 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f 20  Label(WhereInfo 
1050: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
1060: 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  rn pWInfo->iBrea
1070: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
1080: 72 6e 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 28  rn ONEPASS_OFF (
1090: 30 29 20 69 66 20 61 6e 20 55 50 44 41 54 45 20  0) if an UPDATE 
10a0: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
10b0: 65 6e 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  ent is unable to
10c0: 0a 2a 2a 20 6f 70 65 72 61 74 65 20 64 69 72 65  .** operate dire
10d0: 63 74 6c 79 20 6f 6e 20 74 68 65 20 72 6f 77 69  ctly on the rowi
10e0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  s returned by a 
10f0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52  WHERE clause.  R
1100: 65 74 75 72 6e 0a 2a 2a 20 4f 4e 45 50 41 53 53  eturn.** ONEPASS
1110: 5f 53 49 4e 47 4c 45 20 28 31 29 20 69 66 20 74  _SINGLE (1) if t
1120: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  he statement can
1130: 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 72 65 63   operation direc
1140: 74 6c 79 20 62 65 63 61 75 73 65 20 6f 6e 6c 79  tly because only
1150: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  .** a single row
1160: 20 69 73 20 74 6f 20 62 65 20 63 68 61 6e 67 65   is to be change
1170: 64 2e 20 20 52 65 74 75 72 6e 20 4f 4e 45 50 41  d.  Return ONEPA
1180: 53 53 5f 4d 55 4c 54 49 20 28 32 29 20 69 66 20  SS_MULTI (2) if 
1190: 74 68 65 20 6f 6e 65 2d 70 61 73 73 0a 2a 2a 20  the one-pass.** 
11a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
11b0: 20 62 65 20 75 73 65 64 20 6f 6e 20 6d 75 6c 74   be used on mult
11c0: 69 70 6c 65 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  iple .**.** If t
11d0: 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
11e0: 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ization is used 
11f0: 28 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65  (if this routine
1200: 20 72 65 74 75 72 6e 73 20 74 72 75 65 29 0a 2a   returns true).*
1210: 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  * then also writ
1220: 65 20 74 68 65 20 69 6e 64 69 63 65 73 20 6f 66  e the indices of
1230: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 75 73   open cursors us
1240: 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a 2a 2a  ed by ONEPASS.**
1250: 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d 20 61   into aiCur[0] a
1260: 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20 69 61  nd aiCur[1].  ia
1270: 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68 65 20  Cur[0] gets the 
1280: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 64 61  cursor of the da
1290: 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  ta.** table and 
12a0: 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20 74 68  iaCur[1] gets th
12b0: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  e cursor used by
12c0: 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 69 6e   an auxiliary in
12d0: 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72 20 76  dex..** Either v
12e0: 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31 2c 20  alue may be -1, 
12f0: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1300: 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 75 73  cursor is not us
1310: 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72 73 6f  ed..** Any curso
1320: 72 73 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  rs returned will
1330: 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1340: 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  d for writing..*
1350: 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20 61 6e  *.** aiCur[0] an
1360: 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74 68 20  d aiCur[1] both 
1370: 67 65 74 20 2d 31 20 69 66 20 74 68 65 20 77 68  get -1 if the wh
1380: 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67 69 63  ere-clause logic
1390: 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f   is.** unable to
13a0: 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41 53 53   use the ONEPASS
13b0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
13c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
13d0: 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72  reOkOnePass(Wher
13e0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 69  eInfo *pWInfo, i
13f0: 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20 6d 65  nt *aiCur){.  me
1400: 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57 49 6e  mcpy(aiCur, pWIn
1410: 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
1420: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 29  , sizeof(int)*2)
1430: 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
1440: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
1450: 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1460: 61 63 65 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  ace && pWInfo->e
1470: 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
1480: 5f 4f 46 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  _OFF ){.    sqli
1490: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
14a0: 25 73 20 63 75 72 73 6f 72 73 3a 20 25 64 20 25  %s cursors: %d %
14b0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
14c0: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
14d0: 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20  =ONEPASS_SINGLE 
14e0: 3f 20 22 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  ? "ONEPASS_SINGL
14f0: 45 22 20 3a 20 22 4f 4e 45 50 41 53 53 5f 4d 55  E" : "ONEPASS_MU
1500: 4c 54 49 22 2c 0a 20 20 20 20 20 20 20 20 20 61  LTI",.         a
1510: 69 43 75 72 5b 30 5d 2c 20 61 69 43 75 72 5b 31  iCur[0], aiCur[1
1520: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ]);.  }.#endif. 
1530: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
1540: 65 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a  eOnePass;.}../*.
1550: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6e 74  ** Move the cont
1560: 65 6e 74 20 6f 66 20 70 53 72 63 20 69 6e 74 6f  ent of pSrc into
1570: 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74 69 63   pDest.*/.static
1580: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 4d 6f 76   void whereOrMov
1590: 65 28 57 68 65 72 65 4f 72 53 65 74 20 2a 70 44  e(WhereOrSet *pD
15a0: 65 73 74 2c 20 57 68 65 72 65 4f 72 53 65 74 20  est, WhereOrSet 
15b0: 2a 70 53 72 63 29 7b 0a 20 20 70 44 65 73 74 2d  *pSrc){.  pDest-
15c0: 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a 20 20  >n = pSrc->n;.  
15d0: 6d 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 61 2c  memcpy(pDest->a,
15e0: 20 70 53 72 63 2d 3e 61 2c 20 70 44 65 73 74 2d   pSrc->a, pDest-
15f0: 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73 74 2d  >n*sizeof(pDest-
1600: 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >a[0]));.}../*.*
1610: 2a 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74 20  * Try to insert 
1620: 61 20 6e 65 77 20 70 72 65 72 65 71 75 69 73 69  a new prerequisi
1630: 74 65 2f 63 6f 73 74 20 65 6e 74 72 79 20 69 6e  te/cost entry in
1640: 74 6f 20 74 68 65 20 57 68 65 72 65 4f 72 53 65  to the WhereOrSe
1650: 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  t pSet..**.** Th
1660: 65 20 6e 65 77 20 65 6e 74 72 79 20 6d 69 67 68  e new entry migh
1670: 74 20 6f 76 65 72 77 72 69 74 65 20 61 6e 20 65  t overwrite an e
1680: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2c 20 6f  xisting entry, o
1690: 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a  r it might be.**
16a0: 20 61 70 70 65 6e 64 65 64 2c 20 6f 72 20 69 74   appended, or it
16b0: 20 6d 69 67 68 74 20 62 65 20 64 69 73 63 61 72   might be discar
16c0: 64 65 64 2e 20 20 44 6f 20 77 68 61 74 65 76 65  ded.  Do whateve
16d0: 72 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  r is the right t
16e0: 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61 74 20  hing.** so that 
16f0: 70 53 65 74 20 6b 65 65 70 73 20 74 68 65 20 4e  pSet keeps the N
1700: 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74 20 65 6e  _OR_COST best en
1710: 74 72 69 65 73 20 73 65 65 6e 20 73 6f 20 66 61  tries seen so fa
1720: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1730: 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 0a   whereOrInsert(.
1740: 20 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53    WhereOrSet *pS
1750: 65 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  et,      /* The 
1760: 57 68 65 72 65 4f 72 53 65 74 20 74 6f 20 62 65  WhereOrSet to be
1770: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 42 69   updated */.  Bi
1780: 74 6d 61 73 6b 20 70 72 65 72 65 71 2c 20 20 20  tmask prereq,   
1790: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 69       /* Prerequi
17a0: 73 69 74 65 73 20 6f 66 20 74 68 65 20 6e 65 77  sites of the new
17b0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
17c0: 73 74 20 72 52 75 6e 2c 20 20 20 20 20 20 20 20  st rRun,        
17d0: 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74 20 6f     /* Run-cost o
17e0: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
17f0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  */.  LogEst nOut
1800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1810: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73  umber of outputs
1820: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
1830: 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 69  ry */.){.  u16 i
1840: 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f 73 74 20  ;.  WhereOrCost 
1850: 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53 65 74  *p;.  for(i=pSet
1860: 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61 3b 20  ->n, p=pSet->a; 
1870: 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a  i>0; i--, p++){.
1880: 20 20 20 20 69 66 28 20 72 52 75 6e 3c 3d 70 2d      if( rRun<=p-
1890: 3e 72 52 75 6e 20 26 26 20 28 70 72 65 72 65 71  >rRun && (prereq
18a0: 20 26 20 70 2d 3e 70 72 65 72 65 71 29 3d 3d 70   & p->prereq)==p
18b0: 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 67  rereq ){.      g
18c0: 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e 73 65 72  oto whereOrInser
18d0: 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  t_done;.    }.  
18e0: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
18f0: 52 75 6e 20 26 26 20 28 70 2d 3e 70 72 65 72 65  Run && (p->prere
1900: 71 20 26 20 70 72 65 72 65 71 29 3d 3d 70 2d 3e  q & prereq)==p->
1910: 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20  prereq ){.      
1920: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1930: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74 2d 3e    }.  if( pSet->
1940: 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b 0a 20  n<N_OR_COST ){. 
1950: 20 20 20 70 20 3d 20 26 70 53 65 74 2d 3e 61 5b     p = &pSet->a[
1960: 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20  pSet->n++];.    
1970: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
1980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
1990: 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20 66 6f   pSet->a;.    fo
19a0: 72 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d 3e 6e  r(i=1; i<pSet->n
19b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
19c0: 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74 2d 3e  ( p->rRun>pSet->
19d0: 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20 3d 20  a[i].rRun ) p = 
19e0: 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20 20 20  pSet->a + i;.   
19f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52   }.    if( p->rR
1a00: 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74 75 72  un<=rRun ) retur
1a10: 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65 4f 72  n 0;.  }.whereOr
1a20: 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20 20 70  Insert_done:.  p
1a30: 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65  ->prereq = prere
1a40: 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d 20 72  q;.  p->rRun = r
1a50: 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  Run;.  if( p->nO
1a60: 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e 4f 75  ut>nOut ) p->nOu
1a70: 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65 74 75  t = nOut;.  retu
1a80: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
1a90: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
1aa0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
1ab0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
1ac0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
1ad0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
1ae0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 42 69 74   the set..*/.Bit
1af0: 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72  mask sqlite3Wher
1b00: 65 47 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61  eGetMask(WhereMa
1b10: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
1b20: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
1b30: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1b40: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28  ( pMaskSet->n<=(
1b50: 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61  int)sizeof(Bitma
1b60: 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69  sk)*8 );.  for(i
1b70: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
1b80: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
1b90: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
1ba0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
1bb0: 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49     return MASKBI
1bc0: 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(i);.    }.  }.
1bd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1be0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1bf0: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
1c00: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
1c10: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
1c20: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
1c30: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1c40: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
1c50: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
1c60: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1c70: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
1c80: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
1c90: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
1ca0: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
1cb0: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
1cc0: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
1cd0: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
1ce0: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
1cf0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
1d00: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
1d10: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
1d20: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
1d30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
1d40: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
1d50: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
1d60: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
1d70: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
1d80: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
1d90: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1da0: 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72  to the next Wher
1db0: 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68  eTerm that match
1dc0: 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
1dd0: 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
1de0: 65 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e  established when
1df0: 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63   the pScan objec
1e00: 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  t was initialize
1e10: 64 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e  d by whereScanIn
1e20: 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  it()..** Return 
1e30: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
1e40: 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69  e no more matchi
1e50: 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  ng WhereTerms..*
1e60: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
1e70: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
1e80: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
1e90: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1eb0: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
1ec0: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
1ed0: 20 2a 2f 0a 20 20 69 31 36 20 69 43 6f 6c 75 6d   */.  i16 iColum
1ee0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
1ef0: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
1f00: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
1f10: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
1f20: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1f30: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1f40: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
1f50: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
1f60: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
1f70: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
1f80: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
1f90: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1fa0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
1fb0: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
1fc0: 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e  .  int k = pScan
1fd0: 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  ->k;    /* Where
1fe0: 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69   to start scanni
1ff0: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
2000: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d   pScan->iEquiv<=
2010: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 3b  pScan->nEquiv );
2020: 0a 20 20 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  .  pWC = pScan->
2030: 70 57 43 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  pWC;.  while(1){
2040: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
2050: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
2060: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
2070: 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63 61  .    iCur = pSca
2080: 6e 2d 3e 61 69 43 75 72 5b 70 53 63 61 6e 2d 3e  n->aiCur[pScan->
2090: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 61  iEquiv-1];.    a
20a0: 73 73 65 72 74 28 20 70 57 43 21 3d 30 20 29 3b  ssert( pWC!=0 );
20b0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66  .    do{.      f
20c0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
20d0: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
20e0: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
20f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2100: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
2110: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
2120: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
2130: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
2140: 20 20 20 20 20 20 26 26 20 28 69 43 6f 6c 75 6d        && (iColum
2150: 6e 21 3d 58 4e 5f 45 58 50 52 0a 20 20 20 20 20  n!=XN_EXPR.     
2160: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2170: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2180: 70 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  p(pTerm->pExpr->
2190: 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20  pLeft,.         
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
21c0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 2c 69 43  can->pIdxExpr,iC
21d0: 75 72 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ur)==0).        
21e0: 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71 75   && (pScan->iEqu
21f0: 69 76 3c 3d 31 20 7c 7c 20 21 45 78 70 72 48 61  iv<=1 || !ExprHa
2200: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
2210: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
2220: 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29 7b  oin)).        ){
2230: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2240: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2250: 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a   & WO_EQUIV)!=0.
2260: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
2270: 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61  can->nEquiv<Arra
2280: 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 69 43  ySize(pScan->aiC
2290: 75 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  ur).           &
22a0: 26 20 28 70 58 20 3d 20 73 71 6c 69 74 65 33 45  & (pX = sqlite3E
22b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
22c0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
22d0: 67 68 74 29 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  ght))->op==TK_CO
22e0: 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 29  LUMN.          )
22f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2300: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t j;.           
2310: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61   for(j=0; j<pSca
2320: 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 2b 29 7b  n->nEquiv; j++){
2330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2340: 66 28 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  f( pScan->aiCur[
2350: 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20  j]==pX->iTable. 
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2370: 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e   pScan->aiColumn
2380: 5b 6a 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e  [j]==pX->iColumn
2390: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23d0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53         if( j==pS
23e0: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
2400: 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 20 3d 20 70  an->aiCur[j] = p
2410: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  X->iTable;.     
2420: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2430: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 58  aiColumn[j] = pX
2440: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
2450: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2460: 6e 45 71 75 69 76 2b 2b 3b 0a 20 20 20 20 20 20  nEquiv++;.      
2470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2480: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2490: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
24a0: 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d  tor & pScan->opM
24b0: 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
24c0: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
24d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e   the affinity an
24e0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
24f0: 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20  ence match */.  
2500: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2510: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26  can->zCollName &
2520: 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
2530: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29  tor & WO_ISNULL)
2540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2550: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2560: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
2570: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
2580: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e   = pWC->pWInfo->
2590: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
25a0: 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
25b0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
25c0: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
25d0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
25e0: 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64  Ok(pX, pScan->id
25f0: 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20  xaff) ){.       
2600: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2610: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2620: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2630: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
2640: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2650: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2660: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2670: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20  llSeq(pParse,.  
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
26c0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
26d0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
26e0: 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61  =0 ) pColl = pPa
26f0: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
2700: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
2710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2720: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
2730: 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e  e, pScan->zCollN
2740: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
2750: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2760: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2770: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2780: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2790: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
27a0: 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
27b0: 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
27c0: 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72     && (pX = pTer
27d0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
27e0: 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  )->op==TK_COLUMN
27f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2800: 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63   pX->iTable==pSc
2810: 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 0a 20 20 20  an->aiCur[0].   
2820: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
2830: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d  >iColumn==pScan-
2840: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 0a 20 20 20  >aiColumn[0].   
2850: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2860: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2870: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
2880: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
28a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
28b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28c0: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
28d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  WC;.            
28e0: 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a  pScan->k = k+1;.
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2900: 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20  rn pTerm;.      
2910: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
2930: 43 20 3d 20 70 57 43 2d 3e 70 4f 75 74 65 72 3b  C = pWC->pOuter;
2940: 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  .      k = 0;.  
2950: 20 20 7d 77 68 69 6c 65 28 20 70 57 43 21 3d 30    }while( pWC!=0
2960: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 63 61   );.    if( pSca
2970: 6e 2d 3e 69 45 71 75 69 76 3e 3d 70 53 63 61 6e  n->iEquiv>=pScan
2980: 2d 3e 6e 45 71 75 69 76 20 29 20 62 72 65 61 6b  ->nEquiv ) break
2990: 3b 0a 20 20 20 20 70 57 43 20 3d 20 70 53 63 61  ;.    pWC = pSca
29a0: 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20  n->pOrigWC;.    
29b0: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  k = 0;.    pScan
29c0: 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20 20 7d 0a  ->iEquiv++;.  }.
29d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
29e0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
29f0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
2a00: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
2a10: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2a20: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
2a30: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
2a40: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
2a50: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
2a60: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
2a70: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
2a80: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
2a90: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
2aa0: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
2ab0: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
2ac0: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
2ad0: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
2ae0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
2af0: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 20 4f 72 20  e.** iCur.   Or 
2b00: 69 66 20 70 49 64 78 21 3d 30 20 74 68 65 6e 20  if pIdx!=0 then 
2b10: 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  X is column iCol
2b20: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
2b30: 78 2e 20 20 70 49 64 78 0a 2a 2a 20 6d 75 73 74  x.  pIdx.** must
2b40: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   be one of the i
2b50: 6e 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20  ndexes of table 
2b60: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2b70: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
2b80: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
2b90: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
2ba0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
2bb0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
2bc0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
2bd0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
2be0: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
2bf0: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
2c00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
2c10: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
2c20: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
2c30: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
2c40: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
2c50: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
2c60: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
2c70: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
2c80: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
2c90: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
2ca0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
2cb0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
2cc0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
2cd0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2ce0: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
2cf0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2d00: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
2d10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
2d20: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
2d30: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
2d40: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
2d50: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
2d60: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
2d70: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
2d80: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2d90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2da0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
2db0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
2dc0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
2dd0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2de0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
2df0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
2e10: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
2e20: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e40: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
2e50: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
2e60: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2e70: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
2e80: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
2e90: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
2ea0: 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43    pScan->pOrigWC
2eb0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2ec0: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  >pWC = pWC;.  pS
2ed0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20  can->pIdxExpr = 
2ee0: 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  0;.  pScan->idxa
2ef0: 66 66 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d  ff = 0;.  pScan-
2f00: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a  >zCollName = 0;.
2f10: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
2f20: 20 20 69 6e 74 20 6a 20 3d 20 69 43 6f 6c 75 6d    int j = iColum
2f30: 6e 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  n;.    iColumn =
2f40: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
2f50: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  j];.    if( iCol
2f60: 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  umn==XN_EXPR ){.
2f70: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64        pScan->pId
2f80: 78 45 78 70 72 20 3d 20 70 49 64 78 2d 3e 61 43  xExpr = pIdx->aC
2f90: 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78  olExpr->a[j].pEx
2fa0: 70 72 3b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d  pr;.      pScan-
2fb0: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
2fc0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
2fd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
2fe0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c  umn==pIdx->pTabl
2ff0: 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  e->iPKey ){.    
3000: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52    iColumn = XN_R
3010: 4f 57 49 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20  OWID;.    }else 
3020: 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  if( iColumn>=0 )
3030: 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 69  {.      pScan->i
3040: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
3050: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
3060: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
3070: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
3080: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
3090: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20  oll[j];.    }.  
30a0: 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75 6d  }else if( iColum
30b0: 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  n==XN_EXPR ){.  
30c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
30d0: 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20    pScan->opMask 
30e0: 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61  = opMask;.  pSca
30f0: 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61  n->k = 0;.  pSca
3100: 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d 20 69 43  n->aiCur[0] = iC
3110: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43  ur;.  pScan->aiC
3120: 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43 6f 6c 75  olumn[0] = iColu
3130: 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71  mn;.  pScan->nEq
3140: 75 69 76 20 3d 20 31 3b 0a 20 20 70 53 63 61 6e  uiv = 1;.  pScan
3150: 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b 0a 20 20  ->iEquiv = 1;.  
3160: 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e  return whereScan
3170: 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a  Next(pScan);.}..
3180: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
3190: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
31a0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
31b0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
31c0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
31d0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
31e0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
31f0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
3200: 65 20 69 43 75 72 20 6f 72 20 6f 66 20 69 6e 64  e iCur or of ind
3210: 65 78 20 70 49 64 78 0a 2a 2a 20 69 66 20 70 49  ex pIdx.** if pI
3220: 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70 3e 20 69  dx!=0 and <op> i
3230: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 4f 5f  s one of the WO_
3240: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
3250: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 2a  s specified by.*
3260: 2a 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  * the op paramet
3270: 65 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  er.  Return a po
3280: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72  inter to the ter
3290: 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  m.  Return 0 if 
32a0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
32b0: 20 49 66 20 70 49 64 78 21 3d 30 20 74 68 65 6e   If pIdx!=0 then
32c0: 20 69 74 20 6d 75 73 74 20 62 65 20 6f 6e 65 20   it must be one 
32d0: 6f 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f  of the indexes o
32e0: 66 20 74 61 62 6c 65 20 69 43 75 72 2e 20 20 0a  f table iCur.  .
32f0: 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 65  ** Search for te
3300: 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 74 68 65  rms matching the
3310: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
3320: 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a 20 72 61  mn of pIdx.** ra
3330: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 69 43  ther than the iC
3340: 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
3350: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a  of table iCur..*
3360: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65  *.** The term re
3370: 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20  turned might by 
3380: 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72  Y=<expr> if ther
3390: 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e  e is another con
33a0: 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68  straint in.** th
33b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
33c0: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
33d0: 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63  at X=Y.  Any suc
33e0: 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  h constraints wi
33f0: 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66  ll be.** identif
3400: 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51  ied by the WO_EQ
3410: 55 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70  UIV bit in the p
3420: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
3430: 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61  field.  The.** a
3440: 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75 6d 6e 5b  iCur[]/iaColumn[
3450: 5d 20 61 72 72 61 79 73 20 68 6f 6c 64 20 58 20  ] arrays hold X 
3460: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
3470: 76 61 6c 65 6e 74 73 2e 20 54 68 65 72 65 20 61  valents. There a
3480: 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74 73 20 69  re 11.** slots i
3490: 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43 6f 6c 75  n aiCur[]/aiColu
34a0: 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20 6d 65 61  mn[] so that mea
34b0: 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66  ns we can look f
34c0: 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f 20  or X plus up to 
34d0: 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65 71 75 69  10.** other equi
34e0: 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 20 20  valent values.  
34f0: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
3500: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
3510: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 0a   <expr> if X=A1.
3520: 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64  ** and A1=A2 and
3530: 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e 2e 20 61   A2=A3 and ... a
3540: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
3550: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
3560: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
3570: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
3580: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3590: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
35a0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
35b0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
35c0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
35d0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
35e0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
35f0: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
3600: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
3610: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
3620: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
3630: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
3640: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
3650: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
3660: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
3670: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
3680: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
3690: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
36a0: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
36b0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
36c0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
36d0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
36e0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
36f0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
3700: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
3710: 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d  IV..*/.WhereTerm
3720: 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 46 69   *sqlite3WhereFi
3730: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
3740: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3750: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3760: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
3770: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
3780: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3790: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
37a0: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
37b0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
37c0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
37d0: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
37e0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
37f0: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
3800: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
3810: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
3820: 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u32 op,         
3830: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3840: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
3850: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
3860: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
3870: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
3880: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
3890: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
38a0: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
38b0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
38c0: 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a  m *pResult = 0;.
38d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a    WhereTerm *p;.
38e0: 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
38f0: 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53 63  ;..  p = whereSc
3900: 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 57  anInit(&scan, pW
3910: 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e  C, iCur, iColumn
3920: 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20 6f  , op, pIdx);.  o
3930: 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  p &= WO_EQ|WO_IS
3940: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
3950: 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
3960: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
3970: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
3980: 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67  if( p->prereqRig
3990: 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70  ht==0 && (p->eOp
39a0: 65 72 61 74 6f 72 26 6f 70 29 21 3d 30 20 29 7b  erator&op)!=0 ){
39b0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
39c0: 65 28 20 70 2d 3e 65 4f 70 65 72 61 74 6f 72 20  e( p->eOperator 
39d0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
39e0: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
39f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
3a00: 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73  Result==0 ) pRes
3a10: 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ult = p;.    }. 
3a20: 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e     p = whereScan
3a30: 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d  Next(&scan);.  }
3a40: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c  .  return pResul
3a50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
3a60: 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
3a70: 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 6e 20  es pList for an 
3a80: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
3a90: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
3aa0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
3ab0: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
3ac0: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
3ad0: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
3ae0: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
3af0: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
3b00: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
3b10: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
3b20: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
3b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
3b40: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
3b50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
3b80: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3b90: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
3ba0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
3bb0: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
3bc0: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
3bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3be0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
3bf0: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
3c00: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
3c10: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
3c20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3c30: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
3c40: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
3c50: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
3c80: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
3c90: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
3ca0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3cb0: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
3cc0: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
3cd0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
3ce0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
3cf0: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
3d00: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
3d10: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
3d20: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
3d30: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
3d40: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
3d50: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
3d60: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
3d70: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
3d80: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
3d90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
3da0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
3db0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
3dc0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
3dd0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
3de0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
3df0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
3e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3e10: 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn i;.      }.  
3e20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
3e30: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n -1;.}../*.** R
3e40: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
3e50: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
3e60: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 69   of index pIdx i
3e70: 73 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74  s NOT NULL.*/.st
3e80: 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f  atic int indexCo
3e90: 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65  lumnNotNull(Inde
3ea0: 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f  x *pIdx, int iCo
3eb0: 6c 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  l){.  int j;.  a
3ec0: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
3ed0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ;.  assert( iCol
3ee0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78  >=0 && iCol<pIdx
3ef0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a  ->nColumn );.  j
3f00: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
3f10: 6e 5b 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a  n[iCol];.  if( j
3f20: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >=0 ){.    retur
3f30: 6e 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  n pIdx->pTable->
3f40: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b  aCol[j].notNull;
3f50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d  .  }else if( j==
3f60: 28 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (-1) ){.    retu
3f70: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 1;.  }else{. 
3f80: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d     assert( j==(-
3f90: 32 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  2) );.    return
3fa0: 20 30 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61   0;  /* Assume a
3fb0: 6e 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73  n indexed expres
3fc0: 73 69 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20  sion can always 
3fd0: 79 69 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a  yield a NULL */.
3fe0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
3ff0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
4000: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
4010: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
4020: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
4030: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
4040: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
4050: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
4060: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e   redundant if an
4070: 79 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20  y subset of the 
4080: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a  columns in the.*
4090: 2a 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20  * DISTINCT list 
40a0: 61 72 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79  are collectively
40b0: 20 75 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69   unique and indi
40c0: 76 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c  vidually non-nul
40d0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
40e0: 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
40f0: 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  dant(.  Parse *p
4100: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4110: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
4120: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
4130: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
4140: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
4150: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4160: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4170: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
4180: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
4190: 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
41a0: 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct       /* The 
41b0: 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20  result set that 
41c0: 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54  needs to be DIST
41d0: 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  INCT */.){.  Tab
41e0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
41f0: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
4200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4210: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
4220: 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49  t iBase;..  /* I
4230: 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
4240: 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f  than one table o
4250: 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20  r sub-select in 
4260: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
4270: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65  of.  ** this que
4280: 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ry, then it will
4290: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
42a0: 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
42b0: 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a  e DISTINCT .  **
42c0: 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e   clause is redun
42d0: 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  dant. */.  if( p
42e0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31  TabList->nSrc!=1
42f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4300: 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Base = pTabList-
4310: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
4320: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
4330: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
4340: 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
4350: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
4360: 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e  an IPK column on
4370: 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68   table iBase, th
4380: 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20  en return .  ** 
4390: 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20  true. Note: The 
43a0: 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73  (p->iTable==iBas
43b0: 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  e) part of this 
43c0: 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73  test may be fals
43d0: 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  e if the.  ** cu
43e0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20  rrent SELECT is 
43f0: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
4400: 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
4410: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
4420: 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
4430: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
4440: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
4450: 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74  ollate(pDistinct
4460: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
4470: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
4480: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
4490: 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70  able==iBase && p
44a0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
44b0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
44c0: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
44d0: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  ll indices on th
44e0: 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e  e table, checkin
44f0: 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66  g each to see if
4500: 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74   it makes.  ** t
4510: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
4520: 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e  ifier redundant.
4530: 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a   It does so if:.
4540: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
4550: 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65  he index is itse
4560: 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20  lf UNIQUE, and. 
4570: 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c   **.  **   2. Al
4580: 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l of the columns
4590: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
45a0: 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66  e either part of
45b0: 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20   the pDistinct. 
45c0: 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f   **      list, o
45d0: 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45  r else the WHERE
45e0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
45f0: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
4600: 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a  orm "col=X",.  *
4610: 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69  *      where X i
4620: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  s a constant val
4630: 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  ue. The collatio
4640: 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  n sequences of t
4650: 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d  he.  **      com
4660: 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65  parison and sele
4670: 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69  ct-list expressi
4680: 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74  ons must match t
4690: 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65  hose of the inde
46a0: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33  x..  **.  **   3
46b0: 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69  . All of those i
46c0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  ndex columns for
46d0: 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
46e0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
46f0: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  .  **      conta
4700: 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72  in a "col=X" ter
4710: 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f  m are subject to
4720: 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
4730: 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
4740: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
4750: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
4760: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
4770: 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65     if( !IsUnique
4780: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
4790: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
47a0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
47b0: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
47c0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
47d0: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
47e0: 43 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42  C, iBase, i, ~(B
47f0: 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
4800: 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
4810: 20 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43    if( findIndexC
4820: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
4830: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
4840: 78 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b  x, i)<0 ) break;
4850: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64  .        if( ind
4860: 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
4870: 70 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72  pIdx, i)==0 ) br
4880: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4890: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49   }.    if( i==pI
48a0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  dx->nKeyCol ){. 
48b0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
48c0: 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  ex implies that 
48d0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
48e0: 6c 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64  lifier is redund
48f0: 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ant. */.      re
4900: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
4910: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
4920: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  .../*.** Estimat
4930: 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20  e the logarithm 
4940: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
4950: 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f  ue to base 2..*/
4960: 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65  .static LogEst e
4970: 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b  stLog(LogEst N){
4980: 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20  .  return N<=10 
4990: 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67  ? 0 : sqlite3Log
49a0: 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a  Est(N) - 33;.}..
49b0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50  /*.** Convert OP
49c0: 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20  _Column opcodes 
49d0: 74 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72  to OP_Copy in pr
49e0: 65 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74  eviously generat
49f0: 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed code..**.** T
4a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
4a10: 20 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20   over generated 
4a20: 56 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72  VDBE code and tr
4a30: 61 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75  anslates OP_Colu
4a40: 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e  mn.** opcodes in
4a50: 74 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20  to OP_Copy when 
4a60: 74 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69  the table is bei
4a70: 6e 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20  ng accessed via 
4a80: 63 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69  co-routine .** i
4a90: 6e 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61  nstead of via ta
4aa0: 62 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a  ble lookup..**.*
4ab0: 2a 20 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f  * If the bIncrRo
4ac0: 77 69 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  wid parameter is
4ad0: 20 30 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f   0, then any OP_
4ae0: 52 6f 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f  Rowid instructio
4af0: 6e 73 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20  ns on.** cursor 
4b00: 69 54 61 62 43 75 72 20 61 72 65 20 74 72 61 6e  iTabCur are tran
4b10: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f  sformed into OP_
4b20: 4e 75 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e  Null. Or, if bIn
4b30: 63 72 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  crRowid is non-z
4b40: 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63  ero,.** then eac
4b50: 68 20 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72  h OP_Rowid is tr
4b60: 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61  ansformed into a
4b70: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
4b80: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a   increment the.*
4b90: 2a 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  * value stored i
4ba0: 6e 20 69 74 73 20 6f 75 74 70 75 74 20 72 65 67  n its output reg
4bb0: 69 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ister..*/.static
4bc0: 20 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43   void translateC
4bd0: 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 50  olumnToCopy(.  P
4be0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4bf0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
4c00: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
4c10: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4c20: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4c30: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4c40: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4c50: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4c60: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4c70: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4c80: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4c90: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4ca0: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4cb0: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
4cc0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
4cd0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
4ce0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
4cf0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
4d00: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
4d10: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4d20: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
4d30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4d40: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71  VdbeOp *pOp = sq
4d50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
4d60: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74  , iStart);.  int
4d70: 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
4d80: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4d90: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
4da0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4db0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  d ) return;.  fo
4dc0: 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b  r(; iStart<iEnd;
4dd0: 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b   iStart++, pOp++
4de0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ){.    if( pOp->
4df0: 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f  p1!=iTabCur ) co
4e00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
4e10: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4e20: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
4e30: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
4e40: 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70  _Copy;.      pOp
4e50: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b  ->p1 = pOp->p2 +
4e60: 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20   iRegister;.    
4e70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d    pOp->p2 = pOp-
4e80: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  >p3;.      pOp->
4e90: 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  p3 = 0;.    }els
4ea0: 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
4eb0: 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
4ec0: 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f       if( bIncrRo
4ed0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
4ee0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
4ef0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
4f00: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
4f10: 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20  f the OP_Rowid. 
4f20: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  */.        pOp->
4f30: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49  opcode = OP_AddI
4f40: 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  mm;.        pOp-
4f50: 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  >p1 = pOp->p2;. 
4f60: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
4f70: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
4f80: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4f90: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
4fa0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
4fb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 0;.        pOp
4fc0: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->p3 = 0;.      
4fd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
4fe0: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
4ff0: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
5000: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
5010: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
5020: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
5030: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
5040: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
5050: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
5060: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
5070: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
5080: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
5090: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
50a0: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
50b0: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
50c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
50d0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
50e0: 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
50f0: 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74  CE_ENABLED).stat
5100: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
5110: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
5120: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
5130: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5140: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
5150: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5160: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5170: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
5180: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5190: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
51a0: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
51b0: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
51c0: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
51d0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
51e0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
51f0: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
5200: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
5210: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
5220: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
5230: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
5240: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
5250: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
5260: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
5270: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
5280: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
5290: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
52a0: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
52b0: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
52c0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
52d0: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
52e0: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
52f0: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
5300: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
5310: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
5320: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
5330: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
5340: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5350: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
5360: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5370: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5380: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
5390: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
53a0: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
53b0: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
53c0: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
53d0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
53e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
53f0: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
5400: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
5410: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
5420: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
5430: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
5440: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
5450: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
5460: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5470: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
5480: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
5490: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
54a0: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
54b0: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
54c0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
54d0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
54e0: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
54f0: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
5500: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
5510: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5520: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
5530: 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70  dRows=%lld\n", p
5540: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
5550: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
5560: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
5570: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
5580: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
5590: 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
55a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
55b0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
55c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
55d0: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
55e0: 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
55f0: 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
5600: 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
5610: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
5620: 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
5630: 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
5640: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
5650: 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
5660: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
5670: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
5680: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5690: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
56a0: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
56b0: 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
56c0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
56d0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
56e0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
56f0: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
5700: 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
5710: 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
5720: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
5730: 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
5740: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
5750: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
5760: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
5770: 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
5780: 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
5790: 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
57a0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
57b0: 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20  EQ|WO_IS))==0 ) 
57c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
57d0: 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
57e0: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 20 0a 20  pe & JT_LEFT) . 
57f0: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
5800: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
5810: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5820: 0a 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65  .   && (pTerm->e
5830: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
5840: 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  ).  ){.    /* Ca
5850: 6e 6e 6f 74 20 75 73 65 20 61 6e 20 49 53 20 74  nnot use an IS t
5860: 65 72 6d 20 66 72 6f 6d 20 74 68 65 20 57 48 45  erm from the WHE
5870: 52 45 20 63 6c 61 75 73 65 20 61 73 20 61 6e 20  RE clause as an 
5880: 69 6e 64 65 78 20 64 72 69 76 65 72 20 66 6f 72  index driver for
5890: 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20  .    ** the RHS 
58a0: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
58b0: 53 75 63 68 20 61 20 74 65 72 6d 20 63 61 6e 20  Such a term can 
58c0: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
58d0: 69 74 20 69 73 20 66 72 6f 6d 0a 20 20 20 20 2a  it is from.    *
58e0: 2a 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  * the ON clause.
58f0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
5900: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 54  0;.  }.  if( (pT
5910: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
5920: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
5930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
5940: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
5950: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
5960: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
5970: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
5980: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
5990: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
59a0: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
59b0: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
59c0: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
59d0: 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63  eturn 0;.  testc
59e0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
59f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
5a00: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
5a10: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
5a20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
5a30: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
5a40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5a50: 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
5a60: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  Index object for
5a70: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
5a80: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65  dex.** and to se
5a90: 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65  t up the WhereLe
5aa0: 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65  vel object pLeve
5ab0: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  l so that the co
5ac0: 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
5ad0: 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65  makes use of the
5ae0: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
5af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5b00: 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
5b10: 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ticIndex(.  Pars
5b20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5b40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
5b50: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
5b60: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
5b70: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
5b80: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
5b90: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
5ba0: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
5bb0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
5bc0: 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64  get the next ind
5bd0: 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
5be0: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
5bf0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
5c00: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
5c10: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
5c20: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
5c30: 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f  Level          /
5c40: 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65  * Write new inde
5c50: 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  x here */.){.  i
5c60: 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  nt nKeyCol;     
5c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5c80: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
5c90: 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  in the construct
5ca0: 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  ed index */.  Wh
5cb0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
5cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
5cd0: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
5ce0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
5cf0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
5d00: 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  WCEnd;          
5d10: 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
5d20: 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  [] */.  Index *p
5d30: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
5d40: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65      /* Object de
5d50: 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61  scribing the tra
5d60: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a  nsient index */.
5d70: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d90: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
5da0: 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
5db0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
5dc0: 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20  addrInit;       
5dd0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
5de0: 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  ss of the initia
5df0: 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20  lization bypass 
5e00: 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20  jump */.  Table 
5e10: 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
5e20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
5e30: 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
5e40: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
5e50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
5e60: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
5e70: 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20  index fill loop 
5e80: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
5e90: 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
5ea0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
5eb0: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65  ding an index re
5ec0: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
5ef0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5f00: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
5f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
5f20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5f30: 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20  t mxBitCol;     
5f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
5f50: 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  imum column in p
5f60: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a  Src->colUsed */.
5f70: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
5f80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5f90: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
5fa0: 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
5fb0: 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  mn */.  WhereLoo
5fc0: 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
5fd0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20      /* The Loop 
5fe0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
5ff0: 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20   *zNotUsed;     
6000: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
6010: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e   space on the en
6020: 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42  d of pIdx */.  B
6030: 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20  itmask idxCols; 
6040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6050: 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tmap of columns 
6060: 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e  used for indexin
6070: 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  g */.  Bitmask e
6080: 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20  xtraCols;       
6090: 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
60a0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
60b0: 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57  ns */.  u8 sentW
60c0: 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20  arning = 0;     
60d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
60e0: 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65   warnning has be
60f0: 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45  en issued */.  E
6100: 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20  xpr *pPartial = 
6110: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  0;         /* Pa
6120: 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72  rtial Index Expr
6130: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
6140: 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20  iContinue = 0;  
6150: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
6160: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63  here to skip exc
6170: 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20  luded rows */.  
6180: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
6190: 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
61a0: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
61b0: 65 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65  erm being indexe
61c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  d */.  int addrC
61d0: 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20  ounter = 0;     
61e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68     /* Address wh
61f0: 65 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e  ere integer coun
6200: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
6210: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  ed */.  int regB
6220: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
6230: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
6240: 72 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20  registers where 
6250: 72 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62  record is assemb
6260: 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  led */..  /* Gen
6270: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
6280: 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
6290: 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
62a0: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
62b0: 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
62c0: 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
62d0: 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
62e0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
62f0: 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
6300: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
6310: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
6320: 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
6330: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6340: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
6350: 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43  rage(v);..  /* C
6360: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
6370: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
6380: 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
6390: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
63a0: 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
63b0: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
63c0: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
63d0: 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  nKeyCol = 0;.  p
63e0: 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
63f0: 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
6400: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
6410: 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
6420: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
6430: 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
6440: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
6450: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
6460: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
6470: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
6480: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
6490: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
64a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
64b0: 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20  FromJoin)    /* 
64c0: 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f  prereq always no
64d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n-zero */.      
64e0: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69     || pExpr->iRi
64f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53  ghtJoinTable!=pS
6500: 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a  rc->iCursor   /*
6510: 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68 74     for the right
6520: 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20  -hand   */.     
6530: 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72      || pLoop->pr
6540: 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20  ereq!=0 );      
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6560: 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  *   table of a L
6570: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20  EFT JOIN */.    
6580: 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  if( pLoop->prere
6590: 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  q==0.     && (pT
65a0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
65b0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a  ERM_VIRTUAL)==0.
65c0: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
65d0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
65e0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
65f0: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
6600: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
6610: 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75  pExpr, pSrc->iCu
6620: 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70  rsor) ){.      p
6630: 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65  Partial = sqlite
6640: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
6650: 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20  >db, pPartial,. 
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6680: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
6690: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
66a0: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
66b0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
66c0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
66d0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
66e0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
66f0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
6700: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
6710: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6720: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6730: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
6740: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
6750: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
6760: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
6770: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
6780: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73   );.      if( !s
6790: 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20  entWarning ){.  
67a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
67b0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
67c0: 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20  _AUTOINDEX,.    
67d0: 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74          "automat
67e0: 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25  ic index on %s(%
67f0: 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  s)", pTable->zNa
6800: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
6810: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
6820: 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l].zName);.     
6830: 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d     sentWarning =
6840: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6850: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
6860: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
6870: 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
6880: 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
6890: 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65  ->db, pLoop, nKe
68a0: 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20  yCol+1) ){.     
68b0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75       goto end_au
68c0: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
68d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
68e0: 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
68f0: 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54  [nKeyCol++] = pT
6900: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78  erm;.        idx
6910: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
6920: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6930: 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43  .  assert( nKeyC
6940: 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d  ol>0 );.  pLoop-
6950: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70  >u.btree.nEq = p
6960: 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e  Loop->nLTerm = n
6970: 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d  KeyCol;.  pLoop-
6980: 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
6990: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
69a0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
69b0: 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20  ERE_INDEXED.    
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   | WHERE_AUTO_IN
69e0: 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  DEX;..  /* Count
69f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
6a00: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
6a10: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61  s needed to crea
6a20: 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69  te a.  ** coveri
6a30: 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f  ng index.  A "co
6a40: 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73  vering index" is
6a50: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
6a60: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a  ontains all.  **
6a70: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
6a80: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
6a90: 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63  query.  With a c
6aa0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
6ab0: 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
6ac0: 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65   table never nee
6ad0: 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  ds to be accesse
6ae0: 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e  d.  Automatic in
6af0: 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  dices must.  ** 
6b00: 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  be a covering in
6b10: 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20  dex because the 
6b20: 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
6b30: 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65  e updated if the
6b40: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
6b50: 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64  able changes and
6b60: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
6b70: 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68  able cannot both
6b80: 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66   be used.  ** if
6b90: 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20   they go out of 
6ba0: 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74  sync..  */.  ext
6bb0: 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63  raCols = pSrc->c
6bc0: 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f  olUsed & (~idxCo
6bd0: 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53  ls | MASKBIT(BMS
6be0: 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  -1));.  mxBitCol
6bf0: 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61   = MIN(BMS-1,pTa
6c00: 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65  ble->nCol);.  te
6c10: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
6c20: 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
6c30: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
6c40: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
6c50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
6c60: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
6c70: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
6c80: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20   & MASKBIT(i) ) 
6c90: 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  nKeyCol++;.  }. 
6ca0: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
6cb0: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
6cc0: 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43  -1) ){.    nKeyC
6cd0: 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  ol += pTable->nC
6ce0: 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
6cf0: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
6d00: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
6d10: 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ct to describe t
6d20: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  his index */.  p
6d30: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  Idx = sqlite3All
6d40: 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
6d50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
6d60: 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74  yCol+1, 0, &zNot
6d70: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64  Used);.  if( pId
6d80: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f  x==0 ) goto end_
6d90: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
6da0: 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  e;.  pLoop->u.bt
6db0: 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
6dc0: 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  x;.  pIdx->zName
6dd0: 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
6de0: 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
6df0: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
6e00: 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
6e10: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
6e20: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
6e30: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
6e40: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
6e50: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
6e60: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
6e70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
6e80: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
6e90: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
6ea0: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
6eb0: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
6ec0: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
6ed0: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
6ee0: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
6ef0: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
6f00: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
6f10: 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
6f20: 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
6f30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6f40: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
6f50: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
6f60: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
6f70: 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
6f80: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
6f90: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
6fa0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
6fb0: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
6fc0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
6fd0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
6fe0: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
6ff0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
7000: 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20  Coll[n] = pColl 
7010: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
7020: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
7030: 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  Y;.        n++;.
7040: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7050: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32  }.  assert( (u32
7060: 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  )n==pLoop->u.btr
7070: 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  ee.nEq );..  /* 
7080: 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  Add additional c
7090: 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
70a0: 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61   make the automa
70b0: 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20  tic index into. 
70c0: 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69   ** a covering i
70d0: 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ndex */.  for(i=
70e0: 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
70f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
7100: 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54  raCols & MASKBIT
7110: 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  (i) ){.      pId
7120: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
7130: 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
7140: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69  azColl[n] = sqli
7150: 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
7160: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
7170: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
7180: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
7190: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
71a0: 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
71b0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
71c0: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
71d0: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
71e0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
71f0: 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[n] = sqlite3St
7200: 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e  rBINARY;.      n
7210: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
7220: 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43  assert( n==nKeyC
7230: 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69  ol );.  pIdx->ai
7240: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52  Column[n] = XN_R
7250: 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  OWID;.  pIdx->az
7260: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
7270: 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f  3StrBINARY;..  /
7280: 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
7290: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
72a0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
72b0: 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
72c0: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
72d0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
72e0: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
72f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
7300: 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
7310: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
7320: 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
7330: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
7340: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
7350: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
7360: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
7370: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
7380: 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
7390: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
73a0: 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
73b0: 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43   pTabItem = &pWC
73c0: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ->pWInfo->pTabLi
73d0: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
73e0: 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62  rom];.  if( pTab
73f0: 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
7400: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
7410: 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
7420: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
7430: 0a 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72  .    addrCounter
7440: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7450: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7460: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  er, 0, 0);.    s
7470: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7480: 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
7490: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
74a0: 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  0, pTabItem->add
74b0: 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61  rFillSub);.    a
74c0: 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65  ddrTop =  sqlite
74d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
74e0: 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
74f0: 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  d);.    VdbeCove
7500: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
7510: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
7520: 78 74 20 72 6f 77 20 6f 66 20 25 73 22 2c 20 70  xt row of %s", p
7530: 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
7540: 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Name));.  }else{
7550: 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73  .    addrTop = s
7560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
7570: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
7580: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
7590: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
75a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
75b0: 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e  tial ){.    iCon
75c0: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
75d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
75e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
75f0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
7600: 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69  pPartial, iConti
7610: 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  nue, SQLITE_JUMP
7620: 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f  IFNULL);.    pLo
7630: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
7640: 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58 3b  HERE_PARTIALIDX;
7650: 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f 72 64  .  }.  regRecord
7660: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7670: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7680: 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
7690: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
76a0: 79 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2c  y(.      pParse,
76b0: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
76c0: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
76d0: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a 20 20  d, 0, 0, 0, 0.  
76e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
76f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
7700: 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e  Insert, pLevel->
7710: 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f  iIdxCur, regReco
7720: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
7730: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7740: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
7750: 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72 74  LT);.  if( pPart
7760: 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62  ial ) sqlite3Vdb
7770: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
7780: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69   iContinue);.  i
7790: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
77a0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
77b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
77c0: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 43  hangeP2(v, addrC
77d0: 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73 65 2b  ounter, regBase+
77e0: 6e 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  n);.    testcase
77f0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
7800: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
7810: 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d    translateColum
7820: 6e 54 6f 43 6f 70 79 28 70 50 61 72 73 65 2c 20  nToCopy(pParse, 
7830: 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d  addrTop, pLevel-
7840: 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20  >iTabCur,.      
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65      pTabItem->re
7870: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
7880: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
7890: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
78a0: 20 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76    pTabItem->fg.v
78b0: 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b  iaCoroutine = 0;
78c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
78d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
78e0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76  v, OP_Next, pLev
78f0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64  el->iTabCur, add
7900: 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76  rTop+1); VdbeCov
7910: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
7920: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7930: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54  eP5(v, SQLITE_ST
7940: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
7950: 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EX);.  sqlite3Vd
7960: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
7970: 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
7980: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
7990: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
79a0: 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  d);.  .  /* Jump
79b0: 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
79c0: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
79d0: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
79e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
79f0: 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65  v, addrInit);..e
7a00: 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
7a10: 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33 45  eate:.  sqlite3E
7a20: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
7a30: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29 3b  ->db, pPartial);
7a40: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7a50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
7a60: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
7a70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7a80: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
7a90: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
7aa0: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
7ab0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7ac0: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
7ad0: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
7ae0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
7af0: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
7b00: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
7b10: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
7b20: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
7b30: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
7b40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
7b50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
7b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
7b70: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
7b80: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
7b90: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7ba0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7bb0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
7bc0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7bd0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
7be0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7bf0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
7c00: 75 73 65 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  use being analyz
7c10: 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
7c20: 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20 20 20 20  mUnusable,      
7c30: 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
7c40: 65 20 74 65 72 6d 73 20 77 69 74 68 20 74 68 65  e terms with the
7c50: 73 65 20 70 72 65 72 65 71 73 20 2a 2f 0a 20 20  se prereqs */.  
7c60: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
7c70: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
7c80: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
7c90: 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
7ca0: 74 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 45 78  the vtab */.  Ex
7cb0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
7cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7cd0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
7ce0: 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 2a 70  ause */.  u16 *p
7cf0: 6d 4e 6f 4f 6d 69 74 20 20 20 20 20 20 20 20 20  mNoOmit         
7d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
7d10: 6b 20 6f 66 20 74 65 72 6d 73 20 6e 6f 74 20 74  k of terms not t
7d20: 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  o omit */.){.  i
7d30: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
7d40: 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73  Term;.  struct s
7d50: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
7d60: 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
7d70: 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
7d80: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
7d90: 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a  y *pIdxOrderBy;.
7da0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
7db0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7dc0: 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
7dd0: 0a 20 20 73 74 72 75 63 74 20 48 69 64 64 65 6e  .  struct Hidden
7de0: 49 6e 64 65 78 49 6e 66 6f 20 2a 70 48 69 64 64  IndexInfo *pHidd
7df0: 65 6e 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  en;.  WhereTerm 
7e00: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
7e10: 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
7e20: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
7e30: 64 78 49 6e 66 6f 3b 0a 20 20 75 31 36 20 6d 4e  dxInfo;.  u16 mN
7e40: 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  oOmit = 0;..  /*
7e50: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
7e60: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
7e70: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
7e80: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
7e90: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
7ea0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
7eb0: 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
7ec0: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
7ed0: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
7ee0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
7ef0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
7f00: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
7f10: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
7f20: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7f30: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
7f40: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
7f50: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7f60: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
7f70: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7f80: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
7f90: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7fa0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7fb0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
7fc0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7fd0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
7fe0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
7ff0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
8000: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
8010: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8020: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8030: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
8040: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8050: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55  rator & ~(WO_EQU
8060: 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IV))==0 ) contin
8070: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
8080: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8090: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
80a0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
80b0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
80c0: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
80d0: 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
80e0: 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
80f0: 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
8100: 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
8110: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
8120: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
8130: 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
8140: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
8150: 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
8160: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
8170: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
8180: 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
8190: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
81a0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
81b0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
81c0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
81d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
81e0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
81f0: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
8200: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
8210: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
8220: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
8230: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
8240: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
8250: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8260: 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
8270: 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
8280: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
8290: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
82a0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
82b0: 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
82c0: 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
82d0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
82e0: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
82f0: 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
8320: 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
8330: 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
8340: 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
8370: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
8380: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48 69 64 64   + sizeof(*pHidd
8390: 65 6e 29 20 29 3b 0a 20 20 69 66 28 20 70 49 64  en) );.  if( pId
83a0: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
83b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
83c0: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
83d0: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65  memory");.    re
83e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
83f0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
8400: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
8410: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
8420: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
8430: 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
8440: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
8450: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
8460: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
8470: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
8480: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
8490: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
84a0: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
84b0: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
84c0: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
84d0: 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
84e0: 2f 0a 20 20 70 48 69 64 64 65 6e 20 3d 20 28 73  /.  pHidden = (s
84f0: 74 72 75 63 74 20 48 69 64 64 65 6e 49 6e 64 65  truct HiddenInde
8500: 78 49 6e 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f  xInfo*)&pIdxInfo
8510: 5b 31 5d 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20  [1];.  pIdxCons 
8520: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
8530: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
8540: 6e 74 2a 29 26 70 48 69 64 64 65 6e 5b 31 5d 3b  nt*)&pHidden[1];
8550: 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d  .  pIdxOrderBy =
8560: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
8570: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
8580: 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
8590: 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74  ;.  pUsage = (st
85a0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
85b0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
85c0: 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
85d0: 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a  y[nOrderBy];.  *
85e0: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
85f0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
8600: 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  Term;.  *(int*)&
8610: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
8620: 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
8630: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
8640: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
8650: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
8660: 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
8670: 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75  dxCons;.  *(stru
8680: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
8690: 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
86a0: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
86b0: 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
86c0: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
86d0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
86e0: 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
86f0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
8700: 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
8750: 65 3b 0a 0a 20 20 70 48 69 64 64 65 6e 2d 3e 70  e;..  pHidden->p
8760: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 48 69 64  WC = pWC;.  pHid
8770: 64 65 6e 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  den->pParse = pP
8780: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  arse;.  for(i=j=
8790: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
87a0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
87b0: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
87c0: 20 20 75 31 36 20 6f 70 3b 0a 20 20 20 20 69 66    u16 op;.    if
87d0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
87e0: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
87f0: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
8800: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
8810: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
8820: 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  nusable ) contin
8830: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
8840: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
8850: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8860: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
8870: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
8880: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8890: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
88a0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
88b0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
88c0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
88d0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
88e0: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
88f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
8900: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8910: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
8920: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
8930: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55 49  ator & ~(WO_EQUI
8940: 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  V))==0 ) continu
8950: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
8960: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8970: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
8980: 65 3b 0a 20 20 20 20 69 66 28 20 28 70 53 72 63  e;.    if( (pSrc
8990: 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
89a0: 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20  JT_LEFT)!=0.    
89b0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
89c0: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
89d0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
89e0: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
89f0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
8a00: 49 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 0a 20  IS|WO_ISNULL)). 
8a10: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41     ){.      /* A
8a20: 6e 20 22 49 53 22 20 74 65 72 6d 20 69 6e 20 74  n "IS" term in t
8a30: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
8a40: 77 68 65 72 65 20 74 68 65 20 76 69 72 74 75 61  where the virtua
8a50: 6c 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72  l table is the r
8a60: 68 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  hs.      ** of a
8a70: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 44 6f 20 6e   LEFT JOIN. Do n
8a80: 6f 74 20 70 61 73 73 20 74 68 69 73 20 74 65 72  ot pass this ter
8a90: 6d 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  m to the virtual
8aa0: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
8ab0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
8ac0: 61 73 20 74 68 69 73 20 63 61 6e 20 6c 65 61 64  as this can lead
8ad0: 20 74 6f 20 69 6e 63 6f 72 72 65 63 74 20 72 65   to incorrect re
8ae0: 73 75 6c 74 73 20 66 72 6f 6d 20 53 51 4c 20 73  sults from SQL s
8af0: 75 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 73 3a  uch.      ** as:
8b00: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
8b10: 2a 2a 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20  **   "LEFT JOIN 
8b20: 76 74 61 62 20 57 48 45 52 45 20 76 74 61 62 2e  vtab WHERE vtab.
8b30: 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 20 2a 2f  col IS NULL"  */
8b40: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8b50: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8b60: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
8b70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8b80: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8b90: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
8ba0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8bb0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
8bc0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
8bd0: 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  mn>=(-1) );.    
8be0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
8bf0: 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
8c00: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
8c10: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
8c20: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
8c30: 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65  op = pTerm->eOpe
8c40: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
8c50: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
8c60: 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
8c70: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 41      if( op==WO_A
8c80: 55 58 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  UX ){.      pIdx
8c90: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65  Cons[j].op = pTe
8ca0: 72 6d 2d 3e 65 4d 61 74 63 68 4f 70 3b 0a 20 20  rm->eMatchOp;.  
8cb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 20 26    }else if( op &
8cc0: 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
8cd0: 53 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  S) ){.      if( 
8ce0: 6f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  op==WO_ISNULL ){
8cf0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e  .        pIdxCon
8d00: 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c 49 54 45  s[j].op = SQLITE
8d10: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8d20: 54 5f 49 53 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  T_ISNULL;.      
8d30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
8d40: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
8d50: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8d60: 53 54 52 41 49 4e 54 5f 49 53 3b 0a 20 20 20 20  STRAINT_IS;.    
8d70: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
8d80: 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d       pIdxCons[j]
8d90: 2e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  .op = (u8)op;.  
8da0: 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
8db0: 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20  t assignment in 
8dc0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e  the previous lin
8dd0: 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e  e is possible on
8de0: 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ly because.     
8df0: 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
8e00: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8e10: 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
8e20: 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
8e30: 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  he.      ** foll
8e40: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
8e50: 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
8e60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
8e70: 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
8e80: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8e90: 45 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EQ );.      asse
8ea0: 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54  rt( WO_LT==SQLIT
8eb0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8ec0: 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 61  NT_LT );.      a
8ed0: 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
8ee0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8ef0: 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
8f00: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d    assert( WO_GT=
8f10: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
8f20: 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20  NSTRAINT_GT );. 
8f30: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
8f40: 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
8f50: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
8f60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8f70: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8f80: 26 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f  &(WO_IN|WO_EQ|WO
8f90: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
8fa0: 57 4f 5f 47 45 7c 57 4f 5f 41 55 58 29 20 29 3b  WO_GE|WO_AUX) );
8fb0: 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 26  ..      if( op &
8fc0: 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f   (WO_LT|WO_LE|WO
8fd0: 5f 47 54 7c 57 4f 5f 47 45 29 0a 20 20 20 20 20  _GT|WO_GE).     
8fe0: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
8ff0: 49 73 56 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e  IsVector(pTerm->
9000: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20 0a  pExpr->pRight) .
9010: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
9020: 20 69 66 28 20 69 3c 31 36 20 29 20 6d 4e 6f 4f   if( i<16 ) mNoO
9030: 6d 69 74 20 7c 3d 20 28 31 20 3c 3c 20 69 29 3b  mit |= (1 << i);
9040: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d  .        if( op=
9050: 3d 57 4f 5f 4c 54 20 29 20 70 49 64 78 43 6f 6e  =WO_LT ) pIdxCon
9060: 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 4c 45 3b  s[j].op = WO_LE;
9070: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d  .        if( op=
9080: 3d 57 4f 5f 47 54 20 29 20 70 49 64 78 43 6f 6e  =WO_GT ) pIdxCon
9090: 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 47 45 3b  s[j].op = WO_GE;
90a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
90b0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
90c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
90d0: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
90e0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
90f0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
9100: 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
9110: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
9120: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
9130: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
9140: 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
9150: 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
9160: 72 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f  r;.  }..  *pmNoO
9170: 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20  mit = mNoOmit;. 
9180: 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
9190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
91a0: 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
91b0: 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
91c0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
91d0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
91e0: 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
91f0: 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
9200: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
9210: 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
9220: 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
9230: 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
9240: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
9250: 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
9260: 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74  ndex_info object
9270: 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69   that.** comes i
9280: 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67  n as the 3rd arg
9290: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
92a0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
92b0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
92c0: 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
92d0: 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
92e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
92f0: 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  a.** non-zero va
9300: 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
9310: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
9320: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
9330: 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74  e output.** part
9340: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
9350: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
9360: 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70  ture is left pop
9370: 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  ulated..**.** Wh
9380: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
9390: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
93a0: 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
93b0: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
93c0: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
93d0: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
93e0: 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
93f0: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
9400: 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
9410: 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
9420: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
9430: 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
9440: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9450: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
9460: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
9470: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
9480: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
9490: 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
94a0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
94b0: 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  >pVtab;.  int rc
94c0: 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  ;..  TRACE_IDX_I
94d0: 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
94e0: 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
94f0: 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
9500: 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
9510: 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
9520: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9530: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
9540: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
9550: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9560: 4f 6f 6d 46 61 75 6c 74 28 70 50 61 72 73 65 2d  OomFault(pParse-
9570: 3e 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  >db);.    }else 
9580: 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
9590: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
95a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
95b0: 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
95c0: 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
95d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
95e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
95f0: 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
9600: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
9610: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9620: 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
9630: 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
9640: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  ->zErrMsg = 0;..
9650: 23 69 66 20 30 0a 20 20 2f 2a 20 54 68 69 73 20  #if 0.  /* This 
9660: 65 72 72 6f 72 20 69 73 20 6e 6f 77 20 63 61 75  error is now cau
9670: 67 68 74 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ght by the calle
9680: 72 2e 0a 20 20 2a 2a 20 53 65 61 72 63 68 20 66  r..  ** Search f
9690: 6f 72 20 22 78 42 65 73 74 49 6e 64 65 78 20 6d  or "xBestIndex m
96a0: 61 6c 66 75 6e 63 74 69 6f 6e 22 20 62 65 6c 6f  alfunction" belo
96b0: 77 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  w */.  for(i=0; 
96c0: 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
96d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
96e0: 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
96f0: 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
9700: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
9710: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
9720: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9730: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9740: 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
9750: 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
9760: 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
9770: 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
9780: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
9790: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
97a0: 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
97b0: 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rr;.}.#endif /* 
97c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
97d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
97e0: 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  E) */..#ifdef SQ
97f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
9800: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
9810: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f   Estimate the lo
9820: 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74  cation of a part
9830: 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67  icular key among
9840: 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a   all keys in an.
9850: 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65  ** index.  Store
9860: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
9870: 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73  aStat as follows
9880: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74  :.**.**    aStat
9890: 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [0]      Est. nu
98a0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73  mber of rows les
98b0: 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20  s than pRec.**  
98c0: 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20    aStat[1]      
98d0: 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
98e0: 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52 65  ows equal to pRe
98f0: 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  c.**.** Return t
9900: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
9910: 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 74  sample that is t
9920: 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70  he smallest samp
9930: 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67 72  le that.** is gr
9940: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
9950: 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74  ual to pRec. Not
9960: 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64 65  e that this inde
9970: 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65  x is not an inde
9980: 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 53  x.** into the aS
9990: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20  ample[] array - 
99a0: 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 69  it is an index i
99b0: 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73 65  nto a virtual se
99c0: 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20  t of samples.** 
99d0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
99e0: 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c 65  tents of aSample
99f0: 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  [] and the numbe
9a00: 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 72  r of fields in r
9a10: 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20  ecord .** pRec. 
9a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9a30: 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20  hereKeyStats(.  
9a40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9a60: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9a70: 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
9a80: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
9a90: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
9aa0: 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20  consider domain 
9ab0: 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  of */.  Unpacked
9ac0: 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20  Record *pRec,   
9ad0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66      /* Vector of
9ae0: 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69   values to consi
9af0: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75  der */.  int rou
9b00: 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20  ndUp,           
9b10: 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70       /* Round up
9b20: 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64   if true.  Round
9b30: 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a   down if false *
9b40: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74  /.  tRowcnt *aSt
9b50: 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  at              
9b60: 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72  /* OUT: stats wr
9b70: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
9b80: 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a  .  IndexSample *
9b90: 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  aSample = pIdx->
9ba0: 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69  aSample;.  int i
9bb0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
9bc0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9bd0: 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74  of required stat
9be0: 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e  s in anEq[] etc.
9bf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
9c20: 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52  rst sample >= pR
9c30: 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d  ec */.  int iSam
9c40: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ple;            
9c50: 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
9c60: 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68  sample larger th
9c70: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
9c80: 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69  Rec */.  int iMi
9c90: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
9ca0: 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74       /* Smallest
9cb0: 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20   sample not yet 
9cc0: 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
9cd0: 69 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  iTest;          
9ce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
9cf0: 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a  sample to test *
9d00: 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20  /.  int res;    
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d  /* Result of com
9d30: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
9d40: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c  n */.  int nFiel
9d50: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
9d60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9d70: 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20 2a  fields in pRec *
9d80: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77  /.  tRowcnt iLow
9d90: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
9da0: 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71  /* anLt[] + anEq
9db0: 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73 61  [] of largest sa
9dc0: 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20 2a  mple pRec is > *
9dd0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
9de0: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
9df0: 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72  _PARAMETER( pPar
9e00: 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  se );.#endif.  a
9e10: 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29  ssert( pRec!=0 )
9e20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
9e30: 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
9e40: 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e   assert( pRec->n
9e50: 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63 2d  Field>0 && pRec-
9e60: 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e  >nField<=pIdx->n
9e70: 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20  SampleCol );..  
9e80: 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20 73  /* Do a binary s
9e90: 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68  earch to find th
9ea0: 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 67  e first sample g
9eb0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
9ec0: 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65  qual.  ** to pRe
9ed0: 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61  c. If pRec conta
9ee0: 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69 65  ins a single fie
9ef0: 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20 73  ld, the set of s
9f00: 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63 68  amples to search
9f10: 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20  .  ** is simply 
9f20: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
9f30: 72 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d 70  ray. If the samp
9f40: 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d  les in aSample[]
9f50: 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20   contain more.  
9f60: 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c  ** than one fiel
9f70: 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 66  ds, all fields f
9f80: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72  ollowing the fir
9f90: 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  st are ignored..
9fa0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65    **.  ** If pRe
9fb0: 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65  c contains N fie
9fc0: 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20  lds, where N is 
9fd0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74  more than one, t
9fe0: 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20 74  hen as well as t
9ff0: 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20  he.  ** samples 
a000: 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72  in aSample[] (tr
a010: 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69 65  uncated to N fie
a020: 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72 63 68  lds), the search
a030: 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a   also has to.  *
a040: 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66 69  * consider prefi
a050: 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61 6d  xes of those sam
a060: 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ples. For exampl
a070: 65 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  e, if the set of
a080: 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e   samples.  ** in
a090: 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a   aSample is:.  *
a0a0: 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70  *.  **     aSamp
a0b0: 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a  le[0] = (a, 5) .
a0c0: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
a0d0: 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a 20  [1] = (a, 10) . 
a0e0: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
a0f0: 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a  2] = (b, 5) .  *
a100: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d  *     aSample[3]
a110: 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a   = (c, 100) .  *
a120: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d  *     aSample[4]
a130: 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a   = (c, 105).  **
a140: 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 73  .  ** Then the s
a150: 65 61 72 63 68 20 73 70 61 63 65 20 73 68 6f 75  earch space shou
a160: 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74 68  ld ideally be th
a170: 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65 20  e samples above 
a180: 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e  and the .  ** un
a190: 69 71 75 65 20 70 72 65 66 69 78 65 73 20 5b 61  ique prefixes [a
a1a0: 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20  ], [b] and [c]. 
a1b0: 42 75 74 20 73 69 6e 63 65 20 74 68 61 74 20 69  But since that i
a1c0: 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e 69  s hard to organi
a1d0: 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ze, .  ** the co
a1e0: 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61 72  de actually sear
a1f0: 63 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a 20  ches this set:. 
a200: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20   **.  **     0: 
a210: 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a  (a) .  **     1:
a220: 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (a, 5) .  **   
a230: 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20 20    2: (a, 10) .  
a240: 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31 30  **     3: (a, 10
a250: 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20 28  ) .  **     4: (
a260: 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20  b) .  **     5: 
a270: 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (b, 5) .  **    
a280: 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20 20   6: (c) .  **   
a290: 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a 20    7: (c, 100) . 
a2a0: 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20 31   **     8: (c, 1
a2b0: 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20  05).  **     9: 
a2c0: 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20  (c, 105).  **.  
a2d0: 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d 70  ** For each samp
a2e0: 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c  le in the aSampl
a2f0: 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61 6d  e[] array, N sam
a300: 70 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74  ples are present
a310: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66 66   in the.  ** eff
a320: 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61 72  ective sample ar
a330: 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f 76  ray. In the abov
a340: 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e 64  e, samples 0 and
a350: 20 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20   1 are based on 
a360: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61  .  ** sample aSa
a370: 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73  mple[0]. Samples
a380: 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d   2 and 3 on aSam
a390: 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a  ple[1] etc..  **
a3a0: 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d  .  ** Often, sam
a3b0: 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62 6c  ple i of each bl
a3c0: 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74 69  ock of N effecti
a3d0: 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20 28  ve samples has (
a3e0: 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a  i+1) fields..  *
a3f0: 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68 20 73  * Except, each s
a400: 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78 74  ample may be ext
a410: 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65 20  ended to ensure 
a420: 74 68 61 74 20 69 74 20 69 73 20 67 72 65 61 74  that it is great
a430: 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20  er than or.  ** 
a440: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72 65  equal to the pre
a450: 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e 20  vious sample in 
a460: 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20 65  the array. For e
a470: 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 61  xample, in the a
a480: 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70  bove, .  ** samp
a490: 6c 65 20 32 20 69 73 20 74 68 65 20 66 69 72 73  le 2 is the firs
a4a0: 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c  t sample of a bl
a4b0: 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73  ock of N samples
a4c0: 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20 69 74  , so at first it
a4d0: 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20 74   .  ** appears t
a4e0: 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65  hat it should be
a4f0: 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a 65   1 field in size
a500: 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  . However, that 
a510: 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20  would make it . 
a520: 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   ** smaller than
a530: 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68   sample 1, so th
a540: 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
a550: 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20  would not work. 
a560: 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20 20  As a result, .  
a570: 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64 65  ** it is extende
a580: 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e  d to two fields.
a590: 20 54 68 65 20 64 75 70 6c 69 63 61 74 65 73 20   The duplicates 
a5a0: 74 68 61 74 20 74 68 69 73 20 63 72 65 61 74 65  that this create
a5b0: 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63  s do not .  ** c
a5c0: 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
a5d0: 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64  s..  */.  nField
a5e0: 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b   = pRec->nField;
a5f0: 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  .  iCol = 0;.  i
a600: 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e  Sample = pIdx->n
a610: 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b  Sample * nField;
a620: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69  .  do{.    int i
a630: 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20  Samp;           
a640: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
a650: 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f  x in aSample[] o
a660: 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f  f test sample */
a670: 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  .    int n;     
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a6a0: 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20 73  fields in test s
a6b0: 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54  ample */..    iT
a6c0: 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d  est = (iMin+iSam
a6d0: 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d  ple)/2;.    iSam
a6e0: 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69 65  p = iTest / nFie
a6f0: 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61 6d  ld;.    if( iSam
a700: 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  p>0 ){.      /* 
a710: 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66 66  The proposed eff
a720: 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69 73  ective sample is
a730: 20 61 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d   a prefix of sam
a740: 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  ple aSample[iSam
a750: 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70 65  p]..      ** Spe
a760: 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 73  cifically, the s
a770: 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20 6f  hortest prefix o
a780: 66 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b 20  f at least (1 + 
a790: 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a 20  iTest%nField) . 
a7a0: 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20 74       ** fields t
a7b0: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
a7c0: 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  han the previous
a7d0: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
a7e0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  e.  */.      for
a7f0: 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69 65  (n=(iTest % nFie
a800: 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c  ld) + 1; n<nFiel
a810: 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; n++){.       
a820: 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53 61   if( aSample[iSa
a830: 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21  mp-1].anLt[n-1]!
a840: 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e  =aSample[iSamp].
a850: 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61  anLt[n-1] ) brea
a860: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
a870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
a880: 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d  iTest + 1;.    }
a890: 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65  ..    pRec->nFie
a8a0: 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20  ld = n;.    res 
a8b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
a8c0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
a8d0: 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61  le[iSamp].n, aSa
a8e0: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70  mple[iSamp].p, p
a8f0: 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65  Rec);.    if( re
a900: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f  s<0 ){.      iLo
a910: 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53  wer = aSample[iS
a920: 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b  amp].anLt[n-1] +
a930: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
a940: 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20  anEq[n-1];.     
a950: 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b   iMin = iTest+1;
a960: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
a970: 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c  es==0 && n<nFiel
a980: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  d ){.      iLowe
a990: 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  r = aSample[iSam
a9a0: 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20  p].anLt[n-1];.  
a9b0: 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74      iMin = iTest
a9c0: 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  +1;.      res = 
a9d0: 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
a9e0: 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 69       iSample = i
a9f0: 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c  Test;.      iCol
aa00: 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20   = n-1;.    }.  
aa10: 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20 69  }while( res && i
aa20: 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20  Min<iSample );. 
aa30: 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e   i = iSample / n
aa40: 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  Field;..#ifdef S
aa50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
aa60: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
aa70: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
aa80: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
aa90: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f  binary search co
aaa0: 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f  de.  ** above fo
aab0: 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61 6e  und the right an
aac0: 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b  swer. This block
aad0: 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f   serves no purpo
aae0: 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68  se other.  ** th
aaf0: 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  an to invoke the
ab00: 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20   asserts.  */.  
ab10: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
ab20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
ab30: 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  ){.    if( res==
ab40: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
ab50: 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75   (res==0) is tru
ab60: 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73  e, then pRec mus
ab70: 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73 61  t be equal to sa
ab80: 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20  mple i. */.     
ab90: 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d   assert( i<pIdx-
aba0: 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20  >nSample );.    
abb0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
abc0: 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20  nField-1 );.    
abd0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
abe0: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 61   nField;.      a
abf0: 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
ac00: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
ac10: 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
ac20: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
ac30: 52 65 63 29 20 0a 20 20 20 20 20 20 20 20 20 20  Rec) .          
ac40: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
ac50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20  mallocFailed .  
ac60: 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65      );.    }else
ac70: 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73  {.      /* Unles
ac80: 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  s i==pIdx->nSamp
ac90: 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  le, indicating t
aca0: 68 61 74 20 70 52 65 63 20 69 73 20 6c 61 72 67  hat pRec is larg
acb0: 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  er than.      **
acc0: 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20   all samples in 
acd0: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
ace0: 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20 62  ray, pRec must b
acf0: 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
ad00: 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43 6f  he.      ** (iCo
ad10: 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69  l+1) field prefi
ad20: 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20 20  x of sample i.  
ad30: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ad40: 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i<=pIdx->nSampl
ad50: 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20  e && i>=0 );.   
ad60: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
ad70: 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20  = iCol+1;.      
ad80: 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d  assert( i==pIdx-
ad90: 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20  >nSample .      
ada0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
adb0: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
adc0: 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
add0: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
ade0: 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20  c)>0.           
adf0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
ae00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
ae10: 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30        /* if i==0
ae20: 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68   and iCol==0, th
ae30: 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20 69  en record pRec i
ae40: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61  s smaller than a
ae50: 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20 20  ll samples.     
ae60: 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d 70   ** in the aSamp
ae70: 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65  le[] array. Othe
ae80: 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e  rwise, if (iCol>
ae90: 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73  0) then pRec mus
aea0: 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67 72  t.      ** be gr
aeb0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
aec0: 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f 6c  ual to the (iCol
aed0: 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f  ) field prefix o
aee0: 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20  f sample i..    
aef0: 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20 74    ** If (i>0), t
af00: 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61 6c  hen pRec must al
af10: 73 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68  so be greater th
af20: 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e  an sample (i-1).
af30: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
af40: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Col>0 ){.       
af50: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
af60: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  iCol;.        as
af70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
af80: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
af90: 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
afa0: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
afb0: 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  <=0.            
afc0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
afd0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
afe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
aff0: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( i>0 ){.       
b000: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
b010: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20  nField;.        
b020: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
b030: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
b040: 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c  (aSample[i-1].n,
b050: 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c   aSample[i-1].p,
b060: 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20   pRec)<0.       
b070: 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
b080: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
b090: 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d );.      }.   
b0a0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
b0b0: 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45   ifdef SQLITE_DE
b0c0: 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65  BUG */..  if( re
b0d0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52  s==0 ){.    /* R
b0e0: 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 65 71  ecord pRec is eq
b0f0: 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 20  ual to sample i 
b100: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
b110: 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b  Col==nField-1 );
b120: 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
b130: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
b140: 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74  iCol];.    aStat
b150: 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [1] = aSample[i]
b160: 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d  .anEq[iCol];.  }
b170: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20  else{.    /* At 
b180: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
b190: 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70  (iCol+1) field p
b1a0: 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c 65  refix of aSample
b1b0: 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74  [i] is the first
b1c0: 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20   .    ** sample 
b1d0: 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
b1e0: 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69  than pRec. Or, i
b1f0: 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  f i==pIdx->nSamp
b200: 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20 20  le then pRec.   
b210: 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68   ** is larger th
b220: 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69  an all samples i
b230: 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a  n the array. */.
b240: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
b250: 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
b260: 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i>=pIdx->nSamp
b270: 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70 70  le ){.      iUpp
b280: 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  er = sqlite3LogE
b290: 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69  stToInt(pIdx->ai
b2a0: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
b2b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b2c0: 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65  iUpper = aSample
b2d0: 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  [i].anLt[iCol];.
b2e0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
b2f0: 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b  Lower>=iUpper ){
b300: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b  .      iGap = 0;
b310: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b320: 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20    iGap = iUpper 
b330: 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a  - iLower;.    }.
b340: 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20      if( roundUp 
b350: 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
b360: 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20  (iGap*2)/3;.    
b370: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
b380: 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20  p = iGap/3;.    
b390: 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  }.    aStat[0] =
b3a0: 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a   iLower + iGap;.
b3b0: 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70      aStat[1] = p
b3c0: 49 64 78 2d 3e 61 41 76 67 45 71 5b 6e 46 69 65  Idx->aAvgEq[nFie
b3d0: 6c 64 2d 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ld-1];.  }..  /*
b3e0: 20 52 65 73 74 6f 72 65 20 74 68 65 20 70 52 65   Restore the pRe
b3f0: 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c 75 65 20  c->nField value 
b400: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
b410: 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46  .  */.  pRec->nF
b420: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
b430: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e   return i;.}.#en
b440: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
b450: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
b460: 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  AT4 */../*.** If
b470: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
b480: 20 70 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d   pTerm is a term
b490: 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 61   that provides a
b4a0: 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  n upper or lower
b4b0: 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72  .** bound on a r
b4c0: 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f  ange scan. Witho
b4d0: 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70  ut considering p
b4e0: 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69  Term, it is esti
b4f0: 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74  mated .** that t
b500: 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  he scan will vis
b510: 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68  it nNew rows. Th
b520: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b530: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  rns the number.*
b540: 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62  * estimated to b
b550: 65 20 76 69 73 69 74 65 64 20 61 66 74 65 72 20  e visited after 
b560: 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74  taking pTerm int
b570: 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a  o account..**.**
b580: 20 49 66 20 74 68 65 20 75 73 65 72 20 65 78 70   If the user exp
b590: 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
b5a0: 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  d a likelihood()
b5b0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
b5c0: 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  term,.** then th
b5d0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
b5e0: 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64  s the likelihood
b5f0: 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74   multiplied by t
b600: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
b610: 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65  input rows. Othe
b620: 72 77 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63  rwise, this func
b630: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
b640: 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c  t an "IS NOT NUL
b650: 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61  L" term.** has a
b660: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30   likelihood of 0
b670: 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68  .50, and any oth
b680: 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69  er term a likeli
b690: 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f  hood of 0.25..*/
b6a0: 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77  .static LogEst w
b6b0: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
b6c0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
b6d0: 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a  , LogEst nNew){.
b6e0: 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20    LogEst nRet = 
b6f0: 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72  nNew;.  if( pTer
b700: 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  m ){.    if( pTe
b710: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
b720: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b   ){.      nRet +
b730: 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
b740: 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ob;.    }else if
b750: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
b760: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
b770: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
b780: 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61   -= 20;        a
b790: 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74  ssert( 20==sqlit
b7a0: 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20  e3LogEst(4) );. 
b7b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
b7c0: 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64  n nRet;.}...#ifd
b7d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b7e0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
b7f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
b800: 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 61 20   affinity for a 
b810: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
b820: 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 68   an index..*/.ch
b830: 61 72 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43  ar sqlite3IndexC
b840: 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 73 71  olumnAffinity(sq
b850: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
b860: 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c   *pIdx, int iCol
b870: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  ){.  assert( iCo
b880: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64  l>=0 && iCol<pId
b890: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
b8a0: 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41  if( !pIdx->zColA
b8b0: 66 66 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  ff ){.    if( sq
b8c0: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
b8d0: 74 79 53 74 72 28 64 62 2c 20 70 49 64 78 29 3d  tyStr(db, pIdx)=
b8e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
b8f0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
b900: 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e  .  return pIdx->
b910: 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d  zColAff[iCol];.}
b920: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
b930: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
b940: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
b950: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
b960: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
b970: 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
b980: 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
b990: 74 65 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67  ted by a.** rang
b9a0: 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70  e-scan on a skip
b9b0: 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72  -scan index. For
b9c0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
b9d0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
b9e0: 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29  1 ON t1(a, b, c)
b9f0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  ;.**   SELECT * 
ba00: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
ba10: 3f 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20  ? AND c BETWEEN 
ba20: 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56  ? AND ?;.**.** V
ba30: 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  alue pLoop->nOut
ba40: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65   is currently se
ba50: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
ba60: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
ba70: 73 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f  s .** visited fo
ba80: 72 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20  r scanning (a=? 
ba90: 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66  AND b=?). This f
baa0: 75 6e 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20  unction reduces 
bab0: 74 68 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a  that estimate .*
bac0: 2a 20 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72  * by some factor
bad0: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
bae0: 74 68 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f  the (c BETWEEN ?
baf0: 20 41 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69   AND ?) expressi
bb00: 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74  on based.** on t
bb10: 68 65 20 73 74 61 74 34 20 64 61 74 61 20 66 6f  he stat4 data fo
bb20: 72 20 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69  r the index. thi
bb30: 73 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70  s scan will be p
bb40: 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65  eformed multiple
bb50: 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65   .** times (once
bb60: 20 66 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20   for each (a,b) 
bb70: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74  combination that
bb80: 20 6d 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73   matches a=?) is
bb90: 20 64 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20   dealt with .** 
bba0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
bbb0: 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69  *.** It does thi
bbc0: 73 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68  s by scanning th
bbd0: 72 6f 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20  rough all stat4 
bbe0: 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69  samples, compari
bbf0: 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74  ng values.** ext
bc00: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
bc10: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 77 69  er and pUpper wi
bc20: 74 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  th the correspon
bc30: 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  ding column in e
bc40: 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49  ach.** sample. I
bc50: 66 20 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68  f L and U are th
bc60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  e number of samp
bc70: 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  les found to be 
bc80: 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20  less than or.** 
bc90: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c  equal to the val
bca0: 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  ues extracted fr
bcb0: 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  om pLower and pU
bcc0: 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
bcd0: 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74  y, and.** N is t
bce0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
bcf0: 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20  of samples, the 
bd00: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75  pLoop->nOut valu
bd10: 65 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  e is adjusted.**
bd20: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
bd30: 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74  **   nOut = nOut
bd40: 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20   * ( min(U - L, 
bd50: 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49  1) / N ).**.** I
bd60: 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c  f pLower is NULL
bd70: 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
bd80: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
bd90: 20 66 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20   from the term, 
bda0: 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a  L is.** set to z
bdb0: 65 72 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69  ero. If pUpper i
bdc0: 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c  s NULL, or a val
bdd0: 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  ue cannot be ext
bde0: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a  racted from it,.
bdf0: 2a 2a 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e  ** U is set to N
be00: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
be10: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
be20: 73 65 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20  sets *pbDone to 
be30: 31 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  1 before returni
be40: 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
be50: 69 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20  if no value can 
be60: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
be70: 6d 20 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20  m either pLower 
be80: 6f 72 20 70 55 70 70 65 72 20 28 61 6e 64 20 73  or pUpper (and s
be90: 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74  o the.** estimat
bea0: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
beb0: 6f 66 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65  of rows delivere
bec0: 64 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  d remains unchan
bed0: 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a  ged), *pbDone.**
bee0: 20 69 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a   is left as is..
bef0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
bf00: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
bf10: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
bf20: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
bf30: 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54  rwise, .** SQLIT
bf40: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
bf50: 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b  int whereRangeSk
bf60: 69 70 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  ipScanEst(.  Par
bf70: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
bf80: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
bf90: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
bfa0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
bfb0: 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
bfc0: 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
bfd0: 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
bfe0: 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
bff0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
c000: 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
c010: 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
c020: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
c030: 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
c040: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
c050: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
c060: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
c070: 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20   .nOut value of 
c080: 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  this loop */.  i
c090: 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20  nt *pbDone      
c0a0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
c0b0: 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f  ue if at least o
c0c0: 6e 65 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65  ne expr. value e
c0d0: 78 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20  xtracted */.){. 
c0e0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
c0f0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
c100: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
c110: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
c120: 71 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  q;.  sqlite3 *db
c130: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c140: 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31   int nLower = -1
c150: 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d  ;.  int nUpper =
c160: 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20   p->nSample+1;. 
c170: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c180: 5f 4f 4b 3b 0a 20 20 75 38 20 61 66 66 20 3d 20  _OK;.  u8 aff = 
c190: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
c1a0: 6d 6e 41 66 66 69 6e 69 74 79 28 64 62 2c 20 70  mnAffinity(db, p
c1b0: 2c 20 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65  , nEq);.  CollSe
c1c0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73  q *pColl;.  .  s
c1d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31  qlite3_value *p1
c1e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
c1f0: 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
c200: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f  d from pLower */
c210: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
c220: 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20   *p2 = 0;       
c230: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
c240: 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65  acted from pUppe
c250: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
c260: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20  alue *pVal = 0; 
c270: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
c280: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
c290: 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c  ecord */..  pCol
c2a0: 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
c2b0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
c2c0: 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29   p->azColl[nEq])
c2d0: 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29  ;.  if( pLower )
c2e0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c2f0: 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
c300: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f  Expr(pParse, pLo
c310: 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
c320: 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20  ht, aff, &p1);. 
c330: 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     nLower = 0;. 
c340: 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20   }.  if( pUpper 
c350: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
c360: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c370: 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
c380: 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
c390: 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
c3a0: 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b  ight, aff, &p2);
c3b0: 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32  .    nUpper = p2
c3c0: 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c   ? 0 : p->nSampl
c3d0: 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31  e;.  }..  if( p1
c3e0: 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e   || p2 ){.    in
c3f0: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69  t i;.    int nDi
c400: 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ff;.    for(i=0;
c410: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c420: 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20  & i<p->nSample; 
c430: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
c440: 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c   sqlite3Stat4Col
c450: 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70  umn(db, p->aSamp
c460: 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d  le[i].p, p->aSam
c470: 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26  ple[i].n, nEq, &
c480: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pVal);.      if(
c490: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c4a0: 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20  & p1 ){.        
c4b0: 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
c4c0: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20  3MemCompare(p1, 
c4d0: 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
c4e0: 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
c4f0: 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20   ) nLower++;.   
c500: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
c510: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
c520: 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p2 ){.        in
c530: 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
c540: 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56  emCompare(p2, pV
c550: 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
c560: 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
c570: 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20   nUpper++;.     
c580: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69   }.    }.    nDi
c590: 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e  ff = (nUpper - n
c5a0: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Lower);.    if( 
c5b0: 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66  nDiff<=0 ) nDiff
c5c0: 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 1;..    /* If
c5d0: 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
c5e0: 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  n upper and lowe
c5f0: 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65  r bound specifie
c600: 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  d, and the .    
c610: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69  ** comparisons i
c620: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
c630: 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65  y are close toge
c640: 74 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61  ther, use the fa
c650: 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65  llback.    ** me
c660: 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61  thod (assume tha
c670: 74 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74  t the scan visit
c680: 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f  s 1/64 of the ro
c690: 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69  ws) for estimati
c6a0: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75  ng.    ** the nu
c6b0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73  mber of rows vis
c6c0: 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ited. Otherwise,
c6d0: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
c6e0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
c6f0: 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65   ** using the me
c700: 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69  thod described i
c710: 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  n the header com
c720: 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75  ment for this fu
c730: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
c740: 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70  f( nDiff!=1 || p
c750: 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77  Upper==0 || pLow
c760: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  er==0 ){.      i
c770: 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71  nt nAdjust = (sq
c780: 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e  lite3LogEst(p->n
c790: 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65  Sample) - sqlite
c7a0: 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b  3LogEst(nDiff));
c7b0: 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  .      pLoop->nO
c7c0: 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20  ut -= nAdjust;. 
c7d0: 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31       *pbDone = 1
c7e0: 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
c7f0: 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65  CE(0x10, ("range
c800: 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f   skip-scan regio
c810: 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75  ns: %u..%u  adju
c820: 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c  st=%d est=%d\n",
c830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c840: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77              nLow
c850: 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a  er, nUpper, nAdj
c860: 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e  ust*-1, pLoop->n
c870: 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Out));.    }..  
c880: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
c890: 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b  t( *pbDone==0 );
c8a0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
c8b0: 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20  alueFree(p1);.  
c8c0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
c8d0: 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (p2);.  sqlite3V
c8e0: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
c8f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c900: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
c910: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
c920: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
c930: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
c940: 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
c950: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
c960: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
c970: 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
c980: 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
c990: 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
c9a0: 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
c9b0: 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
c9c0: 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
c9d0: 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
c9e0: 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
c9f0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
ca00: 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
ca10: 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
ca20: 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
ca30: 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
ca40: 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
ca50: 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
ca60: 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
ca70: 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
ca80: 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
ca90: 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
caa0: 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
cab0: 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
cae0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
caf0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
cb00: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
cb20: 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
cb30: 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
cb40: 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
cb50: 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
cb60: 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
cb70: 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
cb80: 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
cb90: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
cba0: 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
cbb0: 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70   The value in (p
cbc0: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
cbd0: 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74  .btree.nEq) is t
cbe0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
cbf0: 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e   index.** column
cc00: 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
cc10: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
cc20: 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
cc30: 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
cc40: 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f  f.** equality co
cc50: 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69  nstraints optimi
cc60: 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
cc70: 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
cc80: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
cc90: 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
cca0: 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c   is on t1(a, b),
ccb0: 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
ccc0: 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
ccd0: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
cce0: 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
ccf0: 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
cd00: 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
cd10: 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68   set to 1 (as th
cd20: 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
cd30: 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73  ed column, b, is
cd40: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
cd50: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
cd60: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
cd70: 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
cd80: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
cd90: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
cda0: 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
cdb0: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
cdc0: 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  q is set to 0..*
cdd0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
cde0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
cdf0: 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74  d, *pnOut is set
ce00: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c   to the sqlite3L
ce10: 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a  ogEst() of the.*
ce20: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
ce30: 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
ce40: 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64  scan is expected
ce50: 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75   to visit withou
ce60: 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e  t .** considerin
ce70: 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  g the range cons
ce80: 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20  traints. If nEq 
ce90: 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75  is 0, then *pnOu
cea0: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
ceb0: 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74  of .** rows in t
cec0: 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69  he index. Assumi
ced0: 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ng no error occu
cee0: 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64  rs, *pnOut is ad
cef0: 6a 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29  justed (reduced)
cf00: 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  .** to account f
cf10: 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  or the range con
cf20: 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20  straints pLower 
cf30: 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a  and pUpper..** .
cf40: 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
cf50: 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
cf60: 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  4 ANALYZE data, 
cf70: 6f 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20  or if such data 
cf80: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65  cannot be.** use
cf90: 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67  d, a single rang
cfa0: 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64  e inequality red
cfb0: 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
cfc0: 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f  space by a facto
cfd0: 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20  r of 4. .** and 
cfe0: 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72  a pair of constr
cff0: 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78  aints (x>? AND x
d000: 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20  <?) reduces the 
d010: 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  expected number 
d020: 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74  of.** rows visit
d030: 65 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ed by a factor o
d040: 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  f 64..*/.static 
d050: 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63  int whereRangeSc
d060: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
d070: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
d080: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
d090: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
d0a0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
d0b0: 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
d0c0: 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20  er,.  WhereTerm 
d0d0: 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
d0e0: 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
d0f0: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
d100: 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
d110: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
d120: 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
d130: 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
d140: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
d150: 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
d160: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
d170: 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20  p *pLoop     /* 
d180: 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74  Modify the .nOut
d190: 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e   and maybe .rRun
d1a0: 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20   fields */.){.  
d1b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d1c0: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d  OK;.  int nOut =
d1d0: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20   pLoop->nOut;.  
d1e0: 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69  LogEst nNew;..#i
d1f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d200: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
d210: 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  4.  Index *p = p
d220: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
d230: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
d240: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
d250: 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  .nEq;..  if( p->
d260: 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71  nSample>0 && nEq
d270: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20  <p->nSampleCol. 
d280: 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
d290: 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d  nEnabled(pParse-
d2a0: 3e 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74  >db, SQLITE_Stat
d2b0: 33 34 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  34).  ){.    if(
d2c0: 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e   nEq==pBuilder->
d2d0: 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20 20 20  nRecValid ){.   
d2e0: 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72     UnpackedRecor
d2f0: 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64  d *pRec = pBuild
d300: 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20 20  er->pRec;.      
d310: 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
d320: 20 20 20 20 69 6e 74 20 6e 42 74 6d 20 3d 20 70      int nBtm = p
d330: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  Loop->u.btree.nB
d340: 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  tm;.      int nT
d350: 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  op = pLoop->u.bt
d360: 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20 20 20 20  ree.nTop;..     
d370: 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f   /* Variable iLo
d380: 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20  wer will be set 
d390: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
d3a0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
d3b0: 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20   rows in .      
d3c0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  ** the index tha
d3d0: 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  t are less than 
d3e0: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
d3f0: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
d400: 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ry. The.      **
d410: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
d420: 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
d430: 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
d440: 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
d450: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d  he.      ** key-
d460: 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79  prefix formed by
d470: 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20   the nEq values 
d480: 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
d490: 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73  the nEq left-mos
d4a0: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
d4b0: 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ns of the index,
d4c0: 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76   and $L is the v
d4d0: 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a  alue in pLower..
d4e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
d4f0: 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20  * Or, if pLower 
d500: 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61  is NULL or $L ca
d510: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
d520: 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75  d from it (becau
d530: 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69  se it.      ** i
d540: 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
d550: 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
d560: 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
d570: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
d580: 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65  e.      ** range
d590: 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61   is $P. Due to a
d5a0: 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61   quirk in the wa
d5b0: 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  y whereKeyStats(
d5c0: 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20  ) works, even.  
d5d0: 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20      ** if $L is 
d5e0: 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65  available, where
d5f0: 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61  KeyStats() is ca
d600: 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24  lled for both ($
d610: 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  P) and .      **
d620: 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
d630: 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
d640: 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
d650: 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  es is used..    
d660: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69    **.      ** Si
d670: 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20  milarly, iUpper 
d680: 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  is to be set to 
d690: 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
d6a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
d6b0: 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73  ws.      ** less
d6c0: 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
d6d0: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
d6e0: 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
d6f0: 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
d700: 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
d710: 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
d720: 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
d730: 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
d740: 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
d750: 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70        ** of iUpp
d760: 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64  er are requested
d770: 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74   of whereKeyStat
d780: 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c  s() and the smal
d790: 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20  ler used..      
d7a0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
d7b0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62  number of rows b
d7c0: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62  etween the two b
d7d0: 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75  ounds is then ju
d7e0: 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72  st iUpper-iLower
d7f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d800: 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b   tRowcnt iLower;
d810: 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73       /* Rows les
d820: 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
d830: 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
d840: 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20  tRowcnt iUpper; 
d850: 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
d860: 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
d870: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
d880: 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b  nt iLwrIdx = -2;
d890: 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
d8a0: 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  for the lower bo
d8b0: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
d8c0: 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20   iUprIdx = -1;  
d8d0: 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f   /* aSample[] fo
d8e0: 72 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  r the upper boun
d8f0: 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  d */..      if( 
d900: 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  pRec ){.        
d910: 74 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e  testcase( pRec->
d920: 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72  nField!=pBuilder
d930: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ->nRecValid );. 
d940: 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
d950: 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  eld = pBuilder->
d960: 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20  nRecValid;.     
d970: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65   }.      /* Dete
d980: 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64  rmine iLower and
d990: 20 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24   iUpper using ($
d9a0: 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  P) only. */.    
d9b0: 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a    if( nEq==0 ){.
d9c0: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
d9d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70   0;.        iUpp
d9e0: 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30  er = p->nRowEst0
d9f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
da00: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20         /* Note: 
da10: 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
da20: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
da30: 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
da40: 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
da50: 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20          ** have 
da60: 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77  been requested w
da70: 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20  hen testing key 
da80: 24 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c  $P in whereEqual
da90: 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20  ScanEst().  */. 
daa0: 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
dab0: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
dac0: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
dad0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
dae0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70  0];.        iUpp
daf0: 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d  er = a[0] + a[1]
db00: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
db10: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d   assert( pLower=
db20: 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65  =0 || (pLower->e
db30: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
db40: 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
db50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55        assert( pU
db60: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
db70: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
db80: 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
db90: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
dba0: 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  t( p->aSortOrder
dbb0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
dbc0: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e   p->aSortOrder[n
dbd0: 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Eq] ){.        /
dbe0: 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70  * The roles of p
dbf0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
dc00: 20 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72   are swapped for
dc10: 20 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f   a DESC index */
dc20: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68  .        SWAP(Wh
dc30: 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72  ereTerm*, pLower
dc40: 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20  , pUpper);.     
dc50: 20 20 20 53 57 41 50 28 69 6e 74 2c 20 6e 42 74     SWAP(int, nBt
dc60: 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  m, nTop);.      
dc70: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
dc80: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
dc90: 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65   on the iLower e
dca0: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
dcb0: 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$L). */.      
dcc0: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
dcd0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61 63  /* Values extrac
dd00: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
dd10: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
dd20: 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
dd30: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
dd40: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
dd50: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
dd60: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
dd70: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e   &pRec, pExpr, n
dd80: 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20  Btm, nEq, &n);. 
dd90: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
dda0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b  QLITE_OK && n ){
ddb0: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
ddc0: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
ddd0: 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f     u16 mask = WO
dde0: 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _GT|WO_LE;.     
ddf0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
de00: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
de10: 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d  Expr)>n ) mask =
de20: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a   (WO_LE|WO_LT);.
de30: 20 20 20 20 20 20 20 20 20 20 69 4c 77 72 49 64            iLwrId
de40: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
de50: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
de60: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
de70: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
de80: 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  + ((pLower->eOpe
de90: 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20  rator & mask) ? 
dea0: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
deb0: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
dec0: 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
ded0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
dee0: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
def0: 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
df00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
df10: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
df20: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
df30: 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
df40: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
df50: 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
df60: 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
df70: 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df90: 20 56 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   Values extracte
dfa0: 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
dfb0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
dfc0: 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
dfd0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
dfe0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dff0: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
e000: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
e010: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e 54 6f  pRec, pExpr, nTo
e020: 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20  p, nEq, &n);.   
e030: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
e040: 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20  ITE_OK && n ){. 
e050: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
e060: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
e070: 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47   u16 mask = WO_G
e080: 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20  T|WO_LE;.       
e090: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
e0a0: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
e0b0: 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28  pr)>n ) mask = (
e0c0: 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20  WO_LE|WO_LT);.  
e0d0: 20 20 20 20 20 20 20 20 69 55 70 72 49 64 78 20          iUprIdx 
e0e0: 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  = whereKeyStats(
e0f0: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
e100: 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   1, a);.        
e110: 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
e120: 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
e130: 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b  tor & mask) ? a[
e140: 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
e150: 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
e160: 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
e170: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
e180: 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ut--;.          
e190: 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
e1a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
e1b0: 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
e1c0: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
e1d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e1e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
e1f0: 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
e200: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
e210: 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
e220: 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
e230: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  er);.          /
e240: 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f  * TUNING:  If bo
e250: 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c  th iUpper and iL
e260: 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65 64  ower are derived
e270: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20   from the same. 
e280: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70           ** samp
e290: 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  le, then assume 
e2a0: 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65  they are 4x more
e2b0: 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69   selective.  Thi
e2c0: 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20  s brings.       
e2d0: 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61     ** the estima
e2e0: 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79 20  ted selectivity 
e2f0: 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74  more in line wit
e300: 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20  h what it would 
e310: 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
e320: 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69 74  if estimated wit
e330: 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66 20  hout the use of 
e340: 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20  STAT3/4 tables. 
e350: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
e360: 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64   iLwrIdx==iUprId
e370: 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20  x ) nNew -= 20; 
e380: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
e390: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
e3a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
e3b0: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
e3c0: 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
e3d0: 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
e3e0: 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
e3f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
e400: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
e410: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
e420: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
e430: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
e440: 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34  CE(0x10, ("STAT4
e450: 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e   range scan: %u.
e460: 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
e490: 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
e4a0: 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
e4b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
e4c0: 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
e4d0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
e4e0: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
e4f0: 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c  anEst(pParse, pL
e500: 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c  ower, pUpper, pL
e510: 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20  oop, &bDone);.  
e520: 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20      if( bDone ) 
e530: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e540: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
e550: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
e560: 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
e570: 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
e580: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
e590: 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
e5a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
e5b0: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
e5c0: 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
e5d0: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
e5e0: 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
e5f0: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
e600: 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
e610: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
e620: 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
e630: 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
e640: 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
e650: 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
e660: 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  and lower limit 
e670: 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69  and neither limi
e680: 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70  t.  ** has an ap
e690: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
e6a0: 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20  d likelihood(), 
e6b0: 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
e6c0: 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
e6d0: 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
e6e0: 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
e6f0: 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
e700: 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
e710: 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
e720: 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
e730: 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
e740: 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
e750: 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
e760: 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
e770: 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
e780: 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
e790: 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
e7a0: 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
e7b0: 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
e7c0: 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
e7d0: 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65   pLower && pLowe
e7e0: 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26  r->truthProb>0 &
e7f0: 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70  & pUpper && pUpp
e800: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
e810: 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32  ){.    nNew -= 2
e820: 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d  0;.  }..  nOut -
e830: 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20  = (pLower!=0) + 
e840: 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69  (pUpper!=0);.  i
e850: 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65  f( nNew<10 ) nNe
e860: 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e  w = 10;.  if( nN
e870: 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d  ew<nOut ) nOut =
e880: 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e   nNew;.#if defin
e890: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
e8a0: 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f  ABLED).  if( pLo
e8b0: 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b  op->nOut>nOut ){
e8c0: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
e8d0: 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61  0x10,("Range sca
e8e0: 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72  n lowers nOut fr
e8f0: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e910: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c      pLoop->nOut,
e920: 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e   nOut));.  }.#en
e930: 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  dif.  pLoop->nOu
e940: 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
e950: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e960: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e970: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
e980: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
e990: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
e9a0: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
e9b0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
e9c0: 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
e9d0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
e9e0: 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
e9f0: 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
ea00: 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
ea10: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
ea20: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
ea30: 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
ea40: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
ea50: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
ea60: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
ea70: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
ea80: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
ea90: 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
eaa0: 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
eab0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
eac0: 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
ead0: 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
eae0: 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
eaf0: 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
eb00: 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
eb10: 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
eb20: 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
eb30: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
eb40: 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
eb50: 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
eb60: 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
eb70: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
eb80: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
eb90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
eba0: 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
ebb0: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
ebc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
ebd0: 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
ebe0: 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
ebf0: 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
ec00: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
ec10: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
ec20: 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
ec30: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
ec40: 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
ec50: 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
ec60: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
ec70: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
ec80: 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
ec90: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
eca0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ecb0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
ecc0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
ecd0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
ece0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
ecf0: 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45  lder,.  Expr *pE
ed00: 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
ed10: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
ed20: 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
ed30: 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
ed40: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
ed50: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
ed60: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
ed70: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
ed80: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
ed90: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
eda0: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
edb0: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
edc0: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
edd0: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e  .btree.nEq;.  Un
ede0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
edf0: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
ee00: 52 65 63 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Rec;.  int rc;  
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
ee30: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
ee40: 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20   tRowcnt a[2];  
ee50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
ee60: 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  atistics */.  in
ee70: 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74  t bOk;..  assert
ee80: 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73  ( nEq>=1 );.  as
ee90: 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43  sert( nEq<=p->nC
eea0: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
eeb0: 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
eec0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
eed0: 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
eee0: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
eef0: 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
ef00: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
ef10: 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
ef20: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
ef30: 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
ef40: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
ef50: 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
ef60: 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
ef70: 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
ef80: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
ef90: 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
efa0: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
efb0: 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
efc0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
efd0: 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
efe0: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
eff0: 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
f000: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
f010: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
f020: 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
f030: 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
f040: 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
f050: 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43    if( nEq>=p->nC
f060: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e  olumn ){.    *pn
f070: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
f080: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f090: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
f0a0: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
f0b0: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
f0c0: 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 31 2c  &pRec, pExpr, 1,
f0d0: 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20   nEq-1, &bOk);. 
f0e0: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
f0f0: 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63  = pRec;.  if( rc
f100: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
f110: 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62  turn rc;.  if( b
f120: 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Ok==0 ) return S
f130: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
f140: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
f150: 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20  Valid = nEq;..  
f160: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
f170: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
f180: 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41  , a);.  WHERETRA
f190: 43 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69  CE(0x10,("equali
f1a0: 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20  ty scan regions 
f1b0: 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20  %s(%d): %d\n",. 
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d    p->zName, nEq-
f1e0: 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  1, (int)a[1]));.
f1f0: 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
f200: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
f210: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f220: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
f230: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69  _OR_STAT4 */..#i
f240: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f250: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
f260: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
f270: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
f280: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
f290: 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
f2a0: 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
f2b0: 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
f2c0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
f2d0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
f2e0: 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
f2f0: 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
f300: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
f310: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
f320: 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
f330: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
f340: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
f350: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
f360: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
f370: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
f380: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
f390: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
f3a0: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
f3b0: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
f3c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f3d0: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
f3e0: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
f3f0: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
f400: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
f410: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
f420: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
f430: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
f440: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
f450: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
f460: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
f470: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
f480: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
f490: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
f4a0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
f4b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
f4c0: 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
f4d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f4e0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
f4f0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
f500: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
f510: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
f520: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
f530: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
f540: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
f550: 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
f560: 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
f570: 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
f580: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
f590: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
f5a0: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
f5b0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
f5c0: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
f5d0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
f5e0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20  e.pIndex;.  i64 
f5f0: 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c  nRow0 = sqlite3L
f600: 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69  ogEstToInt(p->ai
f610: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
f620: 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
f630: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
f640: 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
f650: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
f660: 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
f670: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
f680: 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
f690: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f6a0: 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
f6b0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
f6c0: 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
f6d0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
f6e0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
f6f0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
f700: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
f710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f720: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
f730: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
f740: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
f750: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
f760: 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
f770: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f780: 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20   nEst = nRow0;. 
f790: 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
f7a0: 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
f7b0: 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
f7c0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
f7d0: 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
f7e0: 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
f7f0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
f800: 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
f810: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
f820: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f830: 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e   if( nRowEst > n
f840: 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d  Row0 ) nRowEst =
f850: 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52   nRow0;.    *pnR
f860: 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
f870: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
f880: 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
f890: 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20  ate: est=%d\n", 
f8a0: 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
f8b0: 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
f8c0: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
f8d0: 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
f8e0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
f8f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
f900: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
f910: 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45   */...#ifdef WHE
f920: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
f930: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
f940: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65  content of a Whe
f950: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f  reTerm object.*/
f960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f970: 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72  reTermPrint(Wher
f980: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e  eTerm *pTerm, in
f990: 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20  t iTerm){.  if( 
f9a0: 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pTerm==0 ){.    
f9b0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f9c0: 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55  tf("TERM-%-3d NU
f9d0: 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20  LL\n", iTerm);. 
f9e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
f9f0: 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63   zType[4];.    c
fa00: 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20  har zLeft[50];. 
fa10: 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c     memcpy(zType,
fa20: 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20   "...", 4);.    
fa30: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
fa40: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
fa50: 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27  L ) zType[0] = '
fa60: 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  V';.    if( pTer
fa70: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
fa80: 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65  O_EQUIV  ) zType
fa90: 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69  [1] = 'E';.    i
faa0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
fab0: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
fac0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
fad0: 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a  zType[2] = 'L';.
fae0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
faf0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
fb00: 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71  NGLE ){.      sq
fb10: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
fb20: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
fb30: 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d  ft,"left={%d:%d}
fb40: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
fb50: 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
fb60: 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65  >leftCursor, pTe
fb70: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
fb80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
fb90: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
fba0: 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26  or & WO_OR)!=0 &
fbb0: 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e  & pTerm->u.pOrIn
fbc0: 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  fo!=0 ){.      s
fbd0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
fbe0: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
fbf0: 65 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30  eft,"indexable=0
fc00: 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20  x%lld", .       
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
fc30: 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20  ->indexable);.  
fc40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
fc50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
fc60: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
fc70: 65 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70  eft,"left=%d", p
fc80: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
fc90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fca0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fcb0: 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d  .       "TERM-%-
fcc0: 33 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70  3d %p %s %-12s p
fcd0: 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30  rob=%-3d op=0x%0
fce0: 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34  3x wtFlags=0x%04
fcf0: 78 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72 6d  x",.       iTerm
fd00: 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20  , pTerm, zType, 
fd10: 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74 72  zLeft, pTerm->tr
fd20: 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20  uthProb,.       
fd30: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fd40: 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  , pTerm->wtFlags
fd50: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
fd60: 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->iField ){.    
fd70: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
fd80: 69 6e 74 66 28 22 20 69 46 69 65 6c 64 3d 25 64  intf(" iField=%d
fd90: 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46 69 65  \n", pTerm->iFie
fda0: 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ld);.    }else{.
fdb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
fdc0: 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
fdd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fde0: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
fdf0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
fe00: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
fe10: 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
fe20: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
fe30: 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65   Show the comple
fe40: 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  te content of a 
fe50: 57 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76  WhereClause.*/.v
fe60: 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
fe70: 43 6c 61 75 73 65 50 72 69 6e 74 28 57 68 65 72  ClausePrint(Wher
fe80: 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
fe90: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
fea0: 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; i<pWC->nTerm;
feb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65   i++){.    where
fec0: 54 65 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e  TermPrint(&pWC->
fed0: 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a  a[i], i);.  }.}.
fee0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57  #endif..#ifdef W
fef0: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
ff00: 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  D./*.** Print a 
ff10: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
ff20: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70   for debugging p
ff30: 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
ff40: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
ff50: 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20  Print(WhereLoop 
ff60: 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  *p, WhereClause 
ff70: 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e  *pWC){.  WhereIn
ff80: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
ff90: 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20  ->pWInfo;.  int 
ffa0: 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e  nb = 1+(pWInfo->
ffb0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33  pTabList->nSrc+3
ffc0: 29 2f 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72  )/4;.  struct Sr
ffd0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
ffe0: 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
fff0: 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
10000 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
10010 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
10020 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d    Bitmask mAll =
10030 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
10040 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73  (nb*4)) - 1;.  s
10050 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
10060 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
10070 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
10080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10090 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
100a0 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
100b0 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20  nb, p->prereq & 
100c0 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mAll);.  sqlite3
100d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
100e0 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
100f0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
10100 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
10110 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
10120 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
10130 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10140 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
10150 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
10160 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
10170 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
10180 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65  pIndex && (zName
10190 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
101a0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  ndex->zName)!=0 
101b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
101c0 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
101d0 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
101e0 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
101f0 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
10200 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
10210 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
10220 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
10230 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
10240 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
10250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
10260 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
10270 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
10280 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
10290 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
102a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
102b0 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
102c0 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
102d0 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
102e0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
102f0 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
10300 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
10310 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
10320 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
10330 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
10340 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
10350 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
10360 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
10370 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10380 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
10390 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
103a0 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
103b0 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
103c0 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
103d0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
103e0 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
103f0 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
10400 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
10410 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
10420 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20   WHERE_SKIPSCAN 
10430 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
10440 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
10450 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73  5x %d-%d", p->ws
10460 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
10470 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65  ,p->nSkip);.  }e
10480 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
10490 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
104a0 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %05x N %d", p->w
104b0 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
104c0 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  m);.  }.  sqlite
104d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
104e0 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
104f0 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
10500 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20  Run, p->nOut);. 
10510 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26   if( p->nLTerm &
10520 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54  & (sqlite3WhereT
10530 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
10540 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
10550 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
10560 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  >nLTerm; i++){. 
10570 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
10580 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  int(p->aLTerm[i]
10590 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
105a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
105b0 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
105c0 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
105d0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
105e0 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
105f0 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
10600 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
10610 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
10620 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
10630 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
10640 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
10650 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
10660 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
10670 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
10680 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
10690 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
106a0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
106b0 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
106c0 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
106d0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
106e0 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
106f0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
10700 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
10710 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
10720 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
10730 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
10740 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
10750 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
10760 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
10770 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10780 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
10790 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
107a0 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
107b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
107c0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
107d0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
107e0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
107f0 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
10800 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
10810 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
10820 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
10830 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
10840 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
10850 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
10860 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10870 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
10880 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
10890 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
108a0 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  NN(db, p->u.btre
108b0 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
108c0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
108d0 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
108e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
108f0 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
10900 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
10910 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
10920 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10930 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
10940 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
10950 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
10960 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
10970 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
10980 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
10990 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77   p->aLTerm);.  w
109a0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
109b0 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65  on(db, p);.  whe
109c0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d  reLoopInit(p);.}
109d0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ../*.** Increase
109e0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
109f0 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70  cation for pLoop
10a00 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65  ->aLTerm[] to be
10a10 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a   at least n..*/.
10a20 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
10a30 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
10a40 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
10a50 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  p *p, int n){.  
10a60 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65  WhereTerm **paNe
10a70 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c  w;.  if( p->nLSl
10a80 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53  ot>=n ) return S
10a90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20  QLITE_OK;.  n = 
10aa0 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65  (n+7)&~7;.  paNe
10ab0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
10ac0 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
10ad0 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
10ae0 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
10af0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
10b00 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
10b10 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c  .  memcpy(paNew,
10b20 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65   p->aLTerm, size
10b30 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
10b40 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69  *p->nLSlot);.  i
10b50 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
10b60 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
10b70 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
10b80 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
10b90 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
10ba0 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
10bb0 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
10bc0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10bd0 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
10be0 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
10bf0 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
10c00 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
10c10 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
10c20 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
10c30 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
10c40 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
10c50 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
10c60 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
10c70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
10c80 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
10c90 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
10ca0 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
10cb0 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
10cc0 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
10cd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ce0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
10cf0 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
10d00 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
10d10 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
10d20 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
10d30 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
10d40 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
10d50 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
10d60 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
10d70 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10d80 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
10d90 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
10da0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
10db0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
10dc0 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
10dd0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
10de0 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
10df0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
10e00 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
10e10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10e20 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
10e30 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
10e40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10e50 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
10e60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
10e70 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
10e80 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
10e90 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
10ea0 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  FreeNN(db, p);.}
10eb0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
10ec0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
10ed0 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
10ee0 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
10ef0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
10f00 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
10f10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
10f20 72 74 28 20 70 57 49 6e 66 6f 21 3d 30 20 29 3b  rt( pWInfo!=0 );
10f30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
10f40 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
10f50 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76  +){.    WhereLev
10f60 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57  el *pLevel = &pW
10f70 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
10f80 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  if( pLevel->pWLo
10f90 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  op && (pLevel->p
10fa0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
10fb0 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20   WHERE_IN_ABLE) 
10fc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10fd0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
10fe0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
10ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11000 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
11010 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73  Clear(&pWInfo->s
11020 57 43 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 57  WC);.  while( pW
11030 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a  Info->pLoops ){.
11040 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
11050 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70   = pWInfo->pLoop
11060 73 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  s;.    pWInfo->p
11070 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
11080 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 4c  Loop;.    whereL
11090 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
110a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
110b0 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 57 49 6e  bFreeNN(db, pWIn
110c0 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  fo);.}../*.** Re
110d0 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c  turn TRUE if all
110e0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
110f0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
11100 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
11110 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
11120 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
11130 20 20 28 32 29 20 20 58 20 75 73 65 73 20 66 65    (2)  X uses fe
11140 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
11150 20 74 65 72 6d 73 20 74 68 61 6e 20 59 0a 2a 2a   terms than Y.**
11160 20 20 20 28 33 29 20 20 45 76 65 72 79 20 57 48     (3)  Every WH
11170 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
11180 75 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73  used by X is als
11190 6f 20 75 73 65 64 20 62 79 20 59 0a 2a 2a 20 20  o used by Y.**  
111a0 20 28 34 29 20 20 58 20 73 6b 69 70 73 20 61 74   (4)  X skips at
111b0 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63   least as many c
111c0 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 20 20  olumns as Y.**  
111d0 20 28 35 29 20 20 49 66 20 58 20 69 73 20 61 20   (5)  If X is a 
111e0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
111f0 74 68 61 6e 20 59 20 69 73 20 74 6f 6f 0a 2a 2a  than Y is too.**
11200 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 28  .** Conditions (
11210 32 29 20 61 6e 64 20 28 33 29 20 6d 65 61 6e 20  2) and (3) mean 
11220 74 68 61 74 20 58 20 69 73 20 61 20 22 70 72 6f  that X is a "pro
11230 70 65 72 20 73 75 62 73 65 74 22 20 6f 66 20 59  per subset" of Y
11240 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70  ..** If X is a p
11250 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
11260 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65  Y then Y is a be
11270 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20  tter choice and 
11280 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65  ought.** to have
11290 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20   a lower cost.  
112a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
112b0 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74  urns TRUE when t
112c0 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c  hat cost .** rel
112d0 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76  ationship is inv
112e0 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20  erted and needs 
112f0 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20  to be adjusted. 
11300 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 34 29 0a   Constraint (4).
11310 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
11320 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73  ause if X uses s
11330 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68  kip-scan less th
11340 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69  an Y it still mi
11350 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61  ght.** deserve a
11360 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e   lower cost even
11370 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
11380 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 20  er subset of Y. 
11390 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 35 29 0a   Constraint (5).
113a0 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
113b0 61 75 73 65 20 61 20 63 6f 76 65 72 69 6e 67 20  ause a covering 
113c0 69 6e 64 65 78 20 70 72 6f 62 61 62 6c 79 20 64  index probably d
113d0 65 73 65 72 76 65 73 20 74 6f 20 68 61 76 65 20  eserves to have 
113e0 61 20 6c 6f 77 65 72 20 63 6f 73 74 0a 2a 2a 20  a lower cost.** 
113f0 74 68 61 6e 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  than a non-cover
11400 69 6e 67 20 69 6e 64 65 78 20 65 76 65 6e 20 69  ing index even i
11410 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65 72  f it is a proper
11420 20 73 75 62 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   subset..*/.stat
11430 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
11440 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
11450 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65  set(.  const Whe
11460 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20  reLoop *pX,     
11470 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65    /* First Where
11480 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20  Loop to compare 
11490 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  */.  const Where
114a0 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20  Loop *pY        
114b0 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e  /* Compare again
114c0 73 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  st this WhereLoo
114d0 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  p */.){.  int i,
114e0 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c   j;.  if( pX->nL
114f0 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e  Term-pX->nSkip >
11500 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d  = pY->nLTerm-pY-
11510 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65  >nSkip ){.    re
11520 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20  turn 0; /* X is 
11530 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
11540 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  Y */.  }.  if( p
11550 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e  Y->nSkip > pX->n
11560 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b  Skip ) return 0;
11570 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20  .  if( pX->rRun 
11580 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20  >= pY->rRun ){. 
11590 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20     if( pX->rRun 
115a0 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74  > pY->rRun ) ret
115b0 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
115c0 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
115d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e   */.    if( pX->
115e0 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20  nOut > pY->nOut 
115f0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
11600 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  * X costs more t
11610 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66  han Y */.  }.  f
11620 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d  or(i=pX->nLTerm-
11630 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
11640 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72     if( pX->aLTer
11650 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  m[i]==0 ) contin
11660 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59  ue;.    for(j=pY
11670 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
11680 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; j--){.      if
11690 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d  ( pY->aLTerm[j]=
116a0 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29  =pX->aLTerm[i] )
116b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
116c0 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75    if( j<0 ) retu
116d0 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20  rn 0;  /* X not 
116e0 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69  a subset of Y si
116f0 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f  nce term X[i] no
11700 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20  t used by Y */. 
11710 20 7d 0a 20 20 69 66 28 20 28 70 58 2d 3e 77 73   }.  if( (pX->ws
11720 46 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f  Flags&WHERE_IDX_
11730 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 26 26 20  ONLY)!=0 .   && 
11740 28 70 59 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  (pY->wsFlags&WHE
11750 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
11760 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
11770 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
11780 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  (5) */.  }.  ret
11790 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63  urn 1;  /* All c
117a0 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a  onditions meet *
117b0 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  /.}../*.** Try t
117c0 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73  o adjust the cos
117d0 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70  t of WhereLoop p
117e0 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73  Template upwards
117f0 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f   or downwards so
11800 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  .** that:.**.** 
11810 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20    (1) pTemplate 
11820 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20  costs less than 
11830 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c  any other WhereL
11840 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20  oops that are a 
11850 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20  proper.**       
11860 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c  subset of pTempl
11870 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  ate.**.**   (2) 
11880 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
11890 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74  more than any ot
118a0 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  her WhereLoops f
118b0 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61  or which pTempla
118c0 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61  te.**       is a
118d0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a   proper subset..
118e0 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68  **.** To say "Wh
118f0 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70  ereLoop X is a p
11900 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
11910 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20  Y" means that X 
11920 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48  uses fewer.** WH
11930 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
11940 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74   than Y and that
11950 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
11960 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79  use term used by
11970 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73   X is.** also us
11980 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74  ed by Y..*/.stat
11990 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
119a0 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73  pAdjustCost(cons
119b0 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t WhereLoop *p, 
119c0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
119d0 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54  late){.  if( (pT
119e0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
119f0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
11a00 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
11a10 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70   for(; p; p=p->p
11a20 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69  NextLoop){.    i
11a30 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
11a40 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f  plate->iTab ) co
11a50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
11a60 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
11a70 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
11a80 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11a90 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
11aa0 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
11ab0 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29  (p, pTemplate) )
11ac0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
11ad0 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
11ae0 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61   downward so tha
11af0 74 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20  t it is cheaper 
11b00 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20  than its .      
11b10 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a  ** subset p. */.
11b20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
11b30 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
11b40 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
11b50 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
11b60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11b70 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
11b80 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
11b90 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
11ba0 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b  un, p->nOut-1));
11bb0 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
11bc0 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
11bd0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
11be0 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
11bf0 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t - 1;.    }else
11c00 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68   if( whereLoopCh
11c10 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65  eaperProperSubse
11c20 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20  t(pTemplate, p) 
11c30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
11c40 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  st pTemplate cos
11c50 74 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74  t upward so that
11c60 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20   it is costlier 
11c70 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20  than p since.   
11c80 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20     ** pTemplate 
11c90 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
11ca0 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20  et of p */.     
11cb0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
11cc0 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61  ,("subset cost a
11cd0 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20  djustment %d,%d 
11ce0 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20  to %d,%d\n",.   
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
11d10 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Run, pTemplate->
11d20 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  nOut, p->rRun, p
11d30 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20  ->nOut+1));.    
11d40 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
11d50 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20  n = p->rRun;.   
11d60 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
11d70 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31  ut = p->nOut + 1
11d80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11d90 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
11da0 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
11db0 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f  ps in *ppPrev lo
11dc0 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68  oking for one th
11dd0 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 72 65 70  at can be.** rep
11de0 6c 61 63 65 64 20 62 79 20 70 54 65 6d 70 6c 61  laced by pTempla
11df0 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
11e00 20 4e 55 4c 4c 20 69 66 20 70 54 65 6d 70 6c 61   NULL if pTempla
11e10 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
11e20 6e 67 20 6f 6e 20 74 68 65 20 57 68 65 72 65 4c  ng on the WhereL
11e30 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a 20 49 6e 20  oop list..** In 
11e40 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 70  other words if p
11e50 54 65 6d 70 6c 61 74 65 20 6f 75 67 68 74 20 74  Template ought t
11e60 6f 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  o be dropped fro
11e70 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64  m further consid
11e80 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
11e90 66 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c  f pX is a WhereL
11ea0 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61  oop that pTempla
11eb0 74 65 20 63 61 6e 20 72 65 70 6c 61 63 65 2c 20  te can replace, 
11ec0 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
11ed0 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69  ** link that poi
11ee0 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a  nts to pX..**.**
11ef0 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61   If pTemplate ca
11f00 6e 6e 6f 74 20 72 65 70 6c 61 63 65 20 61 6e 79  nnot replace any
11f10 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e   existing elemen
11f20 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75  t of the list bu
11f30 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  t needs.** to be
11f40 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
11f50 73 74 20 61 73 20 61 20 6e 65 77 20 65 6e 74 72  st as a new entr
11f60 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  y, then return a
11f70 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
11f80 2a 2a 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c  ** tail of the l
11f90 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  ist..*/.static W
11fa0 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65  hereLoop **where
11fb0 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a  LoopFindLesser(.
11fc0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
11fd0 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68  Prev,.  const Wh
11fe0 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
11ff0 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  te.){.  WhereLoo
12000 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a  p *p;.  for(p=(*
12010 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72  ppPrev); p; ppPr
12020 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ev=&p->pNextLoop
12030 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20  , p=*ppPrev){.  
12040 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
12050 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c  Template->iTab |
12060 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70  | p->iSortIdx!=p
12070 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49  Template->iSortI
12080 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  dx ){.      /* I
12090 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61  f either the iTa
120a0 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61  b or iSortIdx va
120b0 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65  lues for two Whe
120c0 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65  reLoop are diffe
120d0 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  rent.      ** th
120e0 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f  en those WhereLo
120f0 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ops need to be c
12100 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61  onsidered separa
12110 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69  tely.  Neither i
12120 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e  s.      ** a can
12130 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63  didate to replac
12140 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a  e the other. */.
12150 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
12160 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20      }.    /* In 
12170 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
12180 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
12190 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20  rSetup value is 
121a0 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20  either zero.    
121b0 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f  ** or the cost o
121c0 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75  f building an au
121d0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e  tomatic index (N
121e0 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c  logN) and the Nl
121f0 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  ogN.    ** is th
12200 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61  e same for compa
12210 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73  tible WhereLoops
12220 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
12230 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c   p->rSetup==0 ||
12240 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74   pTemplate->rSet
12250 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  up==0 .         
12260 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53          || p->rS
12270 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
12280 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
12290 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  /* whereLoopAddB
122a0 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65  tree() always ge
122b0 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65  nerates and inse
122c0 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  rts the automati
122d0 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  c index.    ** c
122e0 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63  ase first.  Henc
122f0 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e  e compatible can
12300 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  didate WhereLoop
12310 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c  s never have a l
12320 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65  arger.    ** rSe
12330 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53  tup. Call this S
12340 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a  ETUP-INVARIANT *
12350 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
12360 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
12370 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
12380 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75     /* Any loop u
12390 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69  sing an appliati
123a0 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78  on-defined index
123b0 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   (or PRIMARY KEY
123c0 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55   or.    ** UNIQU
123d0 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69  E constraint) wi
123e0 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d  th one or more =
123f0 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73  = constraints is
12400 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
12410 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  han an automatic
12420 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69   index. Unless i
12430 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e  t is a skip-scan
12440 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d  . */.    if( (p-
12450 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
12460 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a  _AUTO_INDEX)!=0.
12470 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
12480 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20  te->nSkip)==0.  
12490 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
124a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
124b0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
124c0 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
124d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
124e0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a  E_COLUMN_EQ)!=0.
124f0 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72       && (p->prer
12500 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
12510 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
12520 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29  te->prereq.    )
12530 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
12540 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12550 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
12560 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74  op p is better t
12570 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70  han pTemplate, p
12580 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a  Template can be.
12590 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64      ** discarded
125a0 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  .  WhereLoop p i
125b0 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20  s better if:.   
125c0 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73   **   (1)  p has
125d0 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65   no more depende
125e0 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70  ncies than pTemp
125f0 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  late, and.    **
12600 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e     (2)  p has an
12610 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
12620 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c  cost than pTempl
12630 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ate.    */.    i
12640 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
12650 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
12660 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20  q)==p->prereq   
12670 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
12680 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
12690 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20    /* (2a) */.   
126c0 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54    && p->rRun<=pT
126d0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
12700 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70     && p->nOut<=p
12710 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20      /* (2c) */. 
12740 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
12750 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72  rn 0;  /* Discar
12760 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  d pTemplate */. 
12770 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12780 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77  pTemplate is alw
12790 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20  ays better than 
127a0 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20  p, then cause p 
127b0 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  to be overwritte
127c0 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54  n.    ** with pT
127d0 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c  emplate.  pTempl
127e0 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68  ate is better th
127f0 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20  an p if:.    ** 
12800 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65    (1)  pTemplate
12810 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
12820 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c  endences than p,
12830 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32   and.    **   (2
12840 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73  )  pTemplate has
12850 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
12860 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a  er cost than p..
12870 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
12880 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
12890 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
128a0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
128b0 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20  q   /* (1)  */. 
128c0 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
128d0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
12900 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
12910 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74  ->nOut>=pTemplat
12920 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20  e->nOut         
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12940 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
12950 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
12960 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
12970 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
12980 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56   ); /* SETUP-INV
12990 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a  ARIANT above */.
129a0 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f        break;   /
129b0 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20  * Cause p to be 
129c0 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70  overwritten by p
129d0 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
129e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
129f0 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pPrev;.}../*.** 
12a00 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63  Insert or replac
12a10 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  e a WhereLoop en
12a20 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65  try using the te
12a30 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e  mplate supplied.
12a40 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
12a50 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  ng WhereLoop ent
12a60 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72  ry might be over
12a70 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e  written if the n
12a80 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69  ew template.** i
12a90 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73  s better and has
12aa0 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
12ab0 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d  ies.  Or the tem
12ac0 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67  plate will be ig
12ad0 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20  nored.** and no 
12ae0 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75  insert will occu
12af0 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  r if an existing
12b00 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61   WhereLoop is fa
12b10 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20  ster and has.** 
12b20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
12b30 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70  es than the temp
12b40 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65  late.  Otherwise
12b50 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
12b60 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73   is.** added bas
12b70 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61  ed on the templa
12b80 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  te..**.** If pBu
12b90 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
12ba0 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77   not NULL then w
12bb0 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c  e care about onl
12bc0 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75  y the.** prerequ
12bd0 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20  isites and rRun 
12be0 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f  and nOut costs o
12bf0 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f  f the N best loo
12c00 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66  ps.  That.** inf
12c10 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68  ormation is gath
12c20 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69  ered in the pBui
12c30 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a  lder->pOrSet obj
12c40 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69  ect.  This speci
12c50 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  al.** processing
12c60 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e   mode is used on
12c70 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  ly for OR clause
12c80 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
12c90 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61  ** When accumula
12ca0 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f  ting multiple lo
12cb0 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64  ops (when pBuild
12cc0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55  er->pOrSet is NU
12cd0 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20  LL) we.** still 
12ce0 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
12cf0 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69  similar loops wi
12d00 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  th the new templ
12d10 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  ate if the.** ne
12d20 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  w template is be
12d30 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
12d40 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
12d50 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
12d60 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
12d70 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
12d80 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
12d90 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
12da0 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
12db0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
12dc0 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
12dd0 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
12de0 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
12df0 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
12e00 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
12e10 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
12e20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
12e30 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
12e40 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
12e50 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f   current loop.*/
12e60 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
12e70 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
12e80 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
12e90 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
12ea0 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
12eb0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
12ec0 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65  rev, *p;.  Where
12ed0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
12ee0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
12ef0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12f00 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
12f10 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  >db;.  int rc;..
12f20 20 20 2f 2a 20 53 74 6f 70 20 74 68 65 20 73 65    /* Stop the se
12f30 61 72 63 68 20 6f 6e 63 65 20 77 65 20 68 69 74  arch once we hit
12f40 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
12f50 65 72 20 73 65 61 72 63 68 20 6c 69 6d 69 74 20  er search limit 
12f60 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
12f70 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 3d 3d 30  r->iPlanLimit==0
12f80 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
12f90 43 45 28 30 78 66 66 66 66 66 66 66 66 2c 28 22  CE(0xffffffff,("
12fa0 3d 3d 3d 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  === query planne
12fb0 72 20 73 65 61 72 63 68 20 6c 69 6d 69 74 20 72  r search limit r
12fc0 65 61 63 68 65 64 20 3d 3d 3d 5c 6e 22 29 29 3b  eached ===\n"));
12fd0 0a 20 20 20 20 69 66 28 20 70 42 75 69 6c 64 65  .    if( pBuilde
12fe0 72 2d 3e 70 4f 72 53 65 74 20 29 20 70 42 75 69  r->pOrSet ) pBui
12ff0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 20  lder->pOrSet->n 
13000 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
13010 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
13020 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 69 50 6c  .  pBuilder->iPl
13030 61 6e 4c 69 6d 69 74 2d 2d 3b 0a 0a 20 20 2f 2a  anLimit--;..  /*
13040 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f   If pBuilder->pO
13050 72 53 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c  rSet is defined,
13060 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20   then only keep 
13070 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73  track of the cos
13080 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72  ts.  ** and prer
13090 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eqs..  */.  if( 
130a0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
130b0 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
130c0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d  Template->nLTerm
130d0 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41   ){.#if WHERETRA
130e0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
130f0 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65   u16 n = pBuilde
13100 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20  r->pOrSet->n;.  
13110 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64      int x =.#end
13120 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72  if.      whereOr
13130 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d  Insert(pBuilder-
13140 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61  >pOrSet, pTempla
13150 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d  te->prereq, pTem
13160 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20  plate->rRun,.   
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
131a0 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  );.#if WHERETRAC
131b0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
131c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
131d0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
131e0 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20  & 0x8 ){.       
131f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
13200 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a  ntf(x?"   or-%d:
13210 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22    ":"   or-X:  "
13220 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 68  , n);.        wh
13230 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
13240 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
13250 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  ->pWC);.      }.
13260 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
13270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13280 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  K;.  }..  /* Loo
13290 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  k for an existin
132a0 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72  g WhereLoop to r
132b0 65 70 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d  eplace with pTem
132c0 70 6c 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65  plate.  */.  whe
132d0 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74  reLoopAdjustCost
132e0 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  (pWInfo->pLoops,
132f0 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70   pTemplate);.  p
13300 70 50 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f  pPrev = whereLoo
13310 70 46 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49  pFindLesser(&pWI
13320 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
13330 6d 70 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20  mplate);..  if( 
13340 70 70 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ppPrev==0 ){.   
13350 20 2f 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64   /* There alread
13360 79 20 65 78 69 73 74 73 20 61 20 57 68 65 72 65  y exists a Where
13370 4c 6f 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74  Loop on the list
13380 20 74 68 61 74 20 69 73 20 62 65 74 74 65 72 0a   that is better.
13390 20 20 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d      ** than pTem
133a0 70 6c 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69  plate, so just i
133b0 67 6e 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20  gnore pTemplate 
133c0 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
133d0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
133e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
133f0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
13400 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  0x8 ){.      sql
13410 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
13420 22 20 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20  "   skip: ");.  
13430 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
13440 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
13450 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
13460 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
13470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13480 20 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20    .  }else{.    
13490 70 20 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d  p = *ppPrev;.  }
134a0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
134b0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  ch this point it
134c0 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68   means that eith
134d0 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65  er p[] should be
134e0 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a   overwritten.  *
134f0 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  * with pTemplate
13500 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73  [] if p[] exists
13510 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20  , or if p==NULL 
13520 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20  then allocate a 
13530 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f  new.  ** WhereLo
13540 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  op and insert it
13550 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ..  */.#if WHERE
13560 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
13570 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71   0x8 */.  if( sq
13580 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
13590 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28  & 0x8 ){.    if(
135a0 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p!=0 ){.      s
135b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
135c0 66 28 22 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a  f("replace: ");.
135d0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
135e0 72 69 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72  rint(p, pBuilder
135f0 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 73 71  ->pWC);.      sq
13600 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
13610 28 22 20 20 20 77 69 74 68 3a 20 22 29 3b 0a 20  ("   with: ");. 
13620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13630 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
13640 74 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b  tf("    add: ");
13650 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65  .    }.    where
13660 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
13670 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
13680 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  WC);.  }.#endif.
13690 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
136a0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
136b0 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  new WhereLoop to
136c0 20 61 64 64 20 74 6f 20 74 68 65 20 65 6e 64 20   add to the end 
136d0 6f 66 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  of the list */. 
136e0 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 20 3d     *ppPrev = p =
136f0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
13700 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
13710 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
13720 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
13730 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13740 5f 42 4b 50 54 3b 0a 20 20 20 20 77 68 65 72 65  _BKPT;.    where
13750 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20  LoopInit(p);.   
13760 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20   p->pNextLoop = 
13770 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
13780 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76  /* We will be ov
13790 65 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c  erwriting WhereL
137a0 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65  oop p[].  But be
137b0 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73  fore we do, firs
137c0 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f  t.    ** go thro
137d0 75 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20  ugh the rest of 
137e0 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c  the list and del
137f0 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e  ete any other en
13800 74 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20  tries besides.  
13810 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72    ** p[] that ar
13820 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64  e also supplated
13830 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
13840 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
13850 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e  *ppTail = &p->pN
13860 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65  extLoop;.    Whe
13870 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a  reLoop *pToDel;.
13880 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61      while( *ppTa
13890 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61  il ){.      ppTa
138a0 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  il = whereLoopFi
138b0 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c  ndLesser(ppTail,
138c0 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20   pTemplate);.   
138d0 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30     if( ppTail==0
138e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
138f0 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c  pToDel = *ppTail
13900 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 44  ;.      if( pToD
13910 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  el==0 ) break;. 
13920 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70       *ppTail = p
13930 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ToDel->pNextLoop
13940 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  ;.#if WHERETRACE
13950 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
13960 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
13970 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
13980 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20   0x8 ){.        
13990 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
139a0 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b  tf(" delete: ");
139b0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
139c0 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20  opPrint(pToDel, 
139d0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
139e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
139f0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
13a00 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29  lete(db, pToDel)
13a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
13a20 20 3d 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72   = whereLoopXfer
13a30 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74  (db, p, pTemplat
13a40 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
13a50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
13a60 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
13a70 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
13a80 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  dex = p->u.btree
13a90 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
13aa0 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65   pIndex && pInde
13ab0 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  x->tnum==0 ){.  
13ac0 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
13ad0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
13ae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13af0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
13b00 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  t the WhereLoop.
13b10 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77  nOut value downw
13b20 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ard to account f
13b30 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  or terms of the.
13b40 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
13b50 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
13b60 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63  he loop but whic
13b70 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62  h are not used b
13b80 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  y an.** index..*
13b90 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48  .** For every WH
13ba0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
13bb0 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64  that is not used
13bc0 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   by the index.**
13bd0 20 61 6e 64 20 77 68 69 63 68 20 68 61 73 20 61   and which has a
13be0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
13bf0 74 79 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f  ty assigned by o
13c00 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69  ne of the likeli
13c10 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c  hood(),.** likel
13c20 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79  y(), or unlikely
13c30 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  () SQL functions
13c40 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74  , reduce the est
13c50 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a  imated number.**
13c60 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
13c70 62 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  by the probabili
13c80 74 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ty specified..**
13c90 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72  .** TUNING:  For
13ca0 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
13cb0 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73  use term that is
13cc0 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65   not used by the
13cd0 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68   index.** and wh
13ce0 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ich does not hav
13cf0 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72  e an assigned tr
13d00 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c  uth probability,
13d10 20 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64   heuristics.** d
13d20 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61  escribed below a
13d30 72 65 20 75 73 65 64 20 74 6f 20 74 72 79 20 74  re used to try t
13d40 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 74  o estimate the t
13d50 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
13d60 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65  ..** TODO --> Pe
13d70 72 68 61 70 73 20 74 68 69 73 20 69 73 20 73 6f  rhaps this is so
13d80 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75  mething that cou
13d90 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62  ld be improved b
13da0 79 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c  y better.** tabl
13db0 65 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a  e statistics..**
13dc0 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a  .** Heuristic 1:
13dd0 20 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74    Estimate the t
13de0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
13df0 20 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65   as 93.75%.  The
13e00 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65   93.75%.** value
13e10 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
13e20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74  -1 in LogEst not
13e30 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d  ation, so this m
13e40 65 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a  eans decrement.*
13e50 2a 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  * the WhereLoop.
13e60 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65  nOut field for e
13e70 76 65 72 79 20 73 75 63 68 20 57 48 45 52 45 20  very such WHERE 
13e80 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a  clause term..**.
13e90 2a 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a 20  ** Heuristic 2: 
13ea0 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73   If there exists
13eb0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
13ec0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
13ed0 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22  of the.** form "
13ee0 78 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50  x==EXPR" and EXP
13ef0 52 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74  R is not a const
13f00 61 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e  ant 0 or 1, then
13f10 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a   make sure the.*
13f20 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72  * final output r
13f30 6f 77 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e  ow estimate is n
13f40 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31  o greater than 1
13f50 2f 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  /4 of the total 
13f60 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
13f70 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s in the table. 
13f80 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
13f90 20 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d   assume that x==
13fa0 45 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72  EXPR will filter
13fb0 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74  .** out at least
13fc0 20 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73   3 out of 4 rows
13fd0 2e 20 20 49 66 20 45 58 50 52 20 69 73 20 2d 31  .  If EXPR is -1
13fe0 20 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   or 0 or 1, then
13ff0 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78   maybe the.** "x
14000 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c  " column is bool
14010 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f  ean or else -1 o
14020 72 20 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f  r 0 or 1 is a co
14030 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c  mmon default val
14040 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22  ue.** on the "x"
14050 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69   column and so i
14060 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79  n that case only
14070 20 63 61 70 20 74 68 65 20 6f 75 74 70 75 74 20   cap the output 
14080 72 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20  row estimate.** 
14090 61 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f  at 1/2 instead o
140a0 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63  f 1/4..*/.static
140b0 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f   void whereLoopO
140c0 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57  utputAdjust(.  W
140d0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
140e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
140f0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
14100 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c  hereLoop *pLoop,
14110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
14120 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e  p to adjust down
14130 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ward */.  LogEst
14140 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20 20   nRow           
14150 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
14160 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65  ws in the entire
14170 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57   table */.){.  W
14180 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
14190 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20   *pX;.  Bitmask 
141a0 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70  notAllowed = ~(p
141b0 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f  Loop->prereq|pLo
141c0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20  op->maskSelf);. 
141d0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
141e0 4c 6f 67 45 73 74 20 69 52 65 64 75 63 65 20 3d  LogEst iReduce =
141f0 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d   0;    /* pLoop-
14200 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74  >nOut should not
14210 20 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65   exceed nRow-iRe
14220 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  duce */..  asser
14230 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
14240 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
14250 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66  INDEX)==0 );.  f
14260 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c  or(i=pWC->nTerm,
14270 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
14280 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; i--, pTerm++
14290 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  ){.    if( (pTer
142a0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
142b0 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20  M_VIRTUAL)!=0 ) 
142c0 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28  break;.    if( (
142d0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
142e0 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
142f0 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  lf)==0 ) continu
14300 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
14310 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
14320 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20  otAllowed)!=0 ) 
14330 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
14340 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  r(j=pLoop->nLTer
14350 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  m-1; j>=0; j--){
14360 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f  .      pX = pLoo
14370 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
14380 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20      if( pX==0 ) 
14390 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
143a0 69 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20  if( pX==pTerm ) 
143b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
143c0 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20   pX->iParent>=0 
143d0 26 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e  && (&pWC->a[pX->
143e0 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d  iParent])==pTerm
143f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
14400 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20      if( j<0 ){. 
14410 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
14420 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a  truthProb<=0 ){.
14430 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
14440 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
14450 79 20 69 73 20 73 70 65 63 69 66 69 65 64 20 75  y is specified u
14460 73 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68  sing the likelih
14470 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20  ood() hints,.   
14480 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65       ** then use
14490 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
144a0 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65   provided by the
144b0 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f   application. */
144c0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
144d0 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nOut += pTerm->t
144e0 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20  ruthProb;.      
144f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
14500 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
14510 20 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72 75   of explicit tru
14520 74 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73  th probabilities
14530 2c 20 75 73 65 20 68 65 75 72 69 73 74 69 63 73  , use heuristics
14540 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67   to.        ** g
14550 75 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c  uess a reasonabl
14560 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
14570 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ity. */.        
14580 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20  pLoop->nOut--;. 
14590 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
145a0 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
145b0 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20  EQ|WO_IS) ){.   
145c0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69         Expr *pRi
145d0 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
145e0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
145f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14600 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  pTerm->pExpr->op
14610 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
14620 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
14630 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 52  ExprIsInteger(pR
14640 69 67 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d  ight, &k) && k>=
14650 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a  (-1) && k<=1 ){.
14660 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20              k = 
14670 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  10;.          }e
14680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
14690 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20   k = 20;.       
146a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
146b0 66 28 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69  f( iReduce<k ) i
146c0 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20  Reduce = k;.    
146d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
146e0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c    }.  }.  if( pL
146f0 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77  oop->nOut > nRow
14700 2d 69 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f  -iReduce )  pLoo
14710 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d  p->nOut = nRow -
14720 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 20   iReduce;.}../* 
14730 0a 2a 2a 20 54 65 72 6d 20 70 54 65 72 6d 20 69  .** Term pTerm i
14740 73 20 61 20 76 65 63 74 6f 72 20 72 61 6e 67 65  s a vector range
14750 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
14760 61 74 69 6f 6e 2e 20 54 68 65 20 66 69 72 73 74  ation. The first
14770 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 69   comparison.** i
14780 6e 20 74 68 65 20 76 65 63 74 6f 72 20 63 61 6e  n the vector can
14790 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73   be optimized us
147a0 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 45 71 20 6f  ing column nEq o
147b0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 54 68 69  f the index. Thi
147c0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
147d0 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
147e0 6e 75 6d 62 65 72 20 6f 66 20 76 65 63 74 6f 72  number of vector
147f0 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 63   elements that c
14800 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 61 73  an be used.** as
14810 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
14820 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  ge comparison..*
14830 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
14840 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  , if the query i
14850 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 57 48 45 52 45  s:.**.**   WHERE
14860 20 61 20 3d 20 3f 20 41 4e 44 20 28 62 2c 20 63   a = ? AND (b, c
14870 2c 20 64 29 20 3e 20 28 3f 2c 20 3f 2c 20 3f 29  , d) > (?, ?, ?)
14880 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  .**.** and the i
14890 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  ndex:.**.**   CR
148a0 45 41 54 45 20 49 4e 44 45 58 20 2e 2e 2e 20 4f  EATE INDEX ... O
148b0 4e 20 28 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65  N (a, b, c, d, e
148c0 29 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ).**.** then thi
148d0 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 75 6c 64  s function would
148e0 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 69 74 68   be invoked with
148f0 20 6e 45 71 3d 31 2e 20 54 68 65 20 76 61 6c 75   nEq=1. The valu
14900 65 20 72 65 74 75 72 6e 65 64 20 69 6e 0a 2a 2a  e returned in.**
14910 20 74 68 69 73 20 63 61 73 65 20 69 73 20 33 2e   this case is 3.
14920 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14930 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c  hereRangeVectorL
14940 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
14950 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
14960 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
14970 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
14980 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
14990 72 20 6f 70 65 6e 20 6f 6e 20 70 49 64 78 20 2a  r open on pIdx *
149a0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
149b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
149c0 69 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 64  index to be used
149d0 20 66 6f 72 20 61 20 69 6e 65 71 75 61 6c 69 74   for a inequalit
149e0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  y constraint */.
149f0 20 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20    int nEq,      
14a00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
14a10 20 6f 66 20 70 72 69 6f 72 20 65 71 75 61 6c 69   of prior equali
14a20 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  ty constraints o
14a30 6e 20 73 61 6d 65 20 69 6e 64 65 78 20 2a 2f 0a  n same index */.
14a40 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
14a50 72 6d 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65  rm     /* The ve
14a60 63 74 6f 72 20 69 6e 65 71 75 61 6c 69 74 79 20  ctor inequality 
14a70 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b  constraint */.){
14a80 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 73 71  .  int nCmp = sq
14a90 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
14aa0 69 7a 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  ize(pTerm->pExpr
14ab0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20  ->pLeft);.  int 
14ac0 69 3b 0a 0a 20 20 6e 43 6d 70 20 3d 20 4d 49 4e  i;..  nCmp = MIN
14ad0 28 6e 43 6d 70 2c 20 28 70 49 64 78 2d 3e 6e 43  (nCmp, (pIdx->nC
14ae0 6f 6c 75 6d 6e 20 2d 20 6e 45 71 29 29 3b 0a 20  olumn - nEq));. 
14af0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6d 70   for(i=1; i<nCmp
14b00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54  ; i++){.    /* T
14b10 65 73 74 20 69 66 20 63 6f 6d 70 61 72 69 73 6f  est if compariso
14b20 6e 20 69 20 6f 66 20 70 54 65 72 6d 20 69 73 20  n i of pTerm is 
14b30 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
14b40 63 6f 6c 75 6d 6e 20 28 69 2b 6e 45 71 29 20 0a  column (i+nEq) .
14b50 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e      ** of the in
14b60 64 65 78 2e 20 49 66 20 6e 6f 74 2c 20 65 78 69  dex. If not, exi
14b70 74 20 74 68 65 20 6c 6f 6f 70 2e 20 20 2a 2f 0a  t the loop.  */.
14b80 20 20 20 20 63 68 61 72 20 61 66 66 3b 20 20 20      char aff;   
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
14bb0 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20  affinity */.    
14bc0 63 68 61 72 20 69 64 78 61 66 66 20 3d 20 30 3b  char idxaff = 0;
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14be0 20 49 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73   Indexed columns
14bf0 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20   affinity */.   
14c00 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14c20 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 63 6f 6c  * Comparison col
14c30 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
14c40 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 68  */.    Expr *pLh
14c50 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  s = pTerm->pExpr
14c60 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74  ->pLeft->x.pList
14c70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
14c80 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70    Expr *pRhs = p
14c90 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
14ca0 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70 52 68  ght;.    if( pRh
14cb0 73 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  s->flags & EP_xI
14cc0 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  sSelect ){.     
14cd0 20 70 52 68 73 20 3d 20 70 52 68 73 2d 3e 78 2e   pRhs = pRhs->x.
14ce0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
14cf0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
14d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
14d10 68 73 20 3d 20 70 52 68 73 2d 3e 78 2e 70 4c 69  hs = pRhs->x.pLi
14d20 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
14d30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
14d40 65 63 6b 20 74 68 61 74 20 74 68 65 20 4c 48 53  eck that the LHS
14d50 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
14d60 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72  on is a column r
14d70 65 66 65 72 65 6e 63 65 20 74 6f 0a 20 20 20 20  eference to.    
14d80 2a 2a 20 74 68 65 20 72 69 67 68 74 20 63 6f 6c  ** the right col
14d90 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67 68 74  umn of the right
14da0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 2e 20 41   source table. A
14db0 6e 64 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  nd that the sort
14dc0 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66  .    ** order of
14dd0 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
14de0 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
14df0 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
14e00 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65  of the.    ** le
14e10 66 74 6d 6f 73 74 20 69 6e 64 65 78 20 63 6f 6c  ftmost index col
14e20 75 6d 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  umn.  */.    if(
14e30 20 70 4c 68 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f   pLhs->op!=TK_CO
14e40 4c 55 4d 4e 20 0a 20 20 20 20 20 7c 7c 20 70 4c  LUMN .     || pL
14e50 68 73 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  hs->iTable!=iCur
14e60 20 0a 20 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e   .     || pLhs->
14e70 69 43 6f 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e 61  iColumn!=pIdx->a
14e80 69 43 6f 6c 75 6d 6e 5b 69 2b 6e 45 71 5d 20 0a  iColumn[i+nEq] .
14e90 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 61 53       || pIdx->aS
14ea0 6f 72 74 4f 72 64 65 72 5b 69 2b 6e 45 71 5d 21  ortOrder[i+nEq]!
14eb0 3d 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65  =pIdx->aSortOrde
14ec0 72 5b 6e 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20  r[nEq].    ){.  
14ed0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14ee0 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ..    testcase( 
14ef0 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58  pLhs->iColumn==X
14f00 4e 5f 52 4f 57 49 44 20 29 3b 0a 20 20 20 20 61  N_ROWID );.    a
14f10 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
14f20 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 68 73  areAffinity(pRhs
14f30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  , sqlite3ExprAff
14f40 69 6e 69 74 79 28 70 4c 68 73 29 29 3b 0a 20 20  inity(pLhs));.  
14f50 20 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74    idxaff = sqlit
14f60 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66  e3TableColumnAff
14f70 69 6e 69 74 79 28 70 49 64 78 2d 3e 70 54 61 62  inity(pIdx->pTab
14f80 6c 65 2c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d  le, pLhs->iColum
14f90 6e 29 3b 0a 20 20 20 20 69 66 28 20 61 66 66 21  n);.    if( aff!
14fa0 3d 69 64 78 61 66 66 20 29 20 62 72 65 61 6b 3b  =idxaff ) break;
14fb0 0a 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ..    pColl = sq
14fc0 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
14fd0 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
14fe0 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20  , pLhs, pRhs);. 
14ff0 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
15000 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
15010 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
15020 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
15030 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 2b 6e 45 71  dx->azColl[i+nEq
15040 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ]) ) break;.  }.
15050 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
15060 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
15070 63 6f 73 74 20 43 20 62 79 20 74 68 65 20 63 6f  cost C by the co
15080 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20 54 2e  stMult facter T.
15090 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75    This only occu
150a0 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65  rs if.** compile
150b0 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f  d with -DSQLITE_
150c0 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a  ENABLE_COSTMULT.
150d0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
150e0 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54  _ENABLE_COSTMULT
150f0 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43  .# define ApplyC
15100 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c  ostMultiplier(C,
15110 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65  T)  C += T.#else
15120 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43  .# define ApplyC
15130 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c  ostMultiplier(C,
15140 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  T).#endif../*.**
15150 20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20   We have so far 
15160 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72  matched pBuilder
15170 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
15180 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65  nEq terms of the
15190 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64 65   .** index pInde
151a0 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20  x. Try to match 
151b0 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20  one more..**.** 
151c0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
151d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 42  on is called, pB
151e0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f  uilder->pNew->nO
151f0 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ut contains the 
15200 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
15210 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 62  ws expected to b
15220 65 20 76 69 73 69 74 65 64 20 62 79 20 66 69 6c  e visited by fil
15230 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65  tering using the
15240 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f   nEq .** terms o
15250 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d 6f  nly. If it is mo
15260 64 69 66 69 65 64 2c 20 74 68 69 73 20 76 61 6c  dified, this val
15270 75 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 62  ue is restored b
15280 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66  efore this .** f
15290 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
152a0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65  .**.** If pProbe
152b0 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20  ->tnum==0, that 
152c0 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20  means pIndex is 
152d0 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65  a fake index use
152e0 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54  d for the.** INT
152f0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
15300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15310 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
15320 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c  eIndex(.  WhereL
15330 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
15340 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65  lder,     /* The
15350 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f   WhereLoop facto
15360 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ry */.  struct S
15370 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
15380 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  c,      /* FROM 
15390 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
153a0 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  g analyzed */.  
153b0 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20  Index *pProbe,  
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153d0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70  /* An index on p
153e0 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  Src */.  LogEst 
153f0 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20  nInMul          
15400 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28           /* log(
15410 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  Number of iterat
15420 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20  ions due to IN) 
15430 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
15440 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
15450 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f  lder->pWInfo;  /
15460 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20  * WHERE analyse 
15470 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
15480 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
15490 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  nfo->pParse;    
154a0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
154b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
154c0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
154d0 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
154e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
154f0 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78  on malloc contex
15500 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
15510 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
15520 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
15530 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64  te WhereLoop und
15540 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
15550 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
15560 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
15570 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54       /* A WhereT
15580 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64  erm under consid
15590 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
155a0 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20   opMask;        
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
155c0 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20  Valid operators 
155d0 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
155e0 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  */.  WhereScan s
155f0 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  can;            
15600 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
15610 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73   for WHERE terms
15620 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61   */.  Bitmask sa
15630 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20  ved_prereq;     
15640 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
15650 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
15660 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36  >prereq */.  u16
15670 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20   saved_nLTerm;  
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15690 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
156a0 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a  f pNew->nLTerm *
156b0 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45  /.  u16 saved_nE
156c0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
156d0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
156e0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
156f0 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20  .btree.nEq */.  
15700 75 31 36 20 73 61 76 65 64 5f 6e 42 74 6d 3b 20  u16 saved_nBtm; 
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
15730 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72  e of pNew->u.btr
15740 65 65 2e 6e 42 74 6d 20 2a 2f 0a 20 20 75 31 36  ee.nBtm */.  u16
15750 20 73 61 76 65 64 5f 6e 54 6f 70 3b 20 20 20 20   saved_nTop;    
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15770 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
15780 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
15790 6e 54 6f 70 20 2a 2f 0a 20 20 75 31 36 20 73 61  nTop */.  u16 sa
157a0 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20  ved_nSkip;      
157b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
157c0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
157d0 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20  New->nSkip */.  
157e0 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
157f0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
15800 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
15810 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
15820 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73  gs */.  LogEst s
15830 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
15840 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
15850 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
15860 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
15870 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15890 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
158a0 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
158d0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
158e0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
158f0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
15900 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
15910 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
15920 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
15930 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
15940 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
15950 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
15960 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
15970 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
15980 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
15990 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
159a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
159b0 45 4d 5f 42 4b 50 54 3b 0a 20 20 57 48 45 52 45  EM_BKPT;.  WHERE
159c0 54 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 42  TRACE(0x800, ("B
159d0 45 47 49 4e 20 25 73 2e 61 64 64 42 74 72 65 65  EGIN %s.addBtree
159e0 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 5c  Idx(%s), nEq=%d\
159f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
15a00 20 20 20 20 20 20 20 20 20 70 50 72 6f 62 65 2d           pProbe-
15a10 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 70  >pTable->zName,p
15a20 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 70 4e  Probe->zName, pN
15a30 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29  ew->u.btree.nEq)
15a40 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  );..  assert( (p
15a50 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
15a60 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
15a70 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)==0 );.  asser
15a80 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
15a90 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
15aa0 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  MIT)==0 );.  if(
15ab0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
15ac0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
15ad0 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
15ae0 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_LT|WO_LE;.  
15af0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
15b00 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  t( pNew->u.btree
15b10 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a 20 20 20 20  .nBtm==0 );.    
15b20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  opMask = WO_EQ|W
15b30 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_IN|WO_GT|WO_GE
15b40 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
15b50 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20  ISNULL|WO_IS;.  
15b60 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  }.  if( pProbe->
15b70 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d  bUnordered ) opM
15b80 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57  ask &= ~(WO_GT|W
15b90 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
15ba0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  );..  assert( pN
15bb0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
15bc0 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
15bd0 29 3b 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71 20  );..  saved_nEq 
15be0 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
15bf0 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 42 74  nEq;.  saved_nBt
15c00 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  m = pNew->u.btre
15c10 65 2e 6e 42 74 6d 3b 0a 20 20 73 61 76 65 64 5f  e.nBtm;.  saved_
15c20 6e 54 6f 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  nTop = pNew->u.b
15c30 74 72 65 65 2e 6e 54 6f 70 3b 0a 20 20 73 61 76  tree.nTop;.  sav
15c40 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d  ed_nSkip = pNew-
15c50 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f  >nSkip;.  saved_
15c60 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e  nLTerm = pNew->n
15c70 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77  LTerm;.  saved_w
15c80 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77  sFlags = pNew->w
15c90 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f  sFlags;.  saved_
15ca0 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70  prereq = pNew->p
15cb0 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e  rereq;.  saved_n
15cc0 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out = pNew->nOut
15cd0 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72  ;.  pTerm = wher
15ce0 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
15cf0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20   pBuilder->pWC, 
15d00 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 73  pSrc->iCursor, s
15d10 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20 20  aved_nEq,.      
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d30 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65    opMask, pProbe
15d40 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  );.  pNew->rSetu
15d50 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d  p = 0;.  rSize =
15d60 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
15d70 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53  gEst[0];.  rLogS
15d80 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
15d90 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d  ze);.  for(; rc=
15da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
15db0 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20  erm!=0; pTerm = 
15dc0 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
15dd0 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65  can)){.    u16 e
15de0 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65  Op = pTerm->eOpe
15df0 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72  rator;   /* Shor
15e00 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d  thand for pTerm-
15e10 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  >eOperator */.  
15e20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64    LogEst rCostId
15e30 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f  x;.    LogEst nO
15e40 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20  utUnadjusted;   
15e50 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66       /* nOut bef
15e60 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45  ore IN() and WHE
15e70 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a  RE adjustments *
15e80 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20  /.    int nIn = 
15e90 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
15ea0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
15eb0 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e  _STAT4.    int n
15ec0 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
15ed0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
15ee0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
15ef0 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c  eOp==WO_ISNULL |
15f00 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  | (pTerm->wtFlag
15f10 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30  s&TERM_VNULL)!=0
15f20 29 0a 20 20 20 20 20 26 26 20 69 6e 64 65 78 43  ).     && indexC
15f30 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50 72  olumnNotNull(pPr
15f40 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 29 0a  obe, saved_nEq).
15f50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e      ){.      con
15f60 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65  tinue; /* ignore
15f70 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63   IS [NOT] NULL c
15f80 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f  onstraints on NO
15f90 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
15fa0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
15fb0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
15fc0 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  ht & pNew->maskS
15fd0 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  elf ) continue;.
15fe0 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  .    /* Do not a
15ff0 6c 6c 6f 77 20 74 68 65 20 75 70 70 65 72 20 62  llow the upper b
16000 6f 75 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20 6f  ound of a LIKE o
16010 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67  ptimization rang
16020 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  e constraint.   
16030 20 2a 2a 20 74 6f 20 6d 69 78 20 77 69 74 68 20   ** to mix with 
16040 61 20 6c 6f 77 65 72 20 72 61 6e 67 65 20 62 6f  a lower range bo
16050 75 6e 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74  und from some ot
16060 68 65 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20  her source */.  
16070 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
16080 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
16090 4f 50 54 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f  OPT && pTerm->eO
160a0 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29  perator==WO_LT )
160b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
160c0 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
160d0 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 72 6f 6d  constraints from
160e0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
160f0 65 20 74 6f 20 62 65 20 75 73 65 64 20 62 79 20  e to be used by 
16100 74 68 65 0a 20 20 20 20 2a 2a 20 72 69 67 68 74  the.    ** right
16110 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
16120 20 4a 4f 49 4e 2e 20 20 4f 6e 6c 79 20 63 6f 6e   JOIN.  Only con
16130 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
16140 4f 4e 20 63 6c 61 75 73 65 20 61 72 65 0a 20 20  ON clause are.  
16150 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a    ** allowed */.
16160 20 20 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66      if( (pSrc->f
16170 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
16180 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26  LEFT)!=0.     &&
16190 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
161a0 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
161b0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
161c0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
161d0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ue;.    }..    i
161e0 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
161f0 28 70 50 72 6f 62 65 29 20 26 26 20 73 61 76 65  (pProbe) && save
16200 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e  d_nEq==pProbe->n
16210 4b 65 79 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  KeyCol-1 ){.    
16220 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46    pBuilder->bldF
16230 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42  lags |= SQLITE_B
16240 4c 44 46 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  LDF_UNIQUE;.    
16250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 75  }else{.      pBu
16260 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20  ilder->bldFlags 
16270 7c 3d 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49  |= SQLITE_BLDF_I
16280 4e 44 45 58 45 44 3b 0a 20 20 20 20 7d 0a 20 20  NDEXED;.    }.  
16290 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
162a0 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
162b0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
162c0 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
162d0 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  Eq;.    pNew->u.
162e0 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76  btree.nBtm = sav
162f0 65 64 5f 6e 42 74 6d 3b 0a 20 20 20 20 70 4e 65  ed_nBtm;.    pNe
16300 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
16310 3d 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20  = saved_nTop;.  
16320 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
16330 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
16340 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
16350 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
16360 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
16370 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
16380 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
16390 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
163a0 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
163b0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
163c0 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
163d0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
163e0 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
163f0 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73  skSelf;..    ass
16400 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  ert( nInMul==0. 
16410 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
16420 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
16430 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30  _COLUMN_NULL)!=0
16440 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
16450 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
16460 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d  ERE_COLUMN_IN)!=
16470 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  0 .        || (p
16480 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
16490 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d  HERE_SKIPSCAN)!=
164a0 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  0 .    );..    i
164b0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  f( eOp & WO_IN )
164c0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
164d0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
164e0 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  pr;.      if( Ex
164f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16500 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
16510 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
16520 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
16530 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74  ..)":  TUNING: t
16540 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
16550 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s 25 rows */.   
16560 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
16570 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61      nIn = 46;  a
16580 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74  ssert( 46==sqlit
16590 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a  e3LogEst(25) );.
165a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
165b0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 61  expression may a
165c0 63 74 75 61 6c 6c 79 20 62 65 20 6f 66 20 74 68  ctually be of th
165d0 65 20 66 6f 72 6d 20 28 78 2c 20 79 29 20 49 4e  e form (x, y) IN
165e0 20 28 53 45 4c 45 43 54 2e 2e 2e 29 2e 0a 20 20   (SELECT...)..  
165f0 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
16600 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 61   case there is a
16610 20 73 65 70 61 72 61 74 65 20 74 65 72 6d 20 66   separate term f
16620 6f 72 20 65 61 63 68 20 6f 66 20 28 78 29 20 61  or each of (x) a
16630 6e 64 20 28 79 29 2e 0a 20 20 20 20 20 20 20 20  nd (y)..        
16640 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  ** However, the 
16650 6e 49 6e 20 6d 75 6c 74 69 70 6c 69 65 72 20 73  nIn multiplier s
16660 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61 70  hould only be ap
16670 70 6c 69 65 64 20 6f 6e 63 65 2c 20 6e 6f 74 20  plied once, not 
16680 6f 6e 63 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  once.        ** 
16690 66 6f 72 20 65 61 63 68 20 73 75 63 68 20 74 65  for each such te
166a0 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm. The followin
166b0 67 20 6c 6f 6f 70 20 63 68 65 63 6b 73 20 74 68  g loop checks th
166c0 61 74 20 70 54 65 72 6d 20 69 73 20 74 68 65 0a  at pTerm is the.
166d0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
166e0 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 75 73   such term in us
166f0 65 2c 20 61 6e 64 20 73 65 74 73 20 6e 49 6e 20  e, and sets nIn 
16700 62 61 63 6b 20 74 6f 20 30 20 69 66 20 69 74 20  back to 0 if it 
16710 69 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  is not. */.     
16720 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e     for(i=0; i<pN
16730 65 77 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 2b  ew->nLTerm-1; i+
16740 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
16750 28 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ( pNew->aLTerm[i
16760 5d 20 26 26 20 70 4e 65 77 2d 3e 61 4c 54 65 72  ] && pNew->aLTer
16770 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 45 78  m[i]->pExpr==pEx
16780 70 72 20 29 20 6e 49 6e 20 3d 20 30 3b 0a 20 20  pr ) nIn = 0;.  
16790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
167a0 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
167b0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
167c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
167d0 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
167e0 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c     /* "x IN (val
167f0 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22  ue, value, ...)"
16800 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
16810 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
16820 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
16830 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
16840 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b  assert( nIn>0 );
16850 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20    /* RHS always 
16860 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65  has 2 or more te
16870 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73  rms...  The pars
16880 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
168a0 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f  changes "x IN (?
168b0 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a  )" into "x=?". *
168c0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
168d0 69 66 28 20 70 50 72 6f 62 65 2d 3e 68 61 73 53  if( pProbe->hasS
168e0 74 61 74 31 20 29 7b 0a 20 20 20 20 20 20 20 20  tat1 ){.        
168f0 4c 6f 67 45 73 74 20 4d 2c 20 6c 6f 67 4b 2c 20  LogEst M, logK, 
16900 73 61 66 65 74 79 4d 61 72 67 69 6e 3b 0a 20 20  safetyMargin;.  
16910 20 20 20 20 20 20 2f 2a 20 4c 65 74 3a 0a 20 20        /* Let:.  
16920 20 20 20 20 20 20 2a 2a 20 20 20 4e 20 3d 20 74        **   N = t
16930 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
16940 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
16950 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  able.        ** 
16960 20 20 4b 20 3d 20 74 68 65 20 6e 75 6d 62 65 72    K = the number
16970 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74   of entries on t
16980 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
16990 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20 20 20   operator.      
169a0 20 20 2a 2a 20 20 20 4d 20 3d 20 74 68 65 20 6e    **   M = the n
169b0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
169c0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
169d0 6d 61 74 63 68 20 74 65 72 6d 73 20 74 6f 20 74  match terms to t
169e0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  he .        **  
169f0 20 20 20 20 20 74 6f 20 74 68 65 20 6c 65 66 74       to the left
16a00 20 69 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 64   in the same ind
16a10 65 78 2e 20 20 49 66 20 74 68 65 20 49 4e 20 6f  ex.  If the IN o
16a20 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 0a 20 20  perator is on.  
16a30 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74        **       t
16a40 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 69 6e 64  he left-most ind
16a50 65 78 20 63 6f 6c 75 6d 6e 2c 20 4d 3d 3d 4e 2e  ex column, M==N.
16a60 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
16a70 20 20 20 20 2a 2a 20 47 69 76 65 6e 20 74 68 65      ** Given the
16a80 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 61 62 6f   definitions abo
16a90 76 65 2c 20 69 74 20 69 73 20 62 65 74 74 65 72  ve, it is better
16aa0 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 49 4e 20   to omit the IN 
16ab0 6f 70 65 72 61 74 6f 72 0a 20 20 20 20 20 20 20  operator.       
16ac0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   ** from the ind
16ad0 65 78 20 6c 6f 6f 6b 75 70 20 61 6e 64 20 69 6e  ex lookup and in
16ae0 73 74 65 61 64 20 64 6f 20 61 20 73 63 61 6e 20  stead do a scan 
16af0 6f 66 20 74 68 65 20 4d 20 65 6c 65 6d 65 6e 74  of the M element
16b00 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 65  s,.        ** te
16b10 73 74 69 6e 67 20 65 61 63 68 20 73 63 61 6e 6e  sting each scann
16b20 65 64 20 72 6f 77 20 61 67 61 69 6e 73 74 20 74  ed row against t
16b30 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73  he IN operator s
16b40 65 70 61 72 61 74 65 6c 79 2c 20 69 66 3a 0a 20  eparately, if:. 
16b50 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
16b60 20 20 2a 2a 20 20 20 20 20 20 20 20 4d 2a 6c 6f    **        M*lo
16b70 67 28 4b 29 20 3c 20 4b 2a 6c 6f 67 28 4e 29 0a  g(K) < K*log(N).
16b80 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
16b90 20 20 20 2a 2a 20 4f 75 72 20 65 73 74 69 6d 61     ** Our estima
16ba0 74 65 73 20 66 6f 72 20 4d 2c 20 4b 2c 20 61 6e  tes for M, K, an
16bb0 64 20 4e 20 6d 69 67 68 74 20 62 65 20 69 6e 61  d N might be ina
16bc0 63 63 75 72 61 74 65 2c 20 73 6f 20 77 65 20 62  ccurate, so we b
16bd0 75 69 6c 64 20 69 6e 0a 20 20 20 20 20 20 20 20  uild in.        
16be0 2a 2a 20 61 20 73 61 66 65 74 79 20 6d 61 72 67  ** a safety marg
16bf0 69 6e 20 6f 66 20 32 20 28 4c 6f 67 45 73 74 3a  in of 2 (LogEst:
16c00 20 31 30 29 20 74 68 61 74 20 66 61 76 6f 72 73   10) that favors
16c10 20 75 73 69 6e 67 20 74 68 65 20 49 4e 20 6f 70   using the IN op
16c20 65 72 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a  erator.        *
16c30 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78  * with the index
16c40 2c 20 61 73 20 75 73 69 6e 67 20 61 6e 20 69 6e  , as using an in
16c50 64 65 78 20 68 61 73 20 62 65 74 74 65 72 20 77  dex has better w
16c60 6f 72 73 74 2d 63 61 73 65 20 62 65 68 61 76 69  orst-case behavi
16c70 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  or..        ** I
16c80 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  f we do not have
16c90 20 72 65 61 6c 20 73 71 6c 69 74 65 5f 73 74 61   real sqlite_sta
16ca0 74 31 20 64 61 74 61 2c 20 61 6c 77 61 79 73 20  t1 data, always 
16cb0 70 72 65 66 65 72 20 74 6f 20 75 73 65 0a 20 20  prefer to use.  
16cc0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64        ** the ind
16cd0 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ex..        */. 
16ce0 20 20 20 20 20 20 20 4d 20 3d 20 70 50 72 6f 62         M = pProb
16cf0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
16d00 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20 20 20 20  aved_nEq];.     
16d10 20 20 20 6c 6f 67 4b 20 3d 20 65 73 74 4c 6f 67     logK = estLog
16d20 28 6e 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  (nIn);.        s
16d30 61 66 65 74 79 4d 61 72 67 69 6e 20 3d 20 31 30  afetyMargin = 10
16d40 3b 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 65 78  ;  /* TUNING: ex
16d50 74 72 61 20 77 65 69 67 68 74 20 66 6f 72 20 69  tra weight for i
16d60 6e 64 65 78 65 64 20 49 4e 20 2a 2f 0a 20 20 20  ndexed IN */.   
16d70 20 20 20 20 20 69 66 28 20 4d 20 2b 20 6c 6f 67       if( M + log
16d80 4b 20 2b 20 73 61 66 65 74 79 4d 61 72 67 69 6e  K + safetyMargin
16d90 20 3c 20 6e 49 6e 20 2b 20 72 4c 6f 67 53 69 7a   < nIn + rLogSiz
16da0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  e ){.          W
16db0 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 0a  HERETRACE(0x40,.
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 28 22 53 63              ("Sc
16dd0 61 6e 20 70 72 65 66 65 72 72 65 64 20 6f 76 65  an preferred ove
16de0 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 6e  r IN operator on
16df0 20 63 6f 6c 75 6d 6e 20 25 64 20 6f 66 20 5c 22   column %d of \"
16e00 25 73 5c 22 20 28 25 64 3c 25 64 29 5c 6e 22 2c  %s\" (%d<%d)\n",
16e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61  .             sa
16e20 76 65 64 5f 6e 45 71 2c 20 70 50 72 6f 62 65 2d  ved_nEq, pProbe-
16e30 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31  >zName, M+logK+1
16e40 30 2c 20 6e 49 6e 2b 72 4c 6f 67 53 69 7a 65 29  0, nIn+rLogSize)
16e50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
16e60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
16e70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16e80 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
16e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 22 49  .            ("I
16ea0 4e 20 6f 70 65 72 61 74 6f 72 20 70 72 65 66 65  N operator prefe
16eb0 72 72 65 64 20 6f 6e 20 63 6f 6c 75 6d 6e 20 25  rred on column %
16ec0 64 20 6f 66 20 5c 22 25 73 5c 22 20 28 25 64 3e  d of \"%s\" (%d>
16ed0 3d 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  =%d)\n",.       
16ee0 20 20 20 20 20 20 73 61 76 65 64 5f 6e 45 71 2c        saved_nEq,
16ef0 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20   pProbe->zName, 
16f00 4d 2b 6c 6f 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72  M+logK+10, nIn+r
16f10 4c 6f 67 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  LogSize));.     
16f20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16f30 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
16f40 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
16f50 5f 49 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _IN;.    }else i
16f60 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c  f( eOp & (WO_EQ|
16f70 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20  WO_IS) ){.      
16f80 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62  int iCol = pProb
16f90 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65  e->aiColumn[save
16fa0 64 5f 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e  d_nEq];.      pN
16fb0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
16fc0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a  HERE_COLUMN_EQ;.
16fd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 61        assert( sa
16fe0 76 65 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75  ved_nEq==pNew->u
16ff0 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20  .btree.nEq );.  
17000 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e      if( iCol==XN
17010 5f 52 4f 57 49 44 20 0a 20 20 20 20 20 20 20 7c  _ROWID .       |
17020 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 6e 49  | (iCol>=0 && nI
17030 6e 4d 75 6c 3d 3d 30 20 26 26 20 73 61 76 65 64  nMul==0 && saved
17040 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b  _nEq==pProbe->nK
17050 65 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29  eyCol-1).      )
17060 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  {.        if( iC
17070 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20  ol==XN_ROWID || 
17080 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e  pProbe->uniqNotN
17090 75 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ull .         ||
170a0 20 28 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f   (pProbe->nKeyCo
170b0 6c 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d 3e  l==1 && pProbe->
170c0 6f 6e 45 72 72 6f 72 20 26 26 20 65 4f 70 3d 3d  onError && eOp==
170d0 57 4f 5f 45 51 29 20 0a 20 20 20 20 20 20 20 20  WO_EQ) .        
170e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
170f0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
17100 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
17110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17120 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
17130 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f  gs |= WHERE_UNQ_
17140 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20  WANTED;.        
17150 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
17160 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 57 4f  lse if( eOp & WO
17170 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
17180 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
17190 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  = WHERE_COLUMN_N
171a0 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ULL;.    }else i
171b0 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c  f( eOp & (WO_GT|
171c0 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20  WO_GE) ){.      
171d0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
171e0 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  WO_GT );.      t
171f0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
17200 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e  O_GE );.      pN
17210 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
17220 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
17230 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  E|WHERE_BTM_LIMI
17240 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  T;.      pNew->u
17250 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 77 68  .btree.nBtm = wh
17260 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65  ereRangeVectorLe
17270 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  n(.          pPa
17280 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  rse, pSrc->iCurs
17290 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61 76 65  or, pProbe, save
172a0 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20 20  d_nEq, pTerm.   
172b0 20 20 20 29 3b 0a 20 20 20 20 20 20 70 42 74 6d     );.      pBtm
172c0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
172d0 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTop = 0;.      
172e0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
172f0 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
17300 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  T ){.        /* 
17310 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73  Range contraints
17320 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20   that come from 
17330 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  the LIKE optimiz
17340 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20  ation are.      
17350 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73 65 64    ** always used
17360 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20   in pairs. */.  
17370 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26 70 54        pTop = &pT
17380 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  erm[1];.        
17390 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d 28 70  assert( (pTop-(p
173a0 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70  Term->pWC->a))<p
173b0 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d  Term->pWC->nTerm
173c0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
173d0 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67  rt( pTop->wtFlag
173e0 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
173f0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
17400 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61  rt( pTop->eOpera
17410 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20  tor==WO_LT );.  
17420 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
17430 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
17440 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
17450 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  +1) ) break; /* 
17460 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  OOM */.        p
17470 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
17480 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54  ->nLTerm++] = pT
17490 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  op;.        pNew
174a0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
174b0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
174c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
174d0 72 65 65 2e 6e 54 6f 70 20 3d 20 31 3b 0a 20 20  ree.nTop = 1;.  
174e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
174f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
17500 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  Op & (WO_LT|WO_L
17510 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  E) );.      test
17520 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c  case( eOp & WO_L
17530 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
17540 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45  ase( eOp & WO_LE
17550 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
17560 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
17570 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
17580 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
17590 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
175a0 65 65 2e 6e 54 6f 70 20 3d 20 77 68 65 72 65 52  ee.nTop = whereR
175b0 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20  angeVectorLen(. 
175c0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
175d0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
175e0 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45  pProbe, saved_nE
175f0 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29  q, pTerm.      )
17600 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70  ;.      pTop = p
17610 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d  Term;.      pBtm
17620 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67   = (pNew->wsFlag
17630 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
17640 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  MIT)!=0 ?.      
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17660 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
17670 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b  ->nLTerm-2] : 0;
17680 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
17690 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65  t this point pNe
176a0 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74  w->nOut is set t
176b0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
176c0 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
176d0 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74  .    ** be visit
176e0 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  ed by the index 
176f0 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73  scan before cons
17700 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65  idering term pTe
17710 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  rm, or the.    *
17720 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20  * values of nIn 
17730 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f  and nInMul. In o
17740 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75  ther words, assu
17750 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20  ming that all . 
17760 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29     ** "x IN(...)
17770 22 20 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c  " terms are repl
17780 61 63 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f  aced with "x = ?
17790 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70  ". This block up
177a0 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  dates.    ** the
177b0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
177c0 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20  nOut to account 
177d0 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e  for pTerm (but n
177e0 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20  ot nIn/nInMul). 
177f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17800 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65  pNew->nOut==save
17810 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66  d_nOut );.    if
17820 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
17830 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
17840 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
17850 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69   Adjust nOut usi
17860 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34 20 64  ng stat3/stat4 d
17870 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72  ata. Or, if ther
17880 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74  e is no stat3/st
17890 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  at4.      ** dat
178a0 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74  a, using some ot
178b0 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a  her estimate.  *
178c0 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e  /.      whereRan
178d0 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  geScanEst(pParse
178e0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d  , pBuilder, pBtm
178f0 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20  , pTop, pNew);. 
17900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17910 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77  int nEq = ++pNew
17920 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
17930 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
17940 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
17950 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29  _EQ|WO_IN|WO_IS)
17960 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   );..      asser
17970 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73  t( pNew->nOut==s
17980 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20  aved_nOut );.   
17990 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
179a0 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20 70 50  uthProb<=0 && pP
179b0 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73  robe->aiColumn[s
179c0 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a  aved_nEq]>=0 ){.
179d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
179e0 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c  (eOp & WO_IN) ||
179f0 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20   nIn==0 );.     
17a00 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
17a10 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
17a20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
17a30 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
17a40 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ob;.        pNew
17a50 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
17a60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64       }else{.#ifd
17a70 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17a80 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
17a90 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
17aa0 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  nOut = 0;.      
17ab0 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20    if( nInMul==0 
17ac0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
17ad0 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  obe->nSample .  
17ae0 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e         && pNew->
17af0 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72  u.btree.nEq<=pPr
17b00 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a  obe->nSampleCol.
17b10 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65 4f           && ((eO
17b20 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c  p & WO_IN)==0 ||
17b30 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
17b40 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
17b50 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20  EP_xIsSelect)). 
17b60 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
17b70 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
17b80 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34  b, SQLITE_Stat34
17b90 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
17ba0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
17bb0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
17bc0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  r;.          if(
17bd0 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57   (eOp & (WO_EQ|W
17be0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29  O_ISNULL|WO_IS))
17bf0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
17c00 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
17c10 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
17c20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17c30 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b  ( eOp & WO_IS );
17c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
17c50 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
17c60 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
17c70 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
17c80 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
17c90 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
17ca0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
17cb0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
17cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
17cd0 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53     rc = whereInS
17ce0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
17cf0 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
17d00 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b  x.pList, &nOut);
17d10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17d20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
17d30 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
17d40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17d50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
17d60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
17d70 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  reak;          /
17d80 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  * Jump out of th
17d90 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a  e pTerm loop */.
17da0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f            if( nO
17db0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
17dc0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
17dd0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75  qlite3LogEst(nOu
17de0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
17df0 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73  if( pNew->nOut>s
17e00 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77  aved_nOut ) pNew
17e10 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
17e20 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Out;.           
17e30 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
17e40 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  In;.          }.
17e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17e60 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a    if( nOut==0 ).
17e70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
17e80 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
17e90 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65  >nOut += (pProbe
17ea0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45  ->aiRowLogEst[nE
17eb0 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52  q] - pProbe->aiR
17ec0 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29  owLogEst[nEq-1])
17ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17ee0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
17ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
17f00 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
17f10 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68  re is no likelih
17f20 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73  ood() value, ass
17f30 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20  ume that a .    
17f40 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20          ** "col 
17f50 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73  IS NULL" express
17f60 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63  ion matches twic
17f70 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a  e as many rows .
17f80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
17f90 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20  s (col=?). */.  
17fa0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
17fb0 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20  nOut += 10;.    
17fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17fd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
17fe0 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73  .    /* Set rCos
17ff0 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74  tIdx to the cost
18000 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c   of visiting sel
18010 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e  ected rows in in
18020 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20  dex. Add.    ** 
18030 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e  it to pNew->rRun
18040 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65  , which is curre
18050 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20  ntly set to the 
18060 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65  cost of the inde
18070 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e  x.    ** seek on
18080 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69  ly. Then, if thi
18090 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
180a0 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74  ing index, add t
180b0 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a  he cost of.    *
180c0 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72  * visiting the r
180d0 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
180e0 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72  table.  */.    r
180f0 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e  CostIdx = pNew->
18100 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70  nOut + 1 + (15*p
18110 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
18120 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54  /pSrc->pTab->szT
18130 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  abRow;.    pNew-
18140 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
18150 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
18160 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20  e, rCostIdx);.  
18170 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
18180 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44  lags & (WHERE_ID
18190 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b  X_ONLY|WHERE_IPK
181a0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))==0 ){.      p
181b0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
181c0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
181d0 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e  w->rRun, pNew->n
181e0 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d  Out + 16);.    }
181f0 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75  .    ApplyCostMu
18200 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
18210 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61  Run, pProbe->pTa
18220 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  ble->costMult);.
18230 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73  .    nOutUnadjus
18240 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  ted = pNew->nOut
18250 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
18260 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
18270 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
18280 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
18290 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f  ;.    whereLoopO
182a0 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69  utputAdjust(pBui
182b0 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c  lder->pWC, pNew,
182c0 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20   rSize);.    rc 
182d0 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
182e0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
182f0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  );..    if( pNew
18300 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
18310 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
18320 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  {.      pNew->nO
18330 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
18340 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18350 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
18360 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20  OutUnadjusted;. 
18370 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
18380 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
18390 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
183a0 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d  =0.     && pNew-
183b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72  >u.btree.nEq<pPr
183c0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  obe->nColumn.   
183d0 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c   ){.      whereL
183e0 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
183f0 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
18400 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b   pProbe, nInMul+
18410 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nIn);.    }.    
18420 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
18430 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20  ed_nOut;.#ifdef 
18440 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
18450 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
18460 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
18470 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64  alid = nRecValid
18480 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
18490 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61  New->prereq = sa
184a0 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e  ved_prereq;.  pN
184b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
184c0 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70  = saved_nEq;.  p
184d0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
184e0 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a  m = saved_nBtm;.
184f0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
18500 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f  nTop = saved_nTo
18510 70 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  p;.  pNew->nSkip
18520 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a   = saved_nSkip;.
18530 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
18540 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
18550 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20  .  pNew->nOut = 
18560 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e  saved_nOut;.  pN
18570 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
18580 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a  ed_nLTerm;..  /*
18590 20 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20   Consider using 
185a0 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74  a skip-scan if t
185b0 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
185c0 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
185d0 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61  ints.  ** availa
185e0 62 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ble for the left
185f0 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74  -most terms of t
18600 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66  he index, and if
18610 20 74 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a   the average.  *
18620 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65  * number of repe
18630 61 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d  ats in the left-
18640 6d 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61 74  most terms is at
18650 20 6c 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a   least 18. .  **
18660 0a 20 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20  .  ** The magic 
18670 6e 75 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c  number 18 is sel
18680 65 63 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73  ected on the bas
18690 69 73 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67  is that scanning
186a0 20 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73   17 rows.  ** is
186b0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71   almost always q
186c0 75 69 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69  uicker than an i
186d0 6e 64 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20  ndex seek (even 
186e0 74 68 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e  though if the in
186f0 64 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  dex.  ** contain
18700 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31  s fewer than 2^1
18710 37 20 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65  7 rows we assume
18720 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74   otherwise in ot
18730 68 65 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a  her parts of.  *
18740 2a 20 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64  * the code). And
18750 2c 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20  , even if it is 
18760 6e 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e  not, it should n
18770 6f 74 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73  ot be too much s
18780 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20  lower. .  ** On 
18790 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
187a0 74 68 65 20 65 78 74 72 61 20 73 65 65 6b 73 20  the extra seeks 
187b0 63 6f 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69  could end up bei
187c0 6e 67 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  ng significantly
187d0 0a 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e  .  ** more expen
187e0 73 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  sive.  */.  asse
187f0 72 74 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c  rt( 42==sqlite3L
18800 6f 67 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69  ogEst(18) );.  i
18810 66 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61  f( saved_nEq==sa
18820 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20  ved_nSkip.   && 
18830 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f  saved_nEq+1<pPro
18840 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26  be->nKeyCol.   &
18850 26 20 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70  & pProbe->noSkip
18860 53 63 61 6e 3d 3d 30 0a 20 20 20 26 26 20 4f 70  Scan==0.   && Op
18870 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
18880 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 6b 69  d(db, SQLITE_Ski
18890 70 53 63 61 6e 29 0a 20 20 20 26 26 20 70 50 72  pScan).   && pPr
188a0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
188b0 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34  [saved_nEq+1]>=4
188c0 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69  2  /* TUNING: Mi
188d0 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73  nimum for skip-s
188e0 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63  can */.   && (rc
188f0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69   = whereLoopResi
18900 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
18910 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53  w->nLTerm+1))==S
18920 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
18930 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a    LogEst nIter;.
18940 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
18950 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65  e.nEq++;.    pNe
18960 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20  w->nSkip++;.    
18970 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
18980 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30  w->nLTerm++] = 0
18990 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
189a0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49  ags |= WHERE_SKI
189b0 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72  PSCAN;.    nIter
189c0 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
189d0 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
189e0 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
189f0 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
18a00 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  q+1];.    pNew->
18a10 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20  nOut -= nIter;. 
18a20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42     /* TUNING:  B
18a30 65 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e  ecause uncertain
18a40 74 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69  ties in the esti
18a50 6d 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73  mates for skip-s
18a60 63 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20  can queries,.   
18a70 20 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20   ** add a 1.375 
18a80 66 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20  fudge factor to 
18a90 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73  make skip-scan s
18aa0 6c 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b  lightly less lik
18ab0 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65  ely. */.    nIte
18ac0 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72  r += 5;.    wher
18ad0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
18ae0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
18af0 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72  c, pProbe, nIter
18b00 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20   + nInMul);.    
18b10 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
18b20 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65  ed_nOut;.    pNe
18b30 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
18b40 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
18b50 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
18b60 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70  ved_nSkip;.    p
18b70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
18b80 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
18b90 7d 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  }..  WHERETRACE(
18ba0 30 78 38 30 30 2c 20 28 22 45 4e 44 20 25 73 2e  0x800, ("END %s.
18bb0 61 64 64 42 74 72 65 65 49 64 78 28 25 73 29 2c  addBtreeIdx(%s),
18bc0 20 6e 45 71 3d 25 64 2c 20 72 63 3d 25 64 5c 6e   nEq=%d, rc=%d\n
18bd0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18be0 20 20 20 20 20 20 20 20 20 70 50 72 6f 62 65 2d           pProbe-
18bf0 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20  >pTable->zName, 
18c00 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 73  pProbe->zName, s
18c10 61 76 65 64 5f 6e 45 71 2c 20 72 63 29 29 3b 0a  aved_nEq, rc));.
18c20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18c30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75  /*.** Return Tru
18c40 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
18c50 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20  ble that pIndex 
18c60 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20  might be useful 
18c70 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69  in.** implementi
18c80 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
18c90 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64  clause in pBuild
18ca0 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
18cb0 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64   False if pBuild
18cc0 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  er does not cont
18cd0 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ain an ORDER BY 
18ce0 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20  clause or.** if 
18cf0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
18d00 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65  for pIndex to be
18d10 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65   useful in imple
18d20 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  menting that.** 
18d30 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
18d40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
18d50 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
18d60 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  hOrderBy(.  Wher
18d70 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
18d80 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20  uilder,.  Index 
18d90 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69  *pIndex,.  int i
18da0 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72  Cursor.){.  Expr
18db0 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70  List *pOB;.  Exp
18dc0 72 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b  rList *aColExpr;
18dd0 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a  .  int ii, jj;..
18de0 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55    if( pIndex->bU
18df0 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72  nordered ) retur
18e00 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20  n 0;.  if( (pOB 
18e10 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
18e20 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30  fo->pOrderBy)==0
18e30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
18e40 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d  or(ii=0; ii<pOB-
18e50 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
18e60 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
18e70 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
18e80 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69  Collate(pOB->a[i
18e90 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
18ea0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
18eb0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
18ec0 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f  ->iTable==iCurso
18ed0 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r ){.      if( p
18ee0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
18ef0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
18f00 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70    for(jj=0; jj<p
18f10 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  Index->nKeyCol; 
18f20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
18f30 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
18f40 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  n==pIndex->aiCol
18f50 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e  umn[jj] ) return
18f60 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
18f70 7d 65 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45  }else if( (aColE
18f80 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43  xpr = pIndex->aC
18f90 6f 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20  olExpr)!=0 ){.  
18fa0 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
18fb0 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
18fc0 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
18fd0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43   if( pIndex->aiC
18fe0 6f 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58  olumn[jj]!=XN_EX
18ff0 50 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  PR ) continue;. 
19000 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
19010 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
19020 70 28 70 45 78 70 72 2c 61 43 6f 6c 45 78 70 72  p(pExpr,aColExpr
19030 2d 3e 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c 69 43  ->a[jj].pExpr,iC
19040 75 72 73 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20  ursor)==0 ){.   
19050 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19060 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19070 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
19080 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 43  eturn 0;.}../* C
19090 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
190a0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77   partial index w
190b0 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68  ith pPartIndexWh
190c0 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ere can be used.
190d0 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
190e0 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  t query.  Return
190f0 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20   true if it can 
19100 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  be and false if 
19110 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
19120 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61  nt whereUsablePa
19130 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69  rtialIndex(int i
19140 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65  Tab, WhereClause
19150 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68   *pWC, Expr *pWh
19160 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ere){.  int i;. 
19170 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
19180 6d 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m;.  Parse *pPar
19190 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  se = pWC->pWInfo
191a0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77 68 69 6c  ->pParse;.  whil
191b0 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54  e( pWhere->op==T
191c0 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 69 66 28  K_AND ){.    if(
191d0 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72   !whereUsablePar
191e0 74 69 61 6c 49 6e 64 65 78 28 69 54 61 62 2c 70  tialIndex(iTab,p
191f0 57 43 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66 74  WC,pWhere->pLeft
19200 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
19210 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72    pWhere = pWher
19220 65 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20  e->pRight;.  }. 
19230 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
19240 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
19250 45 6e 61 62 6c 65 51 50 53 47 20 29 20 70 50 61  EnableQPSG ) pPa
19260 72 73 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  rse = 0;.  for(i
19270 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
19280 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
19290 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
192a0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
192b0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
192c0 20 20 20 69 66 28 20 28 21 45 78 70 72 48 61 73     if( (!ExprHas
192d0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
192e0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20  EP_FromJoin) || 
192f0 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
19300 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29 0a 20 20  nTable==iTab).  
19310 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
19320 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61  rImpliesExpr(pPa
19330 72 73 65 2c 20 70 45 78 70 72 2c 20 70 57 68 65  rse, pExpr, pWhe
19340 72 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20 29  re, iTab) .    )
19350 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
19360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
19370 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
19380 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
19390 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
193a0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
193b0 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
193c0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
193d0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 42  identified by pB
193e0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
193f0 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
19400 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
19410 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20   be.** a b-tree 
19420 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72  table, not a vir
19430 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
19440 2a 20 54 68 65 20 63 6f 73 74 73 20 28 57 68 65  * The costs (Whe
19450 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20  reLoop.rRun) of 
19460 74 68 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73  the b-tree loops
19470 20 61 64 64 65 64 20 62 79 20 74 68 69 73 20 66   added by this f
19480 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63  unction.** are c
19490 61 6c 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c  alculated as fol
194a0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  lows:.**.** For 
194b0 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73  a full scan, ass
194c0 75 6d 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  uming the table 
194d0 28 6f 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61  (or index) conta
194e0 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a  ins nRow rows:.*
194f0 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
19500 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20  nRow * 3.0      
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
19520 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
19530 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
19540 52 6f 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20  Row * K         
19550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
19560 73 63 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67  scan of covering
19570 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f   index.**     co
19580 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33  st = nRow * (K+3
19590 2e 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20  .0)             
195a0 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f     // scan of no
195b0 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
195c0 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69  .**.** where K i
195d0 73 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65  s a value betwee
195e0 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65  n 1.1 and 3.0 se
195f0 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  t based on the r
19600 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69  elative .** esti
19610 6d 61 74 65 64 20 61 76 65 72 61 67 65 20 73 69  mated average si
19620 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
19630 61 6e 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64  and table record
19640 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  s..**.** For an 
19650 69 6e 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72  index scan, wher
19660 65 20 6e 56 69 73 69 74 20 69 73 20 74 68 65 20  e nVisit is the 
19670 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  number of index 
19680 72 6f 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20  rows visited.** 
19690 62 79 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64  by the scan, and
196a0 20 6e 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75   nSeek is the nu
196b0 6d 62 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65  mber of seek ope
196c0 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  rations required
196d0 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65   on .** the inde
196e0 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20  x b-tree:.**.** 
196f0 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b      cost = nSeek
19700 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20   * (log(nRow) + 
19710 4b 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20  K * nVisit)     
19720 20 20 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67       // covering
19730 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f   index.**     co
19740 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
19750 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30  g(nRow) + (K+3.0
19760 29 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f  ) * nVisit)    /
19770 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  / non-covering i
19780 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  ndex.**.** Norma
19790 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e  lly, nSeek is 1.
197a0 20 6e 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72   nSeek values gr
197b0 65 61 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d  eater than 1 com
197c0 65 20 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a  e about if the .
197d0 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
197e0 69 6e 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28  includes "x IN (
197f0 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65  ....)" terms use
19800 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78  d in place of "x
19810 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a  =?". Or when .**
19820 20 69 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20   implicit "x IN 
19830 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
19840 62 6c 29 22 20 74 65 72 6d 73 20 61 72 65 20 61  bl)" terms are a
19850 64 64 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63  dded for skip-sc
19860 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ans..**.** The e
19870 73 74 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20  stimated values 
19880 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e  (nRow, nVisit, n
19890 53 65 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74  Seek) often cont
198a0 61 69 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75  ain a large amou
198b0 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61  nt.** of uncerta
198c0 69 6e 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20  inty.  For this 
198d0 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20  reason, scoring 
198e0 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70  is designed to p
198f0 69 63 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a  ick plans that.*
19900 2a 20 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20  * "do the least 
19910 68 61 72 6d 22 20 69 66 20 74 68 65 20 65 73 74  harm" if the est
19920 69 6d 61 74 65 73 20 61 72 65 20 69 6e 61 63 63  imates are inacc
19930 75 72 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d  urate.  For exam
19940 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52  ple, a.** log(nR
19950 6f 77 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d  ow) factor is om
19960 69 74 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e  itted from a non
19970 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
19980 73 63 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  scan in order to
19990 0a 2a 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f  .** bias the sco
199a0 72 69 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66  ring in favor of
199b0 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c   using an index,
199c0 20 73 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74   since the worst
199d0 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d  -case.** perform
199e0 61 6e 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e  ance of using an
199f0 20 69 6e 64 65 78 20 69 73 20 66 61 72 20 62 65   index is far be
19a00 74 74 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f  tter than the wo
19a10 72 73 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d  rst-case perform
19a20 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c  ance.** of a ful
19a30 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f  l table scan..*/
19a40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
19a50 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20  eLoopAddBtree(. 
19a60 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
19a70 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20  r *pBuilder, /* 
19a80 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
19a90 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
19aa0 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 20 20  tmask mPrereq   
19ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
19ac0 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73  ra prerequesites
19ad0 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20   for using this 
19ae0 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
19af0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
19b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
19b10 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
19b20 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
19b30 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
19b40 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
19b50 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
19b60 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50  ng */.  Index sP
19b70 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
19b80 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e      /* A fake in
19b90 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  dex object for t
19ba0 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
19bb0 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77  /.  LogEst aiRow
19bc0 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20  EstPk[2];       
19bd0 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45  /* The aiRowLogE
19be0 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
19bf0 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
19c00 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b    i16 aiColumnPk
19c10 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
19c20 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
19c30 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
19c40 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c   index */.  SrcL
19c50 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
19c60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
19c70 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
19c80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
19c90 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54  tem *pSrc;  /* T
19ca0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62  he FROM clause b
19cb0 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64  tree term to add
19cc0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
19cd0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
19ce0 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
19cf0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
19d00 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
19d10 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
19d20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
19d30 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78  /.  int iSortIdx
19d40 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
19d50 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
19d60 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20  */.  int b;     
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d80 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61   /* A boolean va
19d90 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  lue */.  LogEst 
19da0 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
19db0 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f       /* number o
19dc0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
19dd0 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
19de0 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
19df0 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
19e00 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
19e10 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
19e20 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  able */.  WhereC
19e30 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
19e40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
19e50 73 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  sed WHERE clause
19e60 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
19e70 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
19e80 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
19e90 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20   queried */.  . 
19ea0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
19eb0 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f  ->pNew;.  pWInfo
19ec0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
19ed0 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  nfo;.  pTabList 
19ee0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
19ef0 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61  st;.  pSrc = pTa
19f00 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
19f10 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20  >iTab;.  pTab = 
19f20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
19f30 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
19f40 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49 73  C;.  assert( !Is
19f50 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54  Virtual(pSrc->pT
19f60 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ab) );..  if( pS
19f70 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 7b 0a  rc->pIBIndex ){.
19f80 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45      /* An INDEXE
19f90 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63  D BY clause spec
19fa0 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c  ifies a particul
19fb0 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  ar index to use 
19fc0 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  */.    pProbe = 
19fd0 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3b 0a  pSrc->pIBIndex;.
19fe0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73    }else if( !Has
19ff0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
1a000 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62     pProbe = pTab
1a010 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
1a020 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
1a030 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
1a040 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
1a050 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
1a060 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
1a070 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
1a080 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
1a090 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
1a0a0 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
1a0b0 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
1a0c0 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
1a0d0 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
1a0e0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
1a0f0 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
1a100 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
1a110 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
1a120 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
1a130 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1a140 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
1a150 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
1a160 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
1a170 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
1a180 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
1a190 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c  .    sPk.nKeyCol
1a1a0 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43   = 1;.    sPk.nC
1a1b0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73  olumn = 1;.    s
1a1c0 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61  Pk.aiColumn = &a
1a1d0 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73  iColumnPk;.    s
1a1e0 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  Pk.aiRowLogEst =
1a1f0 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20   aiRowEstPk;.   
1a200 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f   sPk.onError = O
1a210 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73  E_Replace;.    s
1a220 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  Pk.pTable = pTab
1a230 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49 64 78 52  ;.    sPk.szIdxR
1a240 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62  ow = pTab->szTab
1a250 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Row;.    aiRowEs
1a260 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e  tPk[0] = pTab->n
1a270 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61  RowLogEst;.    a
1a280 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30  iRowEstPk[1] = 0
1a290 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20 70  ;.    pFirst = p
1a2a0 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  Src->pTab->pInde
1a2b0 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  x;.    if( pSrc-
1a2c0 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
1a2d0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1a2e0 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  e real indices o
1a2f0 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  f the table are 
1a300 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20  only considered 
1a310 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  if the.      ** 
1a320 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c  NOT INDEXED qual
1a330 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64  ifier is omitted
1a340 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63   from the FROM c
1a350 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73  lause */.      s
1a360 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73  Pk.pNext = pFirs
1a370 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72  t;.    }.    pPr
1a380 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a  obe = &sPk;.  }.
1a390 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e    rSize = pTab->
1a3a0 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c  nRowLogEst;.  rL
1a3b0 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
1a3c0 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66  rSize);..#ifndef
1a3d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a3e0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f  OMATIC_INDEX.  /
1a3f0 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
1a400 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  xes */.  if( !pB
1a410 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 20  uilder->pOrSet  
1a420 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20      /* Not part 
1a430 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a  of an OR optimiz
1a440 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28  ation */.   && (
1a450 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1a460 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
1a470 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20 26  BCLAUSE)==0.   &
1a480 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  & (pWInfo->pPars
1a490 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1a4a0 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29  QLITE_AutoIndex)
1a4b0 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e  !=0.   && pSrc->
1a4c0 70 49 42 49 6e 64 65 78 3d 3d 30 20 20 20 20 20  pIBIndex==0     
1a4d0 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e 44 45 58   /* Has no INDEX
1a4e0 45 44 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ED BY clause */.
1a4f0 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
1a500 6e 6f 74 49 6e 64 65 78 65 64 20 20 20 2f 2a 20  notIndexed   /* 
1a510 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58  Has no NOT INDEX
1a520 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  ED clause */.   
1a530 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
1a540 29 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  )         /* Not
1a550 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1a560 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a 20 57 68  able. (FIXME: Wh
1a570 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26  y not?) */.   &&
1a580 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72   !pSrc->fg.isCor
1a590 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61  related /* Not a
1a5a0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
1a5b0 75 65 72 79 20 2a 2f 0a 20 20 20 26 26 20 21 70  uery */.   && !p
1a5c0 53 72 63 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  Src->fg.isRecurs
1a5d0 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65  ive  /* Not a re
1a5e0 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74  cursive common t
1a5f0 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e  able expression.
1a600 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20   */.  ){.    /* 
1a610 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e  Generate auto-in
1a620 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a  dex WhereLoops *
1a630 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
1a640 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72  *pTerm;.    Wher
1a650 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20  eTerm *pWCEnd = 
1a660 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
1a670 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  erm;.    for(pTe
1a680 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53  rm=pWC->a; rc==S
1a690 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
1a6a0 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
1a6b0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
1a6c0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
1a6d0 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
1a6e0 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  f ) continue;.  
1a6f0 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
1a700 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
1a710 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20   pSrc, 0) ){.   
1a720 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
1a730 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
1a740 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
1a750 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
1a760 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
1a770 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  x = 0;.        p
1a780 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
1a790 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
1a7a0 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
1a7b0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
1a7c0 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f  ING: One-time co
1a7d0 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67  st for computing
1a7e0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
1a7f0 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20 20  ndex is.        
1a800 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20  ** estimated to 
1a810 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77  be X*N*log2(N) w
1a820 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
1a830 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a  mber of rows in.
1a840 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74          ** the t
1a850 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78  able being index
1a860 65 64 20 61 6e 64 20 77 68 65 72 65 20 58 20 69  ed and where X i
1a870 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20  s 7 (LogEst=28) 
1a880 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20  for normal.     
1a890 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20     ** tables or 
1a8a0 30 2e 35 20 28 4c 6f 67 45 73 74 3d 2d 31 30 29  0.5 (LogEst=-10)
1a8b0 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73   for views and s
1a8c0 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
1a8d0 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
1a8e0 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72   of X is smaller
1a8f0 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73   for views and s
1a900 75 62 71 75 65 72 69 65 73 20 73 6f 20 74 68 61  ubqueries so tha
1a910 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  t the query plan
1a920 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ner.        ** w
1a930 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72  ill be more aggr
1a940 65 73 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e  essive about gen
1a950 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69  erating automati
1a960 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20  c indexes for.  
1a970 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f        ** those o
1a980 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68  bjects, since th
1a990 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74  ere is no opport
1a9a0 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73 63 68  unity to add sch
1a9b0 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ema.        ** i
1a9c0 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65  ndexes on subque
1a9d0 72 69 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20  ries and views. 
1a9e0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
1a9f0 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69  >rSetup = rLogSi
1aa00 7a 65 20 2b 20 72 53 69 7a 65 3b 0a 20 20 20 20  ze + rSize;.    
1aa10 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
1aa20 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61  elect==0 && (pTa
1aa30 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
1aa40 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29  _Ephemeral)==0 )
1aa50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
1aa60 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 38 3b 0a  ->rSetup += 28;.
1aa70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1aa80 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
1aa90 53 65 74 75 70 20 2d 3d 20 31 30 3b 0a 20 20 20  Setup -= 10;.   
1aaa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41       }.        A
1aab0 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
1aac0 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c  er(pNew->rSetup,
1aad0 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
1aae0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1aaf0 65 77 2d 3e 72 53 65 74 75 70 3c 30 20 29 20 70  ew->rSetup<0 ) p
1ab00 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1ab10 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
1ab20 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c  NG: Each index l
1ab30 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20  ookup yields 20 
1ab40 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1ab50 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20  e.  This.       
1ab60 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e   ** is more than
1ab70 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73   the usual guess
1ab80 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e   of 10 rows, sin
1ab90 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61  ce we have no wa
1aba0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  y.        ** of 
1abb0 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65  knowing how sele
1abc0 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20  ctive the index 
1abd0 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20  will ultimately 
1abe0 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20  be.  It would.  
1abf0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20        ** not be 
1ac00 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20  unreasonable to 
1ac10 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20  make this value 
1ac20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a  much larger. */.
1ac30 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
1ac40 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74  ut = 43;  assert
1ac50 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 43==sqlite3Log
1ac60 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20  Est(20) );.     
1ac70 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
1ac80 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1ac90 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e  (rLogSize,pNew->
1aca0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70  nOut);.        p
1acb0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1acc0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
1acd0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
1ace0 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71 20  rereq = mPrereq 
1acf0 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  | pTerm->prereqR
1ad00 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
1ad10 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1ad20 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1ad30 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
1ad40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
1ad50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ad60 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
1ad70 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
1ad80 6c 6c 20 69 6e 64 69 63 65 73 2e 20 49 66 20 74  ll indices. If t
1ad90 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
1ada0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
1adb0 68 65 6e 20 6f 6e 6c 79 20 0a 20 20 2a 2a 20 63  hen only .  ** c
1adc0 6f 6e 73 69 64 65 72 20 69 6e 64 65 78 20 70 50  onsider index pP
1add0 72 6f 62 65 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  robe.  */.  for(
1ade0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1adf0 26 26 20 70 50 72 6f 62 65 3b 20 0a 20 20 20 20  && pProbe; .    
1ae00 20 20 70 50 72 6f 62 65 3d 28 70 53 72 63 2d 3e    pProbe=(pSrc->
1ae10 70 49 42 49 6e 64 65 78 20 3f 20 30 20 3a 20 70  pIBIndex ? 0 : p
1ae20 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 2c 20 69  Probe->pNext), i
1ae30 53 6f 72 74 49 64 78 2b 2b 0a 20 20 29 7b 0a 20  SortIdx++.  ){. 
1ae40 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70     if( pProbe->p
1ae50 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a  PartIdxWhere!=0.
1ae60 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73       && !whereUs
1ae70 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
1ae80 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20  (pSrc->iCursor, 
1ae90 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61  pWC, pProbe->pPa
1aea0 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20  rtIdxWhere) ){. 
1aeb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1aec0 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d  New->iTab!=pSrc-
1aed0 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20  >iCursor );  /* 
1aee0 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64 39  See ticket [98d9
1aef0 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20  73b8f5] */.     
1af00 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50   continue;  /* P
1af10 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61  artial index ina
1af20 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
1af30 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  his query */.   
1af40 20 7d 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62   }.    if( pProb
1af50 65 2d 3e 62 4e 6f 51 75 65 72 79 20 29 20 63 6f  e->bNoQuery ) co
1af60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 53 69 7a  ntinue;.    rSiz
1af70 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  e = pProbe->aiRo
1af80 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20  wLogEst[0];.    
1af90 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
1afa0 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  q = 0;.    pNew-
1afb0 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20  >u.btree.nBtm = 
1afc0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  0;.    pNew->u.b
1afd0 74 72 65 65 2e 6e 54 6f 70 20 3d 20 30 3b 0a 20  tree.nTop = 0;. 
1afe0 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d     pNew->nSkip =
1aff0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c   0;.    pNew->nL
1b000 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Term = 0;.    pN
1b010 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
1b020 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74  ;.    pNew->rSet
1b030 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  up = 0;.    pNew
1b040 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72  ->prereq = mPrer
1b050 65 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  eq;.    pNew->nO
1b060 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
1b070 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
1b080 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20  ndex = pProbe;. 
1b090 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68     b = indexMigh
1b0a0 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
1b0b0 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62  (pBuilder, pProb
1b0c0 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
1b0d0 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e  );.    /* The ON
1b0e0 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c  EPASS_DESIRED fl
1b0f0 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73  ags never occurs
1b100 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f   together with O
1b110 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61  RDER BY */.    a
1b120 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e  ssert( (pWInfo->
1b130 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1b140 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
1b150 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29  ED)==0 || b==0 )
1b160 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  ;.    if( pProbe
1b170 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20  ->tnum<=0 ){.   
1b180 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72     /* Integer pr
1b190 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
1b1a0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  */.      pNew->w
1b1b0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
1b1c0 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75  PK;..      /* Fu
1b1d0 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f  ll table scan */
1b1e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  .      pNew->iSo
1b1f0 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
1b200 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20  tIdx : 0;.      
1b210 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
1b220 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63  of full table sc
1b230 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a  an is (N*3.0). *
1b240 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  /.      pNew->rR
1b250 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b  un = rSize + 16;
1b260 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74  .      ApplyCost
1b270 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
1b280 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73  >rRun, pTab->cos
1b290 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68  tMult);.      wh
1b2a0 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
1b2b0 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72  ust(pWC, pNew, r
1b2c0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20  Size);.      rc 
1b2d0 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
1b2e0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
1b2f0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
1b300 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
1b310 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
1b320 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
1b330 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20      Bitmask m;. 
1b340 20 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d       if( pProbe-
1b350 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20  >isCovering ){. 
1b360 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
1b370 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58  lags = WHERE_IDX
1b380 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e  _ONLY | WHERE_IN
1b390 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d  DEXED;.        m
1b3a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1b3b0 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70  e{.        m = p
1b3c0 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 70  Src->colUsed & p
1b3d0 50 72 6f 62 65 2d 3e 63 6f 6c 4e 6f 74 49 64 78  Probe->colNotIdx
1b3e0 65 64 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ed;.        pNew
1b3f0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d  ->wsFlags = (m==
1b400 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f  0) ? (WHERE_IDX_
1b410 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58  ONLY|WHERE_INDEX
1b420 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45  ED) : WHERE_INDE
1b430 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  XED;.      }..  
1b440 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e      /* Full scan
1b450 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20   via index */.  
1b460 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20      if( b.      
1b470 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54   || !HasRowid(pT
1b480 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  ab).       || pP
1b490 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
1b4a0 65 72 65 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  ere!=0.       ||
1b4b0 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20   ( m==0.        
1b4c0 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f   && pProbe->bUno
1b4d0 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
1b4e0 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73     && (pProbe->s
1b4f0 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a  zIdxRow<pTab->sz
1b500 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20  TabRow).        
1b510 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
1b520 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1b530 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
1b540 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
1b550 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b560 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20  fig.bUseCis.    
1b570 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
1b580 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e  tionEnabled(pWIn
1b590 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  fo->pParse->db, 
1b5a0 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53  SQLITE_CoverIdxS
1b5b0 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29  can).          )
1b5c0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1b5d0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
1b5e0 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20   = b ? iSortIdx 
1b5f0 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  : 0;..        /*
1b600 20 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73   The cost of vis
1b610 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
1b620 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65  rows is N*K, whe
1b630 72 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20  re K is.        
1b640 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61  ** between 1.1 a
1b650 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e  nd 3.0, dependin
1b660 67 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  g on the relativ
1b670 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20  e sizes of the. 
1b680 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20         ** index 
1b690 61 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20  and table rows. 
1b6a0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
1b6b0 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
1b6c0 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e  1 + (15*pProbe->
1b6d0 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e  szIdxRow)/pTab->
1b6e0 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20  szTabRow;.      
1b6f0 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20    if( m!=0 ){.  
1b700 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1b710 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65  is is a non-cove
1b720 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c  ring index scan,
1b730 20 61 64 64 20 69 6e 20 74 68 65 20 63 6f 73 74   add in the cost
1b740 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   of.          **
1b750 20 64 6f 69 6e 67 20 74 61 62 6c 65 20 6c 6f 6f   doing table loo
1b760 6b 75 70 73 2e 20 20 54 68 65 20 63 6f 73 74 20  kups.  The cost 
1b770 77 69 6c 6c 20 62 65 20 33 78 20 74 68 65 20 6e  will be 3x the n
1b780 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
1b790 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e 20 20     ** lookups.  
1b7a0 54 61 6b 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e  Take into accoun
1b7b0 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  t WHERE clause t
1b7c0 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65  erms that can be
1b7d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
1b7e0 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 6a 75  tisfied using ju
1b7f0 73 74 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  st the index, an
1b800 64 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65  d that do not re
1b810 71 75 69 72 65 20 61 0a 20 20 20 20 20 20 20 20  quire a.        
1b820 20 20 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f 6b 75    ** table looku
1b830 70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  p. */.          
1b840 4c 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75 70 20 3d  LogEst nLookup =
1b850 20 72 53 69 7a 65 20 2b 20 31 36 3b 20 20 2f 2a   rSize + 16;  /*
1b860 20 42 61 73 65 20 63 6f 73 74 3a 20 20 4e 2a 33   Base cost:  N*3
1b870 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
1b880 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
1b890 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d  int iCur = pSrc-
1b8a0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
1b8b0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
1b8c0 2a 70 57 43 32 20 3d 20 26 70 57 49 6e 66 6f 2d  *pWC2 = &pWInfo-
1b8d0 3e 73 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20  >sWC;.          
1b8e0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 43  for(ii=0; ii<pWC
1b8f0 32 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  2->nTerm; ii++){
1b900 0a 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65  .            Whe
1b910 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
1b920 26 70 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a 20 20  &pWC2->a[ii];.  
1b930 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
1b940 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65  qlite3ExprCovere
1b950 64 42 79 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e  dByIndex(pTerm->
1b960 70 45 78 70 72 2c 20 69 43 75 72 2c 20 70 50 72  pExpr, iCur, pPr
1b970 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  obe) ){.        
1b980 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b990 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b9a0 20 20 20 20 20 20 20 2f 2a 20 70 54 65 72 6d 20         /* pTerm 
1b9b0 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64  can be evaluated
1b9c0 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20   using just the 
1b9d0 69 6e 64 65 78 2e 20 20 53 6f 20 72 65 64 75 63  index.  So reduc
1b9e0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1b9f0 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75   the expected nu
1ba00 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 20 6c 6f  mber of table lo
1ba10 6f 6b 75 70 73 20 61 63 63 6f 72 64 69 6e 67 6c  okups accordingl
1ba20 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  y */.           
1ba30 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
1ba40 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20  hProb<=0 ){.    
1ba50 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75            nLooku
1ba60 70 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  p += pTerm->trut
1ba70 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  hProb;.         
1ba80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ba90 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 2d          nLookup-
1baa0 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  -;.             
1bab0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
1bac0 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
1bad0 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b 75 70 20  O_IS) ) nLookup 
1bae0 2d 3d 20 31 39 3b 0a 20 20 20 20 20 20 20 20 20  -= 19;.         
1baf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1bb00 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
1bb10 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
1bb20 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1bb30 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  Add(pNew->rRun, 
1bb40 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20 20 20 20  nLookup);.      
1bb50 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
1bb60 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
1bb70 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
1bb80 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
1bb90 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
1bba0 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
1bbb0 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
1bbc0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1bbd0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1bbe0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
1bbf0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
1bc00 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
1bc10 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
1bc20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1bc30 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64     pBuilder->bld
1bc40 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72  Flags = 0;.    r
1bc50 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1bc60 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
1bc70 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
1bc80 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  e, 0);.    if( p
1bc90 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67  Builder->bldFlag
1bca0 73 3d 3d 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49  s==SQLITE_BLDF_I
1bcb0 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
1bcc0 2f 2a 20 49 66 20 61 20 6e 6f 6e 2d 75 6e 69 71  /* If a non-uniq
1bcd0 75 65 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  ue index is used
1bce0 2c 20 6f 72 20 69 66 20 61 20 70 72 65 66 69 78  , or if a prefix
1bcf0 20 6f 66 20 74 68 65 20 6b 65 79 20 66 6f 72 0a   of the key for.
1bd00 20 20 20 20 20 20 2a 2a 20 75 6e 69 71 75 65 20        ** unique 
1bd10 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 28 6d  index is used (m
1bd20 61 6b 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  aking the index 
1bd30 66 75 6e 63 74 69 6f 6e 61 6c 6c 79 20 6e 6f 6e  functionally non
1bd40 2d 75 6e 69 71 75 65 29 0a 20 20 20 20 20 20 2a  -unique).      *
1bd50 2a 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74  * then the sqlit
1bd60 65 5f 73 74 61 74 31 20 64 61 74 61 20 62 65 63  e_stat1 data bec
1bd70 6f 6d 65 73 20 69 6d 70 6f 72 74 61 6e 74 20 66  omes important f
1bd80 6f 72 20 73 63 6f 72 69 6e 67 20 74 68 65 0a 20  or scoring the. 
1bd90 20 20 20 20 20 2a 2a 20 70 6c 61 6e 20 2a 2f 0a       ** plan */.
1bda0 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
1bdb0 6c 61 67 73 20 7c 3d 20 54 46 5f 53 74 61 74 73  lags |= TF_Stats
1bdc0 55 73 65 64 3b 0a 20 20 20 20 7d 0a 23 69 66 64  Used;.    }.#ifd
1bdd0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1bde0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
1bdf0 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34      sqlite3Stat4
1be00 50 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64  ProbeFree(pBuild
1be10 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70  er->pRec);.    p
1be20 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
1be30 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69  id = 0;.    pBui
1be40 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a  lder->pRec = 0;.
1be50 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
1be60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1be70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1be80 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a  IRTUALTABLE../*.
1be90 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78  ** Argument pIdx
1bea0 49 6e 66 6f 20 69 73 20 61 6c 72 65 61 64 79 20  Info is already 
1beb0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
1bec0 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ll constraints t
1bed0 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73  hat may.** be us
1bee0 65 64 20 62 79 20 74 68 65 20 76 69 72 74 75 61  ed by the virtua
1bef0 6c 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  l table identifi
1bf00 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
1bf10 70 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68 69 73  pNew->iTab. This
1bf20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72  .** function mar
1bf30 6b 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 74  ks a subset of t
1bf40 68 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  hose constraints
1bf50 20 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73   usable, invokes
1bf60 20 74 68 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64   the.** xBestInd
1bf70 65 78 20 6d 65 74 68 6f 64 20 61 6e 64 20 61 64  ex method and ad
1bf80 64 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ds the returned 
1bf90 70 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64 65 72  plan to pBuilder
1bfa0 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72  ..**.** A constr
1bfb0 61 69 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 75  aint is marked u
1bfc0 73 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  sable if:.**.** 
1bfd0 20 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d 55 73    * Argument mUs
1bfe0 61 62 6c 65 20 69 6e 64 69 63 61 74 65 73 20 74  able indicates t
1bff0 68 61 74 20 69 74 73 20 70 72 65 72 65 71 75 69  hat its prerequi
1c000 73 69 74 65 73 20 61 72 65 20 61 76 61 69 6c 61  sites are availa
1c010 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ble, and.**.**  
1c020 20 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65   * It is not one
1c030 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
1c040 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  s specified in t
1c050 68 65 20 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b  he mExclude mask
1c060 20 70 61 73 73 65 64 0a 2a 2a 20 20 20 20 20 61   passed.**     a
1c070 73 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  s the fourth arg
1c080 75 6d 65 6e 74 20 28 77 68 69 63 68 20 69 6e 20  ument (which in 
1c090 70 72 61 63 74 69 63 65 20 69 73 20 65 69 74 68  practice is eith
1c0a0 65 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a  er WO_IN or 0)..
1c0b0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d  **.** Argument m
1c0c0 50 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b  Prereq is a mask
1c0d0 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
1c0e0 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1c0f0 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69  before the.** vi
1c100 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 71  rtual table in q
1c110 75 65 73 74 69 6f 6e 2e 20 54 68 65 73 65 20 61  uestion. These a
1c120 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
1c130 70 6c 61 6e 73 20 70 72 65 72 65 71 75 69 73 69  plans prerequisi
1c140 74 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74  tes.** before it
1c150 20 69 73 20 61 64 64 65 64 20 74 6f 20 70 42 75   is added to pBu
1c160 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74  ilder..**.** Out
1c170 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70  put parameter *p
1c180 62 49 6e 20 69 73 20 73 65 74 20 74 6f 20 74 72  bIn is set to tr
1c190 75 65 20 69 66 20 74 68 65 20 70 6c 61 6e 20 61  ue if the plan a
1c1a0 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72  dded to pBuilder
1c1b0 0a 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  .** uses one or 
1c1c0 6d 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73  more WO_IN terms
1c1d0 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
1c1e0 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1c1f0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1c200 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68  VirtualOne(.  Wh
1c210 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1c220 70 42 75 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d  pBuilder,.  Bitm
1c230 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20  ask mPrereq,    
1c240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1c250 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68  ask of tables th
1c260 61 74 20 6d 75 73 74 20 62 65 20 75 73 65 64 2e  at must be used.
1c270 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55   */.  Bitmask mU
1c280 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  sable,          
1c290 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1c2a0 20 75 73 61 62 6c 65 20 74 61 62 6c 65 73 20 2a   usable tables *
1c2b0 2f 0a 20 20 75 31 36 20 6d 45 78 63 6c 75 64 65  /.  u16 mExclude
1c2c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c2d0 20 20 20 20 2f 2a 20 45 78 63 6c 75 64 65 20 74      /* Exclude t
1c2e0 65 72 6d 73 20 75 73 69 6e 67 20 74 68 65 73 65  erms using these
1c2f0 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
1c300 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1c310 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20  fo *pIdxInfo,   
1c320 2f 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a  /* Populated obj
1c330 65 63 74 20 66 6f 72 20 78 42 65 73 74 49 6e 64  ect for xBestInd
1c340 65 78 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f  ex */.  u16 mNoO
1c350 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mit,            
1c360 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1c370 74 20 6f 6d 69 74 20 74 68 65 73 65 20 63 6f 6e  t omit these con
1c380 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
1c390 74 20 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20  t *pbIn         
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c3b0 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c   OUT: True if pl
1c3c0 61 6e 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e  an uses an IN(..
1c3d0 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68  .) op */.){.  Wh
1c3e0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
1c3f0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
1c400 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
1c410 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
1c420 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
1c430 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
1c440 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
1c450 73 61 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70  sage *pUsage = p
1c460 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1c470 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74  aintUsage;.  int
1c480 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d   i;.  int mxTerm
1c490 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1c4a0 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c  ITE_OK;.  WhereL
1c4b0 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69  oop *pNew = pBui
1c4c0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61  lder->pNew;.  Pa
1c4d0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42  rse *pParse = pB
1c4e0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
1c4f0 70 50 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74  pParse;.  struct
1c500 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1c510 53 72 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d  Src = &pBuilder-
1c520 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
1c530 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
1c540 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
1c550 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
1c560 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  nConstraint;..  
1c570 61 73 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65  assert( (mUsable
1c580 20 26 20 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72   & mPrereq)==mPr
1c590 65 72 65 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20  ereq );.  *pbIn 
1c5a0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65  = 0;.  pNew->pre
1c5b0 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a  req = mPrereq;..
1c5c0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75 73 61    /* Set the usa
1c5d0 62 6c 65 20 66 6c 61 67 20 6f 6e 20 74 68 65 20  ble flag on the 
1c5e0 73 75 62 73 65 74 20 6f 66 20 63 6f 6e 73 74 72  subset of constr
1c5f0 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65 64  aints identified
1c600 20 62 79 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65   by .  ** argume
1c610 6e 74 73 20 6d 55 73 61 62 6c 65 20 61 6e 64 20  nts mUsable and 
1c620 6d 45 78 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70  mExclude. */.  p
1c630 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
1c640 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1c650 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
1c660 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1c670 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
1c680 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1c690 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
1c6a0 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
1c6b0 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
1c6c0 5b 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d  [pIdxCons->iTerm
1c6d0 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 49 64  Offset];.    pId
1c6e0 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
1c6f0 30 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  0;.    if( (pTer
1c700 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
1c710 20 6d 55 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d   mUsable)==pTerm
1c720 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 0a 20  ->prereqRight . 
1c730 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
1c740 4f 70 65 72 61 74 6f 72 20 26 20 6d 45 78 63 6c  Operator & mExcl
1c750 75 64 65 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  ude)==0.    ){. 
1c760 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
1c770 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  sable = 1;.    }
1c780 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
1c790 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74  alize the output
1c7a0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
1c7b0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1c7c0 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  o structure */. 
1c7d0 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
1c7e0 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
1c7f0 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74  [0])*nConstraint
1c800 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
1c810 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1c820 65 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20  eIdxStr==0 );.  
1c830 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
1c840 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
1c850 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
1c860 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1c870 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
1c880 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
1c890 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
1c8a0 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75  E_BIG_DBL / (dou
1c8b0 62 6c 65 29 32 3b 0a 20 20 70 49 64 78 49 6e 66  ble)2;.  pIdxInf
1c8c0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
1c8d0 20 3d 20 32 35 3b 0a 20 20 70 49 64 78 49 6e 66   = 25;.  pIdxInf
1c8e0 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b  o->idxFlags = 0;
1c8f0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c  .  pIdxInfo->col
1c900 55 73 65 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  Used = (sqlite3_
1c910 69 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55  int64)pSrc->colU
1c920 73 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  sed;..  /* Invok
1c930 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
1c940 62 6c 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  ble xBestIndex()
1c950 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20   method */.  rc 
1c960 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  = vtabBestIndex(
1c970 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 70 54  pParse, pSrc->pT
1c980 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
1c990 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1c9a0 20 72 63 3b 0a 0a 20 20 6d 78 54 65 72 6d 20 3d   rc;..  mxTerm =
1c9b0 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70   -1;.  assert( p
1c9c0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
1c9d0 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f  nstraint );.  fo
1c9e0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
1c9f0 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
1ca00 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
1ca10 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
1ca20 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  mitMask = 0;.  p
1ca30 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
1ca40 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1ca50 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
1ca60 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1ca70 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
1ca80 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1ca90 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
1caa0 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b  {.    int iTerm;
1cab0 0a 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20  .    if( (iTerm 
1cac0 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
1cad0 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
1cae0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1caf0 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69   *pTerm;.      i
1cb00 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d  nt j = pIdxCons-
1cb10 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
1cb20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e      if( iTerm>=n
1cb30 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  Constraint.     
1cb40 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20    || j<0.       
1cb50 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
1cb60 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d  .       || pNew-
1cb70 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d  >aLTerm[iTerm]!=
1cb80 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78  0.       || pIdx
1cb90 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a  Cons->usable==0.
1cba0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1cbb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1cbc0 28 70 50 61 72 73 65 2c 22 25 73 2e 78 42 65 73  (pParse,"%s.xBes
1cbd0 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69  tIndex malfuncti
1cbe0 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e  on",pSrc->pTab->
1cbf0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1cc00 74 65 73 74 63 61 73 65 28 20 70 49 64 78 49 6e  testcase( pIdxIn
1cc10 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1cc20 78 53 74 72 20 29 3b 0a 20 20 20 20 20 20 20 20  xStr );.        
1cc30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1cc40 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
1cc50 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1cc60 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
1cc70 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
1cc80 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20  ase( j==0 );.   
1cc90 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1cca0 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
1ccb0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
1ccc0 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
1ccd0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
1cce0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
1ccf0 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
1cd00 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c  ( iTerm<pNew->nL
1cd10 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Slot );.      pN
1cd20 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
1cd30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
1cd40 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72   if( iTerm>mxTer
1cd50 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65  m ) mxTerm = iTe
1cd60 72 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  rm;.      testca
1cd70 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
1cd80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cd90 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20   iTerm==16 );.  
1cda0 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
1cdb0 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
1cdc0 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
1cdd0 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
1cde0 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66  <iTerm;.      if
1cdf0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1ce00 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
1ce10 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
1ce20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
1ce30 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
1ce40 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73  d by an IN claus
1ce50 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20  e may not.      
1ce60 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65    ** consume the
1ce70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1ce80 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65   because (1) the
1ce90 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72   order of IN ter
1cea0 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ms.        ** is
1ceb0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1cec0 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
1ced0 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
1cee0 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
1cef0 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c    ** (2) Multipl
1cf00 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61  e outputs from a
1cf10 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65   single IN value
1cf20 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a   will not merge.
1cf30 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
1cf40 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
1cf50 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
1cf60 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
1cf70 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
1cf80 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e 53  ->idxFlags &= ~S
1cf90 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e  QLITE_INDEX_SCAN
1cfa0 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20  _UNIQUE;.       
1cfb0 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73 73 65   *pbIn = 1; asse
1cfc0 72 74 28 20 28 6d 45 78 63 6c 75 64 65 20 26 20  rt( (mExclude & 
1cfd0 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  WO_IN)==0 );.   
1cfe0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1cff0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1d000 69 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d  itMask &= ~mNoOm
1d010 69 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  it;..  pNew->nLT
1d020 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
1d030 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78    for(i=0; i<=mx
1d040 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
1d050 69 66 28 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d  if( pNew->aLTerm
1d060 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
1d070 2f 2a 20 54 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20  /* The non-zero 
1d080 61 72 67 76 49 64 78 20 76 61 6c 75 65 73 20 6d  argvIdx values m
1d090 75 73 74 20 62 65 20 63 6f 6e 74 69 67 75 6f 75  ust be contiguou
1d0a0 73 2e 20 20 52 61 69 73 65 20 61 6e 0a 20 20 20  s.  Raise an.   
1d0b0 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 66 20 74     ** error if t
1d0c0 68 65 79 20 61 72 65 20 6e 6f 74 20 2a 2f 0a 20  hey are not */. 
1d0d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1d0e0 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 2e  rMsg(pParse,"%s.
1d0f0 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c 66 75  xBestIndex malfu
1d100 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e 70 54  nction",pSrc->pT
1d110 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
1d120 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
1d130 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1d140 49 64 78 53 74 72 20 29 3b 0a 20 20 20 20 20 20  IdxStr );.      
1d150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1d160 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
1d170 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
1d180 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53  LTerm<=pNew->nLS
1d190 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75  lot );.  pNew->u
1d1a0 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70  .vtab.idxNum = p
1d1b0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b  IdxInfo->idxNum;
1d1c0 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1d1d0 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
1d1e0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1d1f0 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49 6e 66  dxStr;.  pIdxInf
1d200 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
1d210 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  Str = 0;.  pNew-
1d220 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
1d230 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
1d240 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  r;.  pNew->u.vta
1d250 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69  b.isOrdered = (i
1d260 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  8)(pIdxInfo->ord
1d270 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20  erByConsumed ?. 
1d280 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
1d290 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20  OrderBy : 0);.  
1d2a0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1d2b0 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d  ;.  pNew->rRun =
1d2c0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72   sqlite3LogEstFr
1d2d0 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
1d2e0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
1d2f0 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  );.  pNew->nOut 
1d300 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
1d310 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1d320 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20  tedRows);..  /* 
1d330 53 65 74 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  Set the WHERE_ON
1d340 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74 68 65  EROW flag if the
1d350 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65   xBestIndex() me
1d360 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64 0a 20  thod indicated. 
1d370 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61   ** that the sca
1d380 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20  n will visit at 
1d390 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c  most one row. Cl
1d3a0 65 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65  ear it otherwise
1d3b0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 49  . */.  if( pIdxI
1d3c0 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 20  nfo->idxFlags & 
1d3d0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
1d3e0 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20  N_UNIQUE ){.    
1d3f0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
1d400 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20   WHERE_ONEROW;. 
1d410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
1d420 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  ->wsFlags &= ~WH
1d430 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a  ERE_ONEROW;.  }.
1d440 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1d450 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
1d460 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e   pNew);.  if( pN
1d470 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
1d480 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
1d490 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e  e3_free(pNew->u.
1d4a0 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
1d4b0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1d4c0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
1d4d0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
1d4e0 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d 25 64  ffff, ("  bIn=%d
1d4f0 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78   prereqIn=%04llx
1d500 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c   prereqOut=%04ll
1d510 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
1d520 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 62 49              *pbI
1d530 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74  n, (sqlite3_uint
1d540 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20 20 20  64)mPrereq,.    
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d560 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36    (sqlite3_uint6
1d570 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  4)(pNew->prereq 
1d580 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a  & ~mPrereq)));..
1d590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d5a0 2f 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  /*.** If this fu
1d5b0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1d5c0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e  d from within an
1d5d0 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 63 61   xBestIndex() ca
1d5e0 6c 6c 62 61 63 6b 2c 20 69 74 0a 2a 2a 20 72 65  llback, it.** re
1d5f0 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
1d600 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1d610 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
1d620 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  of the collation
1d630 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 73 73  .** sequence ass
1d640 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 6c 65  ociated with ele
1d650 6d 65 6e 74 20 69 43 6f 6e 73 20 6f 66 20 74 68  ment iCons of th
1d660 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
1d670 69 6e 66 6f 2e 61 43 6f 6e 73 74 72 61 69 6e 74  info.aConstraint
1d680 0a 2a 2a 20 61 72 72 61 79 2e 20 4f 72 2c 20 69  .** array. Or, i
1d690 66 20 69 43 6f 6e 73 20 69 73 20 6f 75 74 20 6f  f iCons is out o
1d6a0 66 20 72 61 6e 67 65 20 6f 72 20 74 68 65 72 65  f range or there
1d6b0 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 78 42   is no active xB
1d6c0 65 73 74 49 6e 64 65 78 0a 2a 2a 20 63 61 6c 6c  estIndex.** call
1d6d0 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
1d6e0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1d6f0 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6c 6c 61  lite3_vtab_colla
1d700 74 69 6f 6e 28 73 71 6c 69 74 65 33 5f 69 6e 64  tion(sqlite3_ind
1d710 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
1d720 6f 2c 20 69 6e 74 20 69 43 6f 6e 73 29 7b 0a 20  o, int iCons){. 
1d730 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f   HiddenIndexInfo
1d740 20 2a 70 48 69 64 64 65 6e 20 3d 20 28 48 69 64   *pHidden = (Hid
1d750 64 65 6e 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70  denIndexInfo*)&p
1d760 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 63 6f  IdxInfo[1];.  co
1d770 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
1d780 20 30 3b 0a 20 20 69 66 28 20 69 43 6f 6e 73 3e   0;.  if( iCons>
1d790 3d 30 20 26 26 20 69 43 6f 6e 73 3c 70 49 64 78  =0 && iCons<pIdx
1d7a0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
1d7b0 74 20 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  t ){.    CollSeq
1d7c0 20 2a 70 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e   *pC = 0;.    in
1d7d0 74 20 69 54 65 72 6d 20 3d 20 70 49 64 78 49 6e  t iTerm = pIdxIn
1d7e0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
1d7f0 69 43 6f 6e 73 5d 2e 69 54 65 72 6d 4f 66 66 73  iCons].iTermOffs
1d800 65 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  et;.    Expr *pX
1d810 20 3d 20 70 48 69 64 64 65 6e 2d 3e 70 57 43 2d   = pHidden->pWC-
1d820 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b  >a[iTerm].pExpr;
1d830 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65  .    if( pX->pLe
1d840 66 74 20 29 7b 0a 20 20 20 20 20 20 70 43 20 3d  ft ){.      pC =
1d850 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1d860 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 48 69  mpareCollSeq(pHi
1d870 64 64 65 6e 2d 3e 70 50 61 72 73 65 2c 20 70 58  dden->pParse, pX
1d880 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
1d890 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
1d8a0 7a 52 65 74 20 3d 20 28 70 43 20 3f 20 70 43 2d  zRet = (pC ? pC-
1d8b0 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65 33  >zName : sqlite3
1d8c0 53 74 72 42 49 4e 41 52 59 29 3b 0a 20 20 7d 0a  StrBINARY);.  }.
1d8d0 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
1d8e0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
1d8f0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1d900 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66  s for a table of
1d910 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69   the join identi
1d920 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c  fied by.** pBuil
1d930 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
1d940 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
1d950 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1d960 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
1d970 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
1d980 20 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72 20   are no LEFT or 
1d990 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73  CROSS JOIN joins
1d9a0 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20 62   in the query, b
1d9b0 6f 74 68 20 6d 50 72 65 72 65 71 20 61 6e 64 0a  oth mPrereq and.
1d9c0 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72 65  ** mUnusable are
1d9d0 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65 72   set to 0. Other
1d9e0 77 69 73 65 2c 20 6d 50 72 65 72 65 71 20 69 73  wise, mPrereq is
1d9f0 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 46   a mask of all F
1da00 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65 6e  ROM clause.** en
1da10 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72  tries that occur
1da20 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72 74   before the virt
1da30 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ual table in the
1da40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64   FROM clause and
1da50 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74 65   are.** separate
1da60 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20  d from it by at 
1da70 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f  least one LEFT o
1da80 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53 69  r CROSS JOIN. Si
1da90 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a 20  milarly, the.** 
1daa0 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20 63  mUnusable mask c
1dab0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f 4d  ontains all FROM
1dac0 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 20   clause entries 
1dad0 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65 72  that occur after
1dae0 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
1daf0 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73 65  table and are se
1db00 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20  parated from it 
1db10 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  by at least one 
1db20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f 53  LEFT or .** CROS
1db30 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46  S JOIN. .**.** F
1db40 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1db50 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a 2a  he query were:.*
1db60 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
1db70 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e  t1, t2 LEFT JOIN
1db80 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f 53   t3, t4, vt CROS
1db90 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a 2a  S JOIN t5, t6;.*
1dba0 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72 65  *.** then mPrere
1dbb0 71 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  q corresponds to
1dbc0 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55   (t1, t2) and mU
1dbd0 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20  nusable to (t5, 
1dbe0 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  t6)..**.** All t
1dbf0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 50 72  he tables in mPr
1dc00 65 72 65 71 20 6d 75 73 74 20 62 65 20 73 63 61  ereq must be sca
1dc10 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  nned before the 
1dc20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20  current virtual 
1dc30 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e  .** table. So an
1dc40 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
1dc50 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69  h all prerequisi
1dc60 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69 65  tes are satisfie
1dc70 64 20 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65 71  d by .** mPrereq
1dc80 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69 65   may be specifie
1dc90 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e  d as "usable" in
1dca0 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42   all calls to xB
1dcb0 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f  estIndex. .** Co
1dcc0 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61  nversely, all ta
1dcd0 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c  bles in mUnusabl
1dce0 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  e must be scanne
1dcf0 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  d after the curr
1dd00 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  ent.** virtual t
1dd10 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72  able, so any ter
1dd20 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ms for which the
1dd30 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 6f   prerequisites o
1dd40 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d  verlap with.** m
1dd50 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20  Unusable should 
1dd60 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67  always be config
1dd70 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61  ured as "not-usa
1dd80 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e  ble" for xBestIn
1dd90 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dex..*/.static i
1dda0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
1ddb0 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c  irtual(.  WhereL
1ddc0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1ddd0 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20  lder,  /* WHERE 
1dde0 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
1ddf0 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
1de00 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 20 20  mPrereq,        
1de10 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
1de20 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e  hat must be scan
1de30 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ned before this 
1de40 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  one */.  Bitmask
1de50 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20   mUnusable      
1de60 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
1de70 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
1de80 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73 20  nned after this 
1de90 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  one */.){.  int 
1dea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1deb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1dec0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65  rn code */.  Whe
1ded0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
1dee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
1def0 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
1df00 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
1df10 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1df20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1df30 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1df40 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1df50 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
1df60 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1df70 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
1df80 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
1df90 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
1dfa0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
1dfb0 73 65 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c 69  search */.  sqli
1dfc0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
1dfd0 70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65  p;       /* Obje
1dfe0 63 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  ct to pass to xB
1dff0 65 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20  estIndex() */.  
1e000 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e020 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72  Number of constr
1e030 61 69 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20 20  aints in p */.  
1e040 69 6e 74 20 62 49 6e 3b 20 20 20 20 20 20 20 20  int bIn;        
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e060 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65  True if plan use
1e070 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  s IN(...) operat
1e080 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  or */.  WhereLoo
1e090 70 20 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d 61  p *pNew;.  Bitma
1e0a0 73 6b 20 6d 42 65 73 74 3b 20 20 20 20 20 20 20  sk mBest;       
1e0b0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1e0c0 73 20 75 73 65 64 20 62 79 20 62 65 73 74 20 70  s used by best p
1e0d0 6f 73 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a  ossible plan */.
1e0e0 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 3b 0a 0a    u16 mNoOmit;..
1e0f0 20 20 61 73 73 65 72 74 28 20 28 6d 50 72 65 72    assert( (mPrer
1e100 65 71 20 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d  eq & mUnusable)=
1e110 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  =0 );.  pWInfo =
1e120 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1e130 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
1e140 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1e150 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
1e160 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
1e170 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1e180 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
1e190 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
1e1a0 2d 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73 65 72  ->iTab];.  asser
1e1b0 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72  t( IsVirtual(pSr
1e1c0 63 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20 70 20  c->pTab) );.  p 
1e1d0 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
1e1e0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
1e1f0 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72 63   mUnusable, pSrc
1e200 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  , pBuilder->pOrd
1e210 65 72 42 79 2c 20 0a 20 20 20 20 20 20 26 6d 4e  erBy, .      &mN
1e220 6f 4f 6d 69 74 29 3b 0a 20 20 69 66 28 20 70 3d  oOmit);.  if( p=
1e230 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1e240 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
1e250 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1e260 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
1e270 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
1e280 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
1e290 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
1e2a0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1e2b0 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f 6e  Free = 0;.  nCon
1e2c0 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43 6f  straint = p->nCo
1e2d0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20  nstraint;.  if( 
1e2e0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
1e2f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77  pParse->db, pNew
1e300 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29  , nConstraint) )
1e310 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1e320 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1e330 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
1e340 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1e350 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
1e360 74 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64 65  t call xBestInde
1e370 78 28 29 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e  x() with all con
1e380 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2e  straints usable.
1e390 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45   */.  WHERETRACE
1e3a0 28 30 78 38 30 30 2c 20 28 22 42 45 47 49 4e 20  (0x800, ("BEGIN 
1e3b0 25 73 2e 61 64 64 56 69 72 74 75 61 6c 28 29 5c  %s.addVirtual()\
1e3c0 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  n", pSrc->pTab->
1e3d0 7a 4e 61 6d 65 29 29 3b 0a 20 20 57 48 45 52 45  zName));.  WHERE
1e3e0 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1e3f0 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1e400 75 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 72  usable\n"));.  r
1e410 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1e420 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c  VirtualOne(pBuil
1e430 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c  der, mPrereq, AL
1e440 4c 42 49 54 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f  LBITS, 0, p, mNo
1e450 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 0a 20 20  Omit, &bIn);..  
1e460 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  /* If the call t
1e470 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77  o xBestIndex() w
1e480 69 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e  ith all terms en
1e490 61 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20 61  abled produced a
1e4a0 20 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20   plan.  ** that 
1e4b0 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
1e4c0 20 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62 6c   any source tabl
1e4d0 65 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20  es (IOW: a plan 
1e4e0 77 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c 0a  with mBest==0),.
1e4f0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
1e500 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 6d  is no point in m
1e510 61 6b 69 6e 67 20 61 6e 79 20 66 75 72 74 68 65  aking any furthe
1e520 72 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  r calls to xBest
1e530 49 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20 73 69  Index() .  ** si
1e540 6e 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c  nce they will al
1e550 6c 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  l return the sam
1e560 65 20 72 65 73 75 6c 74 20 28 69 66 20 74 68 65  e result (if the
1e570 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 20 20   xBestIndex().  
1e580 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
1e590 6e 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a 20  n is sane). */. 
1e5a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e5b0 4f 4b 20 26 26 20 28 6d 42 65 73 74 20 3d 20 28  OK && (mBest = (
1e5c0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e  pNew->prereq & ~
1e5d0 6d 50 72 65 72 65 71 29 29 21 3d 30 20 29 7b 0a  mPrereq))!=0 ){.
1e5e0 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f      int seenZero
1e5f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1e600 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70    /* True if a p
1e610 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72  lan with no prer
1e620 65 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20  eqs seen */.    
1e630 69 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e  int seenZeroNoIN
1e640 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1e650 20 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72   Plan with no pr
1e660 65 72 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e 28  ereqs and no IN(
1e670 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20 20  ...) seen */.   
1e680 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 76 20 3d   Bitmask mPrev =
1e690 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   0;.    Bitmask 
1e6a0 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a  mBestNoIn = 0;..
1e6b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 6c      /* If the pl
1e6c0 61 6e 20 70 72 6f 64 75 63 65 64 20 62 79 20 74  an produced by t
1e6d0 68 65 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  he earlier call 
1e6e0 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  uses an IN(...) 
1e6f0 74 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20 2a  term, call.    *
1e700 2a 20 78 42 65 73 74 49 6e 64 65 78 20 61 67 61  * xBestIndex aga
1e710 69 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69  in, this time wi
1e720 74 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 73  th IN(...) terms
1e730 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20   disabled. */.  
1e740 20 20 69 66 28 20 62 49 6e 20 29 7b 0a 20 20 20    if( bIn ){.   
1e750 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1e760 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1e770 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20 77  ne: all usable w
1e780 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20  /o IN\n"));.    
1e790 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1e7a0 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20  AddVirtualOne(. 
1e7b0 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65           pBuilde
1e7c0 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42  r, mPrereq, ALLB
1e7d0 49 54 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d  ITS, WO_IN, p, m
1e7e0 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20  NoOmit, &bIn);. 
1e7f0 20 20 20 20 20 61 73 73 65 72 74 28 20 62 49 6e       assert( bIn
1e800 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 42 65  ==0 );.      mBe
1e810 73 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70  stNoIn = pNew->p
1e820 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71  rereq & ~mPrereq
1e830 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65 73  ;.      if( mBes
1e840 74 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  tNoIn==0 ){.    
1e850 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31      seenZero = 1
1e860 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65  ;.        seenZe
1e870 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  roNoIN = 1;.    
1e880 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1e890 2a 20 43 61 6c 6c 20 78 42 65 73 74 49 6e 64 65  * Call xBestInde
1e8a0 78 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  x once for each 
1e8b0 64 69 73 74 69 6e 63 74 20 76 61 6c 75 65 20 6f  distinct value o
1e8c0 66 20 28 70 72 65 72 65 71 52 69 67 68 74 20 26  f (prereqRight &
1e8d0 20 7e 6d 50 72 65 72 65 71 29 20 0a 20 20 20 20   ~mPrereq) .    
1e8e0 2a 2a 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66  ** in the set of
1e8f0 20 74 65 72 6d 73 20 74 68 61 74 20 61 70 70 6c   terms that appl
1e900 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  y to the current
1e910 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
1e920 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 72   */.    while( r
1e930 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e940 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1e950 20 20 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78 74     Bitmask mNext
1e960 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20 20   = ALLBITS;.    
1e970 20 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74 3e    assert( mNext>
1e980 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
1e990 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
1e9a0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
1e9b0 20 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20 3d   Bitmask mThis =
1e9c0 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   (.            p
1e9d0 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74 72  WC->a[p->aConstr
1e9e0 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
1e9f0 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74  set].prereqRight
1ea00 20 26 20 7e 6d 50 72 65 72 65 71 0a 20 20 20 20   & ~mPrereq.    
1ea10 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1ea20 66 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26  f( mThis>mPrev &
1ea30 26 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20  & mThis<mNext ) 
1ea40 6d 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20  mNext = mThis;. 
1ea50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72       }.      mPr
1ea60 65 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20  ev = mNext;.    
1ea70 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c    if( mNext==ALL
1ea80 42 49 54 53 20 29 20 62 72 65 61 6b 3b 0a 20 20  BITS ) break;.  
1ea90 20 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 6d      if( mNext==m
1eaa0 42 65 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d  Best || mNext==m
1eab0 42 65 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74 69  BestNoIn ) conti
1eac0 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45  nue;.      WHERE
1ead0 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1eae0 56 69 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72 65  VirtualOne: mPre
1eaf0 76 3d 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d 25  v=%04llx mNext=%
1eb00 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20  04llx\n",.      
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34   (sqlite3_uint64
1eb30 29 6d 50 72 65 76 2c 20 28 73 71 6c 69 74 65 33  )mPrev, (sqlite3
1eb40 5f 75 69 6e 74 36 34 29 6d 4e 65 78 74 29 29 3b  _uint64)mNext));
1eb50 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1eb60 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1eb70 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42  ne(.          pB
1eb80 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1eb90 20 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c 20   mNext|mPrereq, 
1eba0 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26  0, p, mNoOmit, &
1ebb0 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bIn);.      if( 
1ebc0 70 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d 50  pNew->prereq==mP
1ebd0 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20  rereq ){.       
1ebe0 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20   seenZero = 1;. 
1ebf0 20 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d         if( bIn==
1ec00 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e  0 ) seenZeroNoIN
1ec10 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1ec20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1ec30 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  he calls to xBes
1ec40 74 49 6e 64 65 78 28 29 20 69 6e 20 74 68 65 20  tIndex() in the 
1ec50 61 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20 6e  above loop did n
1ec60 6f 74 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20  ot find a plan. 
1ec70 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69     ** that requi
1ec80 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61  res no source ta
1ec90 62 6c 65 73 20 61 74 20 61 6c 6c 20 28 69 2e 65  bles at all (i.e
1eca0 2e 20 6f 6e 65 20 67 75 61 72 61 6e 74 65 65 64  . one guaranteed
1ecb0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 73   to be.    ** us
1ecc0 61 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63 61  able), make a ca
1ecd0 6c 6c 20 68 65 72 65 20 77 69 74 68 20 61 6c 6c  ll here with all
1ece0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 64   source tables d
1ecf0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 69  isabled */.    i
1ed00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ed10 20 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30 20   && seenZero==0 
1ed20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ){.      WHERETR
1ed30 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1ed40 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69  rtualOne: all di
1ed50 73 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20 20  sabled\n"));.   
1ed60 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1ed70 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1ed80 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64            pBuild
1ed90 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72  er, mPrereq, mPr
1eda0 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f  ereq, 0, p, mNoO
1edb0 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20  mit, &bIn);.    
1edc0 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73    if( bIn==0 ) s
1edd0 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b  eenZeroNoIN = 1;
1ede0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1edf0 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78  f the calls to x
1ee00 42 65 73 74 49 6e 64 65 78 28 29 20 68 61 76 65  BestIndex() have
1ee10 20 73 6f 20 66 61 72 20 66 61 69 6c 65 64 20 74   so far failed t
1ee20 6f 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20  o find a plan.  
1ee30 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72    ** that requir
1ee40 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62  es no source tab
1ee50 6c 65 73 20 61 74 20 61 6c 6c 20 61 6e 64 20 64  les at all and d
1ee60 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49  oes not use an I
1ee70 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f 70  N(...).    ** op
1ee80 65 72 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20 66  erator, make a f
1ee90 69 6e 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62 74  inal call to obt
1eea0 61 69 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20 2a  ain one here.  *
1eeb0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1eec0 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a  LITE_OK && seenZ
1eed0 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20  eroNoIN==0 ){.  
1eee0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1eef0 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c  x40, ("  Virtual
1ef00 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65  One: all disable
1ef10 64 20 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22 29  d and w/o IN\n")
1ef20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
1ef30 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1ef40 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20  lOne(.          
1ef50 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1ef60 71 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f 49  q, mPrereq, WO_I
1ef70 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26  N, p, mNoOmit, &
1ef80 62 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bIn);.    }.  }.
1ef90 0a 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f  .  if( p->needTo
1efa0 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
1efb0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78  ite3_free(p->idx
1efc0 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
1efd0 62 46 72 65 65 4e 4e 28 70 50 61 72 73 65 2d 3e  bFreeNN(pParse->
1efe0 64 62 2c 20 70 29 3b 0a 20 20 57 48 45 52 45 54  db, p);.  WHERET
1eff0 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 45 4e  RACE(0x800, ("EN
1f000 44 20 25 73 2e 61 64 64 56 69 72 74 75 61 6c 28  D %s.addVirtual(
1f010 29 2c 20 72 63 3d 25 64 5c 6e 22 2c 20 70 53 72  ), rc=%d\n", pSr
1f020 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  c->pTab->zName, 
1f030 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  rc));.  return r
1f040 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
1f050 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1f060 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
1f070 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20  * Add WhereLoop 
1f080 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c  entries to handl
1f090 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69  e OR terms.  Thi
1f0a0 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68  s works for eith
1f0b0 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20  er.** btrees or 
1f0c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a  virtual tables..
1f0d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1f0e0 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20  ereLoopAddOr(.  
1f0f0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1f100 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42   *pBuilder, .  B
1f110 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20  itmask mPrereq, 
1f120 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73  .  Bitmask mUnus
1f130 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49  able.){.  WhereI
1f140 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
1f150 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
1f160 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1f170 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  WC;.  WhereLoop 
1f180 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65  *pNew;.  WhereTe
1f190 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45  rm *pTerm, *pWCE
1f1a0 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  nd;.  int rc = S
1f1b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
1f1c0 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61  iCur;.  WhereCla
1f1d0 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68  use tempWC;.  Wh
1f1e0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
1f1f0 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72  SubBuild;.  Wher
1f200 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75  eOrSet sSum, sCu
1f210 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  r;.  struct SrcL
1f220 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1f230 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
1f240 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43  lder->pWC;.  pWC
1f250 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
1f260 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65  WC->nTerm;.  pNe
1f270 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1f280 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  ew;.  memset(&sS
1f290 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  um, 0, sizeof(sS
1f2a0 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  um));.  pItem = 
1f2b0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1f2c0 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
1f2d0 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
1f2e0 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f  ->iCursor;..  fo
1f2f0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
1f300 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20  pTerm<pWCEnd && 
1f310 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
1f320 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
1f330 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1f340 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20  or & WO_OR)!=0. 
1f350 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
1f360 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
1f370 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ble & pNew->mask
1f380 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b  Self)!=0 .    ){
1f390 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
1f3a0 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  se * const pOrWC
1f3b0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
1f3c0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
1f3d0 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
1f3e0 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f  t pOrWCEnd = &pO
1f3f0 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54  rWC->a[pOrWC->nT
1f400 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72  erm];.      Wher
1f410 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a  eTerm *pOrTerm;.
1f420 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d        int once =
1f430 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   1;.      int i,
1f440 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73   j;.    .      s
1f450 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69  SubBuild = *pBui
1f460 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62  lder;.      sSub
1f470 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d  Build.pOrderBy =
1f480 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75   0;.      sSubBu
1f490 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43  ild.pOrSet = &sC
1f4a0 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45  ur;..      WHERE
1f4b0 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 42  TRACE(0x200, ("B
1f4c0 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  egin processing 
1f4d0 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c  OR-clause %p\n",
1f4e0 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20   pTerm));.      
1f4f0 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57  for(pOrTerm=pOrW
1f500 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f  C->a; pOrTerm<pO
1f510 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b  rWCEnd; pOrTerm+
1f520 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1f530 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
1f540 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
1f550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
1f560 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70  ubBuild.pWC = &p
1f570 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
1f580 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
1f590 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
1f5a0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
1f5b0 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
1f5c0 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d   tempWC.pWInfo =
1f5d0 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
1f5e0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
1f5f0 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
1f600 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
1f610 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
1f620 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72       tempWC.nTer
1f630 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
1f640 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
1f650 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  erm;.          s
1f660 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
1f670 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20  tempWC;.        
1f680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f690 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f6a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75     }.        sCu
1f6b0 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  r.n = 0;.#ifdef 
1f6c0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
1f6d0 45 44 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ED.        WHERE
1f6e0 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f  TRACE(0x200, ("O
1f6f0 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20  R-term %d of %p 
1f700 68 61 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a  has %d subterms:
1f710 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1f720 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
1f730 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29  OrTerm-pOrWC->a)
1f740 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69  , pTerm, sSubBui
1f750 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b  ld.pWC->nTerm));
1f760 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1f770 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
1f780 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20   0x400 ){.      
1f790 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1f7a0 43 6c 61 75 73 65 50 72 69 6e 74 28 73 53 75 62  ClausePrint(sSub
1f7b0 42 75 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20 20  Build.pWC);.    
1f7c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1f7d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f7e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1f7f0 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
1f800 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
1f810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1f820 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1f830 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c  irtual(&sSubBuil
1f840 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75  d, mPrereq, mUnu
1f850 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  sable);.        
1f860 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
1f870 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
1f880 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1f890 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69  ddBtree(&sSubBui
1f8a0 6c 64 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20  ld, mPrereq);.  
1f8b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f8c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f8d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1f8e0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1f8f0 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  Or(&sSubBuild, m
1f900 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c  Prereq, mUnusabl
1f910 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1f920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
1f930 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  ==SQLITE_OK || s
1f940 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  Cur.n==0 );.    
1f950 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d      if( sCur.n==
1f960 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1f970 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
1f980 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f990 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
1f9a0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
1f9b0 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75  whereOrMove(&sSu
1f9c0 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20  m, &sCur);.     
1f9d0 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
1f9e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f9f0 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53          WhereOrS
1fa00 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20  et sPrev;.      
1fa10 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
1fa20 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a  &sPrev, &sSum);.
1fa30 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
1fa40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1fa50 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76  for(i=0; i<sPrev
1fa60 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
1fa70 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1fa80 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20  <sCur.n; j++){. 
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
1faa0 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d  reOrInsert(&sSum
1fab0 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65  , sPrev.a[i].pre
1fac0 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e  req | sCur.a[j].
1fad0 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  prereq,.        
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faf0 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
1fb00 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
1fb10 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  rRun, sCur.a[j].
1fb20 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  rRun),.         
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
1fb50 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e  Add(sPrev.a[i].n
1fb60 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e  Out, sCur.a[j].n
1fb70 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Out));.         
1fb80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1fb90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fba0 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
1fbb0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
1fbc0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
1fbd0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
1fbe0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1fbf0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
1fc00 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
1fc10 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
1fc20 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
1fc30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
1fc40 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  pNew->u, 0, size
1fc50 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20  of(pNew->u));.  
1fc60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
1fc70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
1fc80 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  sSum.n; i++){.  
1fc90 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
1fca0 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e   Currently sSum.
1fcb0 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74  a[i].rRun is set
1fcc0 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74   to the sum of t
1fcd0 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20  he costs.       
1fce0 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73   ** of all sub-s
1fcf0 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79  cans required by
1fd00 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f   the OR-scan. Ho
1fd10 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f  wever, due to ro
1fd20 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  unding.        *
1fd30 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79  * errors, it may
1fd40 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73   be that the cos
1fd50 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e  t of the OR-scan
1fd60 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73   is equal to its
1fd70 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74  .        ** most
1fd80 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73   expensive sub-s
1fd90 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61  can. Add the sma
1fda0 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70  llest possible p
1fdb0 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20  enalty .        
1fdc0 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74  ** (equivalent t
1fdd0 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68  o multiplying th
1fde0 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20  e cost by 1.07) 
1fdf0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a  to ensure that .
1fe00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
1fe10 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e  does not happen.
1fe20 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
1fe30 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75  WHERE clauses su
1fe40 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ch as the.      
1fe50 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
1fe60 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
1fe70 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20   index on "y":. 
1fe80 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1fe90 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c    **     WHERE l
1fea0 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30  ikelihood(x=?, 0
1feb0 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20  .99) OR y=?.    
1fec0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1fed0 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61  * the planner ma
1fee0 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20  y elect to "OR" 
1fef0 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d  together a full-
1ff00 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61  table scan and a
1ff10 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  n.        ** ind
1ff20 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f  ex lookup. And o
1ff30 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f  ther similarly o
1ff40 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a  dd results.  */.
1ff50 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
1ff60 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
1ff70 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  Run + 1;.       
1ff80 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
1ff90 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
1ffa0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
1ffb0 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
1ffc0 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
1ffd0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1ffe0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1fff0 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
20000 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
20010 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65  200, ("End proce
20020 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  ssing OR-clause 
20030 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a  %p\n", pTerm));.
20040 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20050 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20060 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
20070 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c  p objects for al
20080 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61  l tables .*/.sta
20090 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
200a0 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f  pAddAll(WhereLoo
200b0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
200c0 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
200d0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
200e0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42  der->pWInfo;.  B
200f0 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 3d  itmask mPrereq =
20100 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   0;.  Bitmask mP
20110 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rior = 0;.  int 
20120 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20  iTab;.  SrcList 
20130 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
20140 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
20150 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
20160 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74  tem *pItem;.  st
20170 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20180 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c  m *pEnd = &pTabL
20190 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e  ist->a[pWInfo->n
201a0 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65  Level];.  sqlite
201b0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
201c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
201d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
201e0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
201f0 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a  New;.  u8 priorJ
20200 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20  ointype = 0;..  
20210 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65  /* Loop over the
20220 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
20230 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  oin, from left t
20240 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65  o right */.  pNe
20250 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
20260 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  ew;.  whereLoopI
20270 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 2f 2a 20  nit(pNew);.  /* 
20280 53 6f 6d 65 20 70 61 74 68 6f 6c 6f 67 69 63 61  Some pathologica
20290 6c 20 71 75 65 72 69 65 73 20 70 72 6f 76 69 64  l queries provid
202a0 65 20 61 6e 20 75 6e 72 65 61 73 6f 6e 61 62 6c  e an unreasonabl
202b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  e number of inde
202c0 78 69 6e 67 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  xing.  ** option
202d0 73 2e 20 54 68 65 20 69 50 6c 61 6e 4c 69 6d 69  s. The iPlanLimi
202e0 74 20 76 61 6c 75 65 20 70 72 65 76 65 6e 74 73  t value prevents
202f0 20 74 68 65 73 65 20 71 75 65 72 69 65 73 20 66   these queries f
20300 72 6f 6d 20 74 61 6b 69 6e 67 20 75 70 0a 20 20  rom taking up.  
20310 2a 2a 20 74 6f 6f 20 6d 75 63 68 20 74 69 6d 65  ** too much time
20320 20 69 6e 20 74 68 65 20 70 6c 61 6e 6e 65 72 2e   in the planner.
20330 20 57 68 65 6e 20 69 50 6c 61 6e 4c 69 6d 69 74   When iPlanLimit
20340 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 6e   reaches zero, n
20350 6f 20 66 75 72 74 68 65 72 0a 20 20 2a 2a 20 69  o further.  ** i
20360 6e 64 65 78 2b 63 6f 6e 73 74 72 61 69 6e 74 20  ndex+constraint 
20370 6f 70 74 69 6f 6e 73 20 61 72 65 20 63 6f 6e 73  options are cons
20380 69 64 65 72 65 64 2e 20 53 65 65 64 20 69 50 6c  idered. Seed iPl
20390 61 6e 4c 69 6d 69 74 20 74 6f 20 32 30 4b 20 62  anLimit to 20K b
203a0 75 74 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64  ut.  ** also add
203b0 20 61 6e 20 65 78 74 72 61 20 31 4b 20 74 6f 20   an extra 1K to 
203c0 65 61 63 68 20 74 61 62 6c 65 20 6f 66 20 74 68  each table of th
203d0 65 20 6a 6f 69 6e 2c 20 74 6f 20 65 6e 73 75 72  e join, to ensur
203e0 65 20 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a  e that each.  **
203f0 20 74 61 62 6c 65 20 61 74 20 6c 65 61 73 74 20   table at least 
20400 67 65 74 73 20 31 4b 20 6f 70 70 6f 72 74 75 6e  gets 1K opportun
20410 69 74 69 65 73 2e 20 2a 2f 0a 20 20 70 42 75 69  ities. */.  pBui
20420 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74  lder->iPlanLimit
20430 20 3d 20 32 30 30 30 30 3b 0a 20 20 66 6f 72 28   = 20000;.  for(
20440 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54  iTab=0, pItem=pT
20450 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d  abList->a; pItem
20460 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70  <pEnd; iTab++, p
20470 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74  Item++){.    Bit
20480 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d  mask mUnusable =
20490 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54   0;.    pNew->iT
204a0 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  ab = iTab;.    p
204b0 42 75 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c 69  Builder->iPlanLi
204c0 6d 69 74 20 2b 3d 20 31 30 30 30 3b 20 20 2f 2a  mit += 1000;  /*
204d0 20 31 30 30 30 20 62 6f 6e 75 73 20 66 6f 72 20   1000 bonus for 
204e0 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
204f0 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 70 4e  e join */.    pN
20500 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
20510 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
20520 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
20530 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
20540 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
20550 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
20560 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
20570 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
20580 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
20590 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
205a0 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
205b0 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
205c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
205d0 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
205e0 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
205f0 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
20600 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
20610 20 20 20 20 20 6d 50 72 65 72 65 71 20 3d 20 6d       mPrereq = m
20620 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
20630 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
20640 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74   pItem->fg.joint
20650 79 70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ype;.#ifndef SQL
20660 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
20670 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73  TABLE.    if( Is
20680 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
20690 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74  Tab) ){.      st
206a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
206b0 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  m *p;.      for(
206c0 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70  p=&pItem[1]; p<p
206d0 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
206e0 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65     if( mUnusable
206f0 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74   || (p->fg.joint
20700 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
20710 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20  T_CROSS)) ){.   
20720 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65         mUnusable
20730 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
20740 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
20750 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43  >sMaskSet, p->iC
20760 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
20770 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
20780 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
20790 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65  dVirtual(pBuilde
207a0 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75  r, mPrereq, mUnu
207b0 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  sable);.    }els
207c0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
207d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
207e0 41 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a 20 20  ABLE */.    {.  
207f0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
20800 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
20810 64 65 72 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20  der, mPrereq);. 
20820 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
20830 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 42  =SQLITE_OK && pB
20840 75 69 6c 64 65 72 2d 3e 70 57 43 2d 3e 68 61 73  uilder->pWC->has
20850 4f 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Or ){.      rc =
20860 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
20870 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
20880 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  q, mUnusable);. 
20890 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20     }.    mPrior 
208a0 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  |= pNew->maskSel
208b0 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  f;.    if( rc ||
208c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
208d0 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  d ){.      if( r
208e0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
208f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
20900 68 69 74 20 74 68 65 20 71 75 65 72 79 20 70 6c  hit the query pl
20910 61 6e 6e 65 72 20 73 65 61 72 63 68 20 6c 69 6d  anner search lim
20920 69 74 20 73 65 74 20 62 79 20 69 50 6c 61 6e 4c  it set by iPlanL
20930 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  imit */.        
20940 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
20950 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 61 62 62  TE_WARNING, "abb
20960 72 65 76 69 61 74 65 64 20 71 75 65 72 79 20 61  reviated query a
20970 6c 67 6f 72 69 74 68 6d 20 73 65 61 72 63 68 22  lgorithm search"
20980 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
20990 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
209a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
209b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
209c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 65 72     }.  }..  wher
209d0 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
209e0 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
209f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
20a00 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
20a10 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
20a20 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
20a30 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
20a40 20 36 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   6th.** paramete
20a50 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
20a60 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
20a70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
20a80 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
20a90 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
20aa0 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
20ab0 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
20ac0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a  tion.  Return N:
20ad0 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20  .** .**   N>0:  
20ae0 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20   N terms of the 
20af0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20b00 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
20b10 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72     N==0:  No ter
20b20 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
20b30 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
20b40 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30  tisfied.**   N<0
20b50 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20  :   Unknown yet 
20b60 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f  how many terms o
20b70 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74  f ORDER BY might
20b80 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20   be satisfied.  
20b90 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
20ba0 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
20bb0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
20bc0 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
20bd0 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
20be0 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
20bf0 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
20c00 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
20c10 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
20c20 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
20c30 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
20c40 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
20c50 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
20c60 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
20c70 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f  d DISTINCT do no
20c80 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
20c90 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
20ca0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
20cb0 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
20cc0 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
20cd0 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
20ce0 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
20cf0 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
20d00 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
20d10 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
20d20 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
20d30 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
20d40 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
20d50 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
20d60 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
20d70 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
20d80 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
20d90 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65  .static i8 where
20da0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
20db0 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
20dc0 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
20dd0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
20de0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
20df0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
20e00 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
20e10 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
20e20 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
20e30 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
20e40 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
20e50 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
20e60 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
20e70 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
20e80 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42   /* WHERE_GROUPB
20e90 59 20 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59  Y or _DISTINCTBY
20ea0 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d   or _ORDERBY_LIM
20eb0 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  IT */.  u16 nLoo
20ec0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
20ed0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
20ee0 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
20ef0 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  op[] */.  WhereL
20f00 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
20f10 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
20f20 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
20f30 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
20f40 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
20f50 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
20f60 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68   OUT: Mask of Wh
20f70 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
20f80 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
20f90 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
20fa0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
20fb0 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
20fc0 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
20fd0 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
20fe0 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
20ff0 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
21000 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
21010 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
21020 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
21030 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
21040 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72  ;   /* All prior
21050 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20   WhereLoops are 
21060 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a  order-distinct *
21070 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43  /.  u8 distinctC
21080 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75  olumns;   /* Tru
21090 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61  e if the loop ha
210a0 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c  s UNIQUE NOT NUL
210b0 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  L columns */.  u
210c0 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20  8 isMatch;      
210d0 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20       /* iColumn 
210e0 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f  matches a term o
210f0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
21100 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65  lause */.  u16 e
21110 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  qOpMask;        
21120 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61   /* Allowed equa
21130 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
21140 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b  /.  u16 nKeyCol;
21150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21160 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d  ber of key colum
21170 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a  ns in pIndex */.
21180 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20    u16 nColumn;  
21190 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
211a0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72   number of order
211b0 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
211c0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36  e index */.  u16
211d0 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
211e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72     /* Number ter
211f0 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
21200 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
21210 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
21220 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
21230 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50   WhereLoop in pP
21240 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ath being proces
21250 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  sed */.  int i, 
21260 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
21270 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
21280 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
21290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
212a0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
212b0 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
212c0 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  p */.  int iColu
212d0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
212e0 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  A column number 
212f0 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75  within table iCu
21300 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
21310 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20   *pLoop = 0; /* 
21320 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  Current WhereLoo
21330 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  p being processe
21340 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  d. */.  WhereTer
21350 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a  m *pTerm;     /*
21360 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
21370 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
21380 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  se */.  Expr *pO
21390 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  BExpr;        /*
213a0 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
213b0 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
213c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c   clause */.  Col
213d0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
213e0 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75     /* COLLATE fu
213f0 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f  nction from an O
21400 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
21410 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  erm */.  Index *
21420 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f  pIndex;        /
21430 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f  * The index asso
21440 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f  ciated with pLoo
21450 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  p */.  sqlite3 *
21460 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
21470 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
21480 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21490 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
214a0 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  Sat = 0;    /* M
214b0 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
214c0 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
214d0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d  so far */.  Bitm
214e0 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20  ask obDone;     
214f0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
21500 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
21510 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64  */.  Bitmask ord
21520 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20  erDistinctMask; 
21530 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
21540 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f  well-ordered loo
21550 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ps */.  Bitmask 
21560 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  ready;          
21570 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69      /* Mask of i
21580 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20  nner loops */.. 
21590 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   /*.  ** We say 
215a0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
215b0 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74   "one-row" if it
215c0 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f   generates no mo
215d0 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a  re than one.  **
215e0 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20   row of output. 
215f0 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20   A WhereLoop is 
21600 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f  one-row if all o
21610 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
21620 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20  are true:.  **  
21630 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f  (a) All index co
21640 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68  lumns match with
21650 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
21660 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20  ..  **  (b) The 
21670 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a  index is unique.
21680 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f    ** Any WhereLo
21690 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45  op with an WHERE
216a0 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74  _COLUMN_EQ const
216b0 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
216c0 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20  id is one-row.. 
216d0 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f   ** Every one-ro
216e0 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c  w WhereLoop will
216f0 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f   have the WHERE_
21700 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69  ONEROW bit set i
21710 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a  n wsFlags..  **.
21720 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
21730 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72  WhereLoop is "or
21740 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66  der-distinct" if
21750 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
21760 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mns from.  ** th
21770 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  at WhereLoop tha
21780 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44  t are in the ORD
21790 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
217a0 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
217b0 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  very.  ** row of
217c0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20   the WhereLoop. 
217d0 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
217e0 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f  hereLoop is auto
217f0 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f  matically.  ** o
21800 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20  rder-distinct.  
21810 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   A WhereLoop tha
21820 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73  t has no columns
21830 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
21840 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20   clause.  ** is 
21850 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  not order-distin
21860 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d  ct. To be order-
21870 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20  distinct is not 
21880 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61  quite the same a
21890 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49  s being.  ** UNI
218a0 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51  QUE since a UNIQ
218b0 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64  UE column or ind
218c0 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  ex can have mult
218d0 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a  iple rows that .
218e0 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e    ** are NULL an
218f0 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  d NULL values ar
21900 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
21910 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
21920 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
21930 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72    ** To be order
21940 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63  -distinct, the c
21950 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55  olumns must be U
21960 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
21970 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
21980 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61  e rowid for a ta
21990 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e  ble is always UN
219a0 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
219b0 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68  L so whenever th
219c0 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70  e.  ** rowid app
219d0 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ears in the ORDE
219e0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
219f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
21a00 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a  hereLoop is.  **
21a10 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
21a20 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
21a30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21a40 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
21a50 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74  if( nLoop && Opt
21a60 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
21a70 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
21a80 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72  erByIdxJoin) ) r
21a90 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64  eturn 0;..  nOrd
21aa0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
21ab0 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61  >nExpr;.  testca
21ac0 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d  se( nOrderBy==BM
21ad0 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  S-1 );.  if( nOr
21ae0 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65  derBy>BMS-1 ) re
21af0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e  turn 0;  /* Cann
21b00 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72  ot optimize over
21b10 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42  ly large ORDER B
21b20 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44  Ys */.  isOrderD
21b30 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f  istinct = 1;.  o
21b40 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28  bDone = MASKBIT(
21b50 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f  nOrderBy)-1;.  o
21b60 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
21b70 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20   = 0;.  ready = 
21b80 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20  0;.  eqOpMask = 
21b90 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20  WO_EQ | WO_IS | 
21ba0 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28  WO_ISNULL;.  if(
21bb0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
21bc0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
21bd0 54 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20  T ) eqOpMask |= 
21be0 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f  WO_IN;.  for(iLo
21bf0 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
21c00 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
21c10 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
21c20 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
21c30 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
21c40 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
21c50 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
21c60 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70   if( iLoop<nLoop
21c70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20   ){.      pLoop 
21c80 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
21c90 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28  Loop];.      if(
21ca0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
21cb0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
21cc0 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  T ) continue;.  
21cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21ce0 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20  Loop = pLast;.  
21cf0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
21d00 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
21d10 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
21d20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
21d30 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  op->u.vtab.isOrd
21d40 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f  ered ) obSat = o
21d50 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65  bDone;.      bre
21d60 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
21d70 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
21d80 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 30 3b  ree.nIdxCol = 0;
21d90 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20  .    }.    iCur 
21da0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
21db0 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
21dc0 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20  b].iCursor;..   
21dd0 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
21de0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58   ORDER BY term X
21df0 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
21e00 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  n in the table o
21e10 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
21e20 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68  rent loop for wh
21e30 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72  ich there is ter
21e40 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  m in the WHERE. 
21e50 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
21e60 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55  the form X IS NU
21e70 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72  LL or X=? that r
21e80 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75  eference only ou
21e90 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73  ter.    ** loops
21ea0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
21eb0 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
21ec0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
21ed0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
21ee0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
21ef0 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
21f00 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
21f10 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
21f20 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
21f30 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
21f40 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
21f50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
21f60 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
21f70 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
21f80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54  ntinue;.      pT
21f90 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
21fa0 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e  reFindTerm(&pWIn
21fb0 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70  fo->sWC, iCur, p
21fc0 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c  OBExpr->iColumn,
21fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21fe0 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20          ~ready, 
21ff0 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20  eqOpMask, 0);.  
22000 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
22010 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22020 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
22030 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
22040 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20  {.        /* IN 
22050 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76  terms are only v
22060 61 6c 69 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  alid for sorting
22070 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
22080 20 4c 49 4d 49 54 20 0a 20 20 20 20 20 20 20 20   LIMIT .        
22090 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ** optimization,
220a0 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69   and then only i
220b0 66 20 74 68 65 79 20 61 72 65 20 61 63 74 75 61  f they are actua
220c0 6c 6c 79 20 75 73 65 64 0a 20 20 20 20 20 20 20  lly used.       
220d0 20 2a 2a 20 62 79 20 74 68 65 20 71 75 65 72 79   ** by the query
220e0 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20   plan */.       
220f0 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c   assert( wctrlFl
22100 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
22110 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  RBY_LIMIT );.   
22120 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
22130 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  pLoop->nLTerm &&
22140 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61   pTerm!=pLoop->a
22150 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d  LTerm[j]; j++){}
22160 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  .        if( j>=
22170 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20  pLoop->nLTerm ) 
22180 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22190 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  }.      if( (pTe
221a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
221b0 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20  O_EQ|WO_IS))!=0 
221c0 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  && pOBExpr->iCol
221d0 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
221e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
221f0 72 43 6f 6c 6c 53 65 71 4d 61 74 63 68 28 70 57  rCollSeqMatch(pW
22200 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 0a 20  Info->pParse, . 
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22220 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
22230 70 45 78 70 72 2c 20 70 54 65 72 6d 2d 3e 70 45  pExpr, pTerm->pE
22240 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xpr)==0 ){.     
22250 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
22260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22270 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
22280 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
22290 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IS );.      }.  
222a0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
222b0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
222c0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
222d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
222e0 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
222f0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
22300 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
22310 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
22320 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
22330 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
22340 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
22350 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
22360 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
22370 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
22380 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
22390 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
223a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
223b0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
223c0 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
223d0 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
223e0 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  l;.        nColu
223f0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
22400 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  lumn;.        as
22410 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e  sert( nColumn==n
22420 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73  KeyCol+1 || !Has
22430 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
22440 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20  able) );.       
22450 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
22460 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
22470 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20  n-1]==XN_ROWID. 
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73           || !Has
224a0 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
224b0 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
224c0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
224d0 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  = IsUniqueIndex(
224e0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  pIndex);.      }
224f0 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ..      /* Loop 
22500 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75  through all colu
22510 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
22520 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74   and deal with t
22530 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a  he ones.      **
22540 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
22550 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
22560 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a  or IN..      */.
22570 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53        rev = revS
22580 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69  et = 0;.      di
22590 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
225a0 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
225b0 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  ; j<nColumn; j++
225c0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
225d0 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54 72 75 65  nce = 1; /* True
225e0 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
225f0 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
22600 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61 73 73   */..        ass
22610 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75  ert( j>=pLoop->u
22620 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20 20 20 20  .btree.nEq .    
22630 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f          || (pLoo
22640 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 30 29  p->aLTerm[j]==0)
22650 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  ==(j<pLoop->nSki
22660 70 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  p).        );.  
22670 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f        if( j<pLoo
22680 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 26  p->u.btree.nEq &
22690 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  & j>=pLoop->nSki
226a0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  p ){.          u
226b0 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f 70 2d 3e  16 eOp = pLoop->
226c0 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
226d0 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  ator;..         
226e0 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
226f0 20 61 6e 64 20 49 53 20 61 6e 64 20 49 53 4e 55   and IS and ISNU
22700 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41 6c 73 6f  LL terms.  (Also
22710 20 73 6b 69 70 20 49 4e 20 74 65 72 6d 73 20 77   skip IN terms w
22720 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hen.          **
22730 20 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f 52 44   doing WHERE_ORD
22740 45 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f 63 65  ERBY_LIMIT proce
22750 73 73 69 6e 67 29 2e 20 0a 20 20 20 20 20 20 20  ssing). .       
22760 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
22770 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
22780 74 20 74 65 72 6d 20 69 73 20 61 20 63 6f 6c 75  t term is a colu
22790 6d 6e 20 6f 66 20 61 6e 20 28 28 3f 2c 3f 29 20  mn of an ((?,?) 
227a0 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 29 20  IN (SELECT...)) 
227b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
227c0 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77 68 69  pression for whi
227d0 63 68 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  ch the SELECT re
227e0 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  turns more than 
227f0 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20  one column,.    
22800 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 74        ** check t
22810 68 61 74 20 69 74 20 69 73 20 74 68 65 20 6f 6e  hat it is the on
22820 6c 79 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 62  ly column used b
22830 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 4f 74 68  y this loop. Oth
22840 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20  erwise,.        
22850 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 6e    ** if it is on
22860 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
22870 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f  , none of the co
22880 6c 75 6d 6e 73 20 63 61 6e 20 62 65 0a 20 20 20  lumns can be.   
22890 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64         ** consid
228a0 65 72 65 64 20 74 6f 20 6d 61 74 63 68 20 61 6e  ered to match an
228b0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2e 20   ORDER BY term. 
228c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
228d0 28 20 28 65 4f 70 20 26 20 65 71 4f 70 4d 61 73  ( (eOp & eqOpMas
228e0 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
228f0 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57       if( eOp & W
22900 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
22910 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
22920 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
22930 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
22940 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
22950 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
22960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22970 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
22980 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
22990 69 66 28 20 41 4c 57 41 59 53 28 65 4f 70 20 26  if( ALWAYS(eOp &
229a0 20 57 4f 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20   WO_IN) ){.     
229b0 20 20 20 20 20 20 20 2f 2a 20 41 4c 57 41 59 53         /* ALWAYS
229c0 28 29 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  () justification
229d0 3a 20 65 4f 70 20 69 73 20 61 6e 20 65 71 75 61  : eOp is an equa
229e0 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 20 64 75  lity operator du
229f0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  e to the.       
22a00 20 20 20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d       ** j<pLoop-
22a10 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 63 6f 6e  >u.btree.nEq con
22a20 73 74 72 61 69 6e 74 20 61 62 6f 76 65 2e 20 20  straint above.  
22a30 41 6e 79 20 65 71 75 61 6c 69 74 79 20 6f 74 68  Any equality oth
22a40 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
22a50 2a 20 74 68 61 6e 20 57 4f 5f 49 4e 20 69 73 20  * than WO_IN is 
22a60 63 61 70 74 75 72 65 64 20 62 79 20 74 68 65 20  captured by the 
22a70 70 72 65 76 69 6f 75 73 20 22 69 66 22 2e 20 20  previous "if".  
22a80 53 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20 20 20  So this one.    
22a90 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
22aa0 73 20 68 61 73 20 74 6f 20 62 65 20 57 4f 5f 49  s has to be WO_I
22ab0 4e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  N. */.          
22ac0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 4c 6f    Expr *pX = pLo
22ad0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70  op->aLTerm[j]->p
22ae0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22af0 20 20 66 6f 72 28 69 3d 6a 2b 31 3b 20 69 3c 70    for(i=j+1; i<p
22b00 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
22b10 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  q; i++){.       
22b20 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70         if( pLoop
22b30 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78  ->aLTerm[i]->pEx
22b40 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20  pr==pX ){.      
22b50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22b60 28 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ( (pLoop->aLTerm
22b70 5b 69 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  [i]->eOperator &
22b80 20 57 4f 5f 49 4e 29 20 29 3b 0a 20 20 20 20 20   WO_IN) );.     
22b90 20 20 20 20 20 20 20 20 20 20 20 62 4f 6e 63 65             bOnce
22ba0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22bb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22bc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22bd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22bf0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
22c00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
22c10 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
22c20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
22c30 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
22c40 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
22c50 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
22c60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
22c70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22c80 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
22c90 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
22ca0 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
22cb0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
22cc0 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
22cd0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
22ce0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
22cf0 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
22d00 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
22d10 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52  ) iColumn = XN_R
22d20 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65  OWID;.        }e
22d30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
22d40 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49  Column = XN_ROWI
22d50 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  D;.          rev
22d60 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
22d70 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
22d80 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20  n unconstrained 
22d90 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68  column that migh
22da0 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  t be NULL means 
22db0 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20  that this.      
22dc0 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69    ** WhereLoop i
22dd0 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72  s not well-order
22de0 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed.        */.  
22df0 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
22e00 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20  rDistinct.      
22e10 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30     && iColumn>=0
22e20 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d  .         && j>=
22e30 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
22e40 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
22e50 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61  Index->pTable->a
22e60 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
22e70 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  Null==0.        
22e80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
22e90 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
22ea0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
22eb0 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65       /* Find the
22ec0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
22ed0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
22ee0 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  to the j-th colu
22ef0 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  mn.        ** of
22f00 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d   the index and m
22f10 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42  ark that ORDER B
22f20 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20  Y term off .    
22f30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
22f40 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
22f50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e      for(i=0; bOn
22f60 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79  ce && i<nOrderBy
22f70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
22f80 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
22f90 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
22fa0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nue;.          p
22fb0 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
22fc0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
22fd0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
22fe0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
22ff0 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
23000 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
23010 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20  OUPBY );.       
23020 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
23030 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23040 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20  DISTINCTBY );.  
23050 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
23060 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  rlFlags & (WHERE
23070 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44  _GROUPBY|WHERE_D
23080 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29  ISTINCTBY))==0 )
23090 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20   bOnce = 0;.    
230a0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
230b0 6e 3e 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20  n>=XN_ROWID ){. 
230c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
230d0 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
230e0 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
230f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23100 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
23110 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
23120 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
23130 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
23140 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20  lumn!=iColumn ) 
23150 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23170 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 49 64         Expr *pId
23180 78 45 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e  xExpr = pIndex->
23190 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70  aColExpr->a[j].p
231a0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
231b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
231c0 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 4f 42  rCompareSkip(pOB
231d0 45 78 70 72 2c 20 70 49 64 78 45 78 70 72 2c 20  Expr, pIdxExpr, 
231e0 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20 20  iCur) ){.       
231f0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
23200 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23210 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23220 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
23230 21 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20  !=XN_ROWID ){.  
23240 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
23250 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43  = sqlite3ExprNNC
23260 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
23270 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
23280 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
23290 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
232a0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
232b0 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ll->zName, pInde
232c0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
232d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
232e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
232f0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
23300 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 6a 2b 31 3b  e.nIdxCol = j+1;
23310 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74  .          isMat
23320 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
23330 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23340 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
23350 73 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c  sMatch && (wctrl
23360 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
23370 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20  OUPBY)==0 ){.   
23380 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
23390 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
233a0 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
233b0 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
233c0 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
233d0 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    ** Sort order 
233e0 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f  is irrelevant fo
233f0 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
23400 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  use. */.        
23410 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a    if( revSet ){.
23420 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23430 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d  (rev ^ revIdx)!=
23440 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
23450 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74  ortOrder ) isMat
23460 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
23470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23480 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64       rev = revId
23490 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x ^ pOrderBy->a[
234a0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
234b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
234c0 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d  v ) *pRevMask |=
234d0 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b   MASKBIT(iLoop);
234e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76  .            rev
234f0 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Set = 1;.       
23500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23510 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
23520 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
23530 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  if( iColumn==XN_
23540 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
23550 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
23560 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d  istinctColumns==
23570 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
23580 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
23590 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
235a0 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  }.          obSa
235b0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
235c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
235d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
235e0 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20  match found */. 
235f0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
23600 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29  0 || j<nKeyCol )
23610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
23620 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
23630 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
23640 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
23650 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
23660 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23670 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23680 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
23690 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61   end Loop over a
236a0 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
236b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69   */.      if( di
236c0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b  stinctColumns ){
236d0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
236e0 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
236f0 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
23700 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
23710 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
23720 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f    } /* end-if no
23730 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20  t one-row */..  
23740 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
23750 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59  y other ORDER BY
23760 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65   terms that refe
23770 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20  rence pLoop */. 
23780 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
23790 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
237a0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
237b0 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  k |= pLoop->mask
237c0 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28  Self;.      for(
237d0 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
237e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
237f0 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  xpr *p;.        
23800 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20  Bitmask mTerm;. 
23810 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
23820 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
23830 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23840 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e    p = pOrderBy->
23850 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
23860 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69      mTerm = sqli
23870 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67  te3WhereExprUsag
23880 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  e(&pWInfo->sMask
23890 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20  Set,p);.        
238a0 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20  if( mTerm==0 && 
238b0 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
238c0 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74  nstant(p) ) cont
238d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
238e0 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44  ( (mTerm&~orderD
238f0 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20  istinctMask)==0 
23900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  ){.          obS
23910 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
23920 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23930 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a    }.    }.  } /*
23940 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76   End the loop ov
23950 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  er all WhereLoop
23960 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73  s from outer-mos
23970 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d  t down to inner-
23980 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62  most */.  if( ob
23990 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65  Sat==obDone ) re
239a0 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42  turn (i8)nOrderB
239b0 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  y;.  if( !isOrde
239c0 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
239d0 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d   for(i=nOrderBy-
239e0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
239f0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
23a00 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a  MASKBIT(i) - 1;.
23a10 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74        if( (obSat
23a20 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20  &m)==m ) return 
23a30 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  i;.    }.    ret
23a40 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
23a50 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn -1;.}.../*.*
23a60 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47  * If the WHERE_G
23a70 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
23a80 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70  et in the mask p
23a90 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
23aa0 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a  WhereBegin(),.**
23ab0 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73   the planner ass
23ac0 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70  umes that the sp
23ad0 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79  ecified pOrderBy
23ae0 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c   list is actuall
23af0 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20  y a GROUP.** BY 
23b00 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20  clause - and so 
23b10 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67  any order that g
23b20 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65  roups rows as re
23b30 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73  quired satisfies
23b40 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e   the.** request.
23b50 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
23b60 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
23b70 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
23b80 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20   for the caller 
23b90 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
23ba0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
23bb0 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c  he rows are real
23bc0 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72  ly being deliver
23bd0 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ed in sorted ord
23be0 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69  er, or.** just i
23bf0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64  n some other ord
23c00 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  er that provides
23c10 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72   the required gr
23c20 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  ouping. However,
23c30 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
23c40 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61  _SORTBYGROUP fla
23c50 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64  g is also passed
23c60 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
23c70 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a  Begin(), then.**
23c80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
23c90 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ay be called on 
23ca0 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65  the returned Whe
23cb0 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49  reInfo object. I
23cc0 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75  t returns.** tru
23cd0 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65  e if the rows re
23ce0 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72  ally will be sor
23cf0 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69  ted in the speci
23d00 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66  fied order, or f
23d10 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73  alse.** otherwis
23d20 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  e..**.** For exa
23d30 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a  mple, assuming:.
23d40 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
23d50 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c  NDEX i1 ON t1(x,
23d60 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a   Y);.**.** then.
23d70 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
23d80 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
23d90 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78  Y x,y ORDER BY x
23da0 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,y;   -- IsSorte
23db0 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45  d()==1.**   SELE
23dc0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
23dd0 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20  UP BY y,x ORDER 
23de0 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53  BY y,x;   -- IsS
23df0 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e  orted()==0.*/.in
23e00 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
23e10 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f  Sorted(WhereInfo
23e20 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
23e30 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
23e40 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23e50 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73  GROUPBY );.  ass
23e60 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
23e70 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23e80 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20  SORTBYGROUP );. 
23e90 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
23ea0 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65  sorted;.}..#ifde
23eb0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
23ec0 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
23ed0 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
23ee0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
23ef0 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
23f00 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
23f10 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
23f20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
23f30 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
23f40 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
23f50 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
23f60 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
23f70 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
23f80 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
23f90 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
23fa0 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
23fb0 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
23fc0 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
23fd0 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
23fe0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
23ff0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72   the cost of sor
24000 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20  ting nRow rows, 
24010 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68  assuming that th
24020 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20  e keys have .** 
24030 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73  nOrderby columns
24040 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69   and that the fi
24050 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75  rst nSorted colu
24060 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  mns are already 
24070 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a  in.** order..*/.
24080 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68  static LogEst wh
24090 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a  ereSortingCost(.
240a0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
240b0 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52  nfo,.  LogEst nR
240c0 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  ow,.  int nOrder
240d0 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65  By,.  int nSorte
240e0 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  d.){.  /* TUNING
240f0 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74  : Estimated cost
24100 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72   of a full exter
24110 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20  nal sort, where 
24120 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e  N is .  ** the n
24130 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f  umber of rows to
24140 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20   sort is:.  **. 
24150 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
24160 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e  0 * N * log(N)).
24170 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20  .  ** .  ** Or, 
24180 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  if the order-by 
24190 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72  clause has X ter
241a0 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20  ms but only the 
241b0 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72  last Y .  ** ter
241c0 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72  ms are out of or
241d0 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d  der, then block-
241e0 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64  sorting will red
241f0 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f  uce the .  ** so
24200 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20  rting cost to:. 
24210 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
24220 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
24230 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a  (N)) * (Y/X).  *
24240 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29  *.  ** The (Y/X)
24250 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65   term is impleme
24260 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b  nted using stack
24270 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65   variable rScale
24280 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f  .  ** below.  */
24290 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65  .  LogEst rScale
242a0 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61  , rSortCost;.  a
242b0 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
242c0 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33  0 && 66==sqlite3
242d0 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20  LogEst(100) );. 
242e0 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65   rScale = sqlite
242f0 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42  3LogEst((nOrderB
24300 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e  y-nSorted)*100/n
24310 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20  OrderBy) - 66;. 
24320 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
24330 77 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b  w + rScale + 16;
24340 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70 6c 65 20  ..  /* Multiple 
24350 62 79 20 6c 6f 67 28 4d 29 20 77 68 65 72 65 20  by log(M) where 
24360 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  M is the number 
24370 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a  of output rows..
24380 20 20 2a 2a 20 55 73 65 20 74 68 65 20 4c 49 4d    ** Use the LIM
24390 49 54 20 66 6f 72 20 4d 20 69 66 20 69 74 20 69  IT for M if it i
243a0 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  s smaller */.  i
243b0 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
243c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  lFlags & WHERE_U
243d0 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20 26 26 20  SE_LIMIT)!=0 && 
243e0 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e  pWInfo->iLimit<n
243f0 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52 6f 77 20  Row ){.    nRow 
24400 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74  = pWInfo->iLimit
24410 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74 43 6f 73  ;.  }.  rSortCos
24420 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e 52 6f 77  t += estLog(nRow
24430 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72  );.  return rSor
24440 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tCost;.}../*.** 
24450 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f  Given the list o
24460 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  f WhereLoop obje
24470 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70  cts at pWInfo->p
24480 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74  Loops, this rout
24490 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ine.** attempts 
244a0 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65  to find the lowe
244b0 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61  st cost path tha
244c0 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68  t visits each Wh
244d0 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e  ereLoop.** once.
244e0 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74    This path is t
244f0 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  hen loaded into 
24500 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  the pWInfo->a[].
24510 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a  pWLoop fields..*
24520 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74  *.** Assume that
24530 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
24540 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
24550 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20   that will need 
24560 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20  to be sorted.** 
24570 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20  will be nRowEst 
24580 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20  (in the 10*log2 
24590 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e  representation).
245a0 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72    Or, ignore sor
245b0 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66  ting.** costs if
245c0 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a   nRowEst==0..**.
245d0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
245e0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
245f0 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  r SQLITE_NOMEM o
24600 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
24610 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f  ation.** error o
24620 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
24630 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f   int wherePathSo
24640 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a  lver(WhereInfo *
24650 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e  pWInfo, LogEst n
24660 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
24670 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
24680 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
24690 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
246a0 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
246b0 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
246c0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
246d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
246e0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
246f0 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  in */.  Parse *p
24700 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
24710 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
24720 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
24730 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
24740 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
24750 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
24760 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24780 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76   Loop counter ov
24790 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
247a0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e  the join */.  in
247b0 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20  t ii, jj;       
247c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
247d0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
247e0 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20  t mxI = 0;      
247f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
24800 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74   of next entry t
24810 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69  o replace */.  i
24820 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
24830 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24840 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63  er of ORDER BY c
24850 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20  lause terms */. 
24860 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d   LogEst mxCost =
24870 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   0;        /* Ma
24880 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
24890 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
248a0 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72    LogEst mxUnsor
248b0 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  ted = 0;    /* M
248c0 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20  aximum unsorted 
248d0 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
248e0 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
248f0 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20  To, nFrom;      
24900 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24910 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20  f valid entries 
24920 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72  in aTo[] and aFr
24930 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50  om[] */.  WhereP
24940 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20  ath *aFrom;     
24950 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d      /* All nFrom
24960 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72   paths at the pr
24970 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a  evious level */.
24980 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f    WherePath *aTo
24990 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
249a0 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68  he nTo best path
249b0 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  s at the current
249c0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
249d0 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20  ePath *pFrom;   
249e0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
249f0 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74  ent of aFrom[] t
24a00 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
24a10 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
24a20 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20  Path *pTo;      
24a30 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
24a40 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74  nt of aTo[] that
24a50 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
24a60 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  on */.  WhereLoo
24a70 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20  p *pWLoop;      
24a80 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
24a90 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
24aa0 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  s */.  WhereLoop
24ab0 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20   **pX;          
24ac0 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79   /* Used to divy
24ad0 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d   up the pSpace m
24ae0 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  emory */.  LogEs
24af0 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30  t *aSortCost = 0
24b00 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20  ;    /* Sorting 
24b10 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74  and partial sort
24b20 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63  ing costs */.  c
24b30 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20  har *pSpace;    
24b40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
24b50 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65  orary memory use
24b60 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
24b70 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63  e */.  int nSpac
24b80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
24b90 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
24ba0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  ce allocated at 
24bb0 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61  pSpace */..  pPa
24bc0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
24bd0 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
24be0 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70  rse->db;.  nLoop
24bf0 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
24c00 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  l;.  /* TUNING: 
24c10 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69  For simple queri
24c20 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73  es, only the bes
24c30 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65  t path is tracke
24c40 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61  d..  ** For 2-wa
24c50 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62  y joins, the 5 b
24c60 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f  est paths are fo
24c70 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  llowed..  ** For
24c80 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d   joins of 3 or m
24c90 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63  ore tables, trac
24ca0 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61  k the 10 best pa
24cb0 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63  ths */.  mxChoic
24cc0 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f  e = (nLoop<=1) ?
24cd0 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f   1 : (nLoop==2 ?
24ce0 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65   5 : 10);.  asse
24cf0 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66  rt( nLoop<=pWInf
24d00 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
24d10 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43  c );.  WHERETRAC
24d20 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20  E(0x002, ("---- 
24d30 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28  begin solver.  (
24d40 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20  nRowEst=%d)\n", 
24d50 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a  nRowEst));..  /*
24d60 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a   If nRowEst is z
24d70 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73  ero and there is
24d80 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
24d90 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20  use, ignore it. 
24da0 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73  In this.  ** cas
24db0 65 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66  e the purpose of
24dc0 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   this call is to
24dd0 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
24de0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74  mber of rows ret
24df0 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  urned.  ** by th
24e00 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e  e overall query.
24e10 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d   Once this estim
24e20 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ate has been obt
24e30 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  ained, the calle
24e40 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f  r.  ** will invo
24e50 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ke this function
24e60 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20   a second time, 
24e70 70 61 73 73 69 6e 67 20 74 68 65 20 65 73 74 69  passing the esti
24e80 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a  mate as the.  **
24e90 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74   nRowEst paramet
24ea0 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  er.  */.  if( pW
24eb0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
24ec0 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20  0 || nRowEst==0 
24ed0 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  ){.    nOrderBy 
24ee0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
24ef0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49    nOrderBy = pWI
24f00 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
24f10 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Expr;.  }..  /* 
24f20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
24f30 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f  tialize space fo
24f40 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64  r aTo, aFrom and
24f50 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a   aSortCost[] */.
24f60 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65    nSpace = (size
24f70 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69  of(WherePath)+si
24f80 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
24f90 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65  *nLoop)*mxChoice
24fa0 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20  *2;.  nSpace += 
24fb0 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
24fc0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70   nOrderBy;.  pSp
24fd0 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ace = sqlite3DbM
24fe0 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
24ff0 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53  Space);.  if( pS
25000 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
25010 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
25020 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65  PT;.  aTo = (Whe
25030 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a  rePath*)pSpace;.
25040 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78    aFrom = aTo+mx
25050 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74  Choice;.  memset
25060 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f  (aFrom, 0, sizeo
25070 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20  f(aFrom[0]));.  
25080 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  pX = (WhereLoop*
25090 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63  *)(aFrom+mxChoic
250a0 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43  e);.  for(ii=mxC
250b0 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61  hoice*2, pFrom=a
250c0 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20  To; ii>0; ii--, 
250d0 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e  pFrom++, pX += n
250e0 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d  Loop){.    pFrom
250f0 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20  ->aLoop = pX;.  
25100 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  }.  if( nOrderBy
25110 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
25120 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
25130 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69 74  BY clause and it
25140 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69 67   is not being ig
25150 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20 20  nored, set up.  
25160 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74    ** space for t
25170 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61  he aSortCost[] a
25180 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d 65  rray. Each eleme
25190 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74 43  nt of the aSortC
251a0 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  ost array.    **
251b0 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 20   is either zero 
251c0 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61 73  - meaning it has
251d0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e   not yet been in
251e0 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74  itialized - or t
251f0 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f  he.    ** cost o
25200 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73  f sorting nRowEs
25210 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20 77  t rows of data w
25220 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 58  here the first X
25230 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a   terms of.    **
25240 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
25250 61 75 73 65 20 61 72 65 20 61 6c 72 65 61 64 79  ause are already
25260 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72 65   in order, where
25270 20 58 20 69 73 20 74 68 65 20 61 72 72 61 79 20   X is the array 
25280 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20  .    ** index.  
25290 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73 74  */.    aSortCost
252a0 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a   = (LogEst*)pX;.
252b0 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72 74      memset(aSort
252c0 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Cost, 0, sizeof(
252d0 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72  LogEst) * nOrder
252e0 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  By);.  }.  asser
252f0 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20  t( aSortCost==0 
25300 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
25310 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f 72  e]==(char*)&aSor
25320 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20  tCost[nOrderBy] 
25330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f  );.  assert( aSo
25340 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53  rtCost!=0 || &pS
25350 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63  pace[nSpace]==(c
25360 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a  har*)pX );..  /*
25370 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68   Seed the search
25380 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57   with a single W
25390 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e  herePath contain
253a0 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f  ing zero WhereLo
253b0 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ops..  **.  ** T
253c0 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65  UNING: Do not le
253d0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
253e0 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62  iterations go ab
253f0 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68 65 20  ove 28.  If the 
25400 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d  cost.  ** of com
25410 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  puting an automa
25420 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  tic index is not
25430 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69   paid back withi
25440 6e 20 74 68 65 20 66 69 72 73 74 20 32 38 0a 20  n the first 28. 
25450 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64   ** rows, then d
25460 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75  o not use the au
25470 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a  tomatic index. *
25480 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f  /.  aFrom[0].nRo
25490 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e  w = MIN(pParse->
254a0 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b  nQueryLoop, 48);
254b0 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d 73 71    assert( 48==sq
254c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38 29 20  lite3LogEst(28) 
254d0 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a  );.  nFrom = 1;.
254e0 20 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d 5b    assert( aFrom[
254f0 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30 20  0].isOrdered==0 
25500 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
25510 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  y ){.    /* If n
25520 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74 68  Loop is zero, th
25530 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
25540 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74 68  FROM terms in th
25550 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a 20  e query. Since. 
25560 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
25570 73 65 20 74 68 65 20 71 75 65 72 79 20 6d 61 79  se the query may
25580 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75   return a maximu
25590 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68  m of one row, th
255a0 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a  e results.    **
255b0 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
255c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6f 72  the requested or
255d0 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65 72  der. Set isOrder
255e0 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20 74  ed to nOrderBy t
255f0 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74  o.    ** indicat
25600 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e  e this. Or, if n
25610 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72 20  Loop is greater 
25620 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69  than zero, set i
25630 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20 20  sOrdered to.    
25640 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  ** -1, indicatin
25650 67 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  g that the resul
25660 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61 79  t set may or may
25670 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64 2c   not be ordered,
25680 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69   .    ** dependi
25690 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20  ng on the loops 
256a0 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 75 72  added to the cur
256b0 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20  rent plan.  */. 
256c0 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72     aFrom[0].isOr
256d0 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20  dered = nLoop>0 
256e0 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b  ? -1 : nOrderBy;
256f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
25700 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20  te successively 
25710 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74 68  longer WherePath
25720 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76  s using the prev
25730 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a  ious generation.
25740 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74    ** of WherePat
25750 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73 20  hs as the basis 
25760 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b  for the next.  K
25770 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
25780 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62   mxChoice.  ** b
25790 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61 63  est paths at eac
257a0 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  h generation */.
257b0 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
257c0 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
257d0 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20  p++){.    nTo = 
257e0 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  0;.    for(ii=0,
257f0 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69   pFrom=aFrom; ii
25800 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46  <nFrom; ii++, pF
25810 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  rom++){.      fo
25820 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d  r(pWLoop=pWInfo-
25830 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b  >pLoops; pWLoop;
25840 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e   pWLoop=pWLoop->
25850 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20  pNextLoop){.    
25860 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b      LogEst nOut;
25870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25880 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69        /* Rows vi
25890 73 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d 2b  sited by (pFrom+
258a0 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
258b0 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b     LogEst rCost;
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258d0 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
258e0 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  path (pFrom+pWLo
258f0 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  op) */.        L
25900 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64 3b  ogEst rUnsorted;
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25920 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f 73   /* Unsorted cos
25930 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  t of (pFrom+pWLo
25940 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  op) */.        i
25950 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46  8 isOrdered = pF
25960 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20  rom->isOrdered; 
25970 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66 6f   /* isOrdered fo
25980 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  r (pFrom+pWLoop)
25990 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d   */.        Bitm
259a0 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20  ask maskNew;    
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
259c0 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69 73   Mask of src vis
259d0 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a  ited by (..) */.
259e0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
259f0 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  revMask = 0;    
25a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
25a10 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20 6c  k of rev-order l
25a20 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f  oops for (..) */
25a30 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ..        if( (p
25a40 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20  WLoop->prereq & 
25a50 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70  ~pFrom->maskLoop
25a60 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
25a70 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
25a80 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26  Loop->maskSelf &
25a90 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
25aa0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
25ab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
25ac0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
25ad0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
25ae0 29 21 3d 30 20 26 26 20 70 46 72 6f 6d 2d 3e 6e  )!=0 && pFrom->n
25af0 52 6f 77 3c 33 20 29 7b 0a 20 20 20 20 20 20 20  Row<3 ){.       
25b00 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65     /* Do not use
25b10 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
25b20 64 65 78 20 69 66 20 74 68 65 20 74 68 69 73 20  dex if the this 
25b30 6c 6f 6f 70 20 69 73 20 65 78 70 65 63 74 65 64  loop is expected
25b40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
25b50 20 72 75 6e 20 6c 65 73 73 20 74 68 61 6e 20 31   run less than 1
25b60 2e 32 35 20 74 69 6d 65 73 2e 20 20 49 74 20 69  .25 times.  It i
25b70 73 20 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c  s tempting to al
25b80 73 6f 20 65 78 63 6c 75 64 65 0a 20 20 20 20 20  so exclude.     
25b90 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
25ba0 63 20 69 6e 64 65 78 20 75 73 61 67 65 20 6f 6e  c index usage on
25bb0 20 61 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20   an outer loop, 
25bc0 62 75 74 20 73 6f 6d 65 74 69 6d 65 73 20 61 6e  but sometimes an
25bd0 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 20 20 20   automatic.     
25be0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73       ** index is
25bf0 20 75 73 65 66 75 6c 20 69 6e 20 74 68 65 20 6f   useful in the o
25c00 75 74 65 72 20 6c 6f 6f 70 20 6f 66 20 61 20 63  uter loop of a c
25c10 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
25c20 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ry. */.         
25c30 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
25c40 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
25c50 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
25c60 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  nue;.        }..
25c70 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
25c80 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
25c90 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
25ca0 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
25cb0 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
25cc0 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
25cd0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e  t */.        rUn
25ce0 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
25cf0 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70  LogEstAdd(pWLoop
25d00 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d  ->rSetup,pWLoop-
25d10 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e  >rRun + pFrom->n
25d20 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55  Row);.        rU
25d30 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nsorted = sqlite
25d40 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
25d50 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e  rted, pFrom->rUn
25d60 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  sorted);.       
25d70 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e   nOut = pFrom->n
25d80 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f  Row + pWLoop->nO
25d90 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  ut;.        mask
25da0 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  New = pFrom->mas
25db0 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
25dc0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
25dd0 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c    if( isOrdered<
25de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
25df0 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65  sOrdered = where
25e00 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
25e10 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20  erBy(pWInfo,.   
25e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e30 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
25e40 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49  erBy, pFrom, pWI
25e50 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c  nfo->wctrlFlags,
25e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25e70 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70          iLoop, p
25e80 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29  WLoop, &revMask)
25e90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25ea0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61  .          revMa
25eb0 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
25ec0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
25ed0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
25ee0 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64  ered>=0 && isOrd
25ef0 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b  ered<nOrderBy ){
25f00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
25f10 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
25f20 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ed]==0 ){.      
25f30 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
25f40 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65  isOrdered] = whe
25f50 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25f70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20  WInfo, nRowEst, 
25f80 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65  nOrderBy, isOrde
25f90 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  red.            
25fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
25fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
25fc0 4e 47 3a 20 20 41 64 64 20 61 20 73 6d 61 6c 6c  NG:  Add a small
25fd0 20 65 78 74 72 61 20 70 65 6e 61 6c 74 79 20 28   extra penalty (
25fe0 35 29 20 74 6f 20 73 6f 72 74 69 6e 67 20 61 73  5) to sorting as
25ff0 20 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   an.          **
26000 20 65 78 74 72 61 20 65 6e 63 6f 75 72 61 67 6d   extra encouragm
26010 65 6e 74 20 74 6f 20 74 68 65 20 71 75 65 72 79  ent to the query
26020 20 70 6c 61 6e 6e 65 72 20 74 6f 20 73 65 6c 65   planner to sele
26030 63 74 20 61 20 70 6c 61 6e 0a 20 20 20 20 20 20  ct a plan.      
26040 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65      ** where the
26050 20 72 6f 77 73 20 65 6d 65 72 67 65 20 69 6e 20   rows emerge in 
26060 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
26070 72 20 77 69 74 68 6f 75 74 20 61 6e 79 20 73 6f  r without any so
26080 72 74 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rting.          
26090 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ** required. */.
260a0 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
260b0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
260c0 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53  dd(rUnsorted, aS
260d0 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
260e0 64 5d 29 20 2b 20 35 3b 0a 0a 20 20 20 20 20 20  d]) + 5;..      
260f0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
26100 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20  x002,.          
26110 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20      ("---- sort 
26120 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64  cost=%-3d (%d/%d
26130 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  ) increases cost
26140 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c   %3d to %-3d\n",
26150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26160 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
26170 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d  red], (nOrderBy-
26180 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64  isOrdered), nOrd
26190 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
261a0 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c        rUnsorted,
261b0 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20   rCost));.      
261c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
261d0 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f     rCost = rUnso
261e0 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  rted;.          
261f0 72 55 6e 73 6f 72 74 65 64 20 2d 3d 20 32 3b 20  rUnsorted -= 2; 
26200 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 53 6c 69   /* TUNING:  Sli
26210 67 68 74 20 62 69 61 73 20 69 6e 20 66 61 76 6f  ght bias in favo
26220 72 20 6f 66 20 6e 6f 2d 73 6f 72 74 20 70 6c 61  r of no-sort pla
26230 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ns */.        }.
26240 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
26250 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
26260 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
26270 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
26280 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68  .        ** mxCh
26290 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72  oice best-so-far
262a0 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20   paths..        
262b0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69  **.        ** Fi
262c0 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20  rst look for an 
262d0 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d  existing path am
262e0 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ong best-so-far 
262f0 70 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a  paths.        **
26300 20 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65   that covers the
26310 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
26320 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
26330 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20  ame isOrdered.  
26340 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67        ** setting
26350 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   as the current 
26360 70 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a  path candidate..
26370 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
26380 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22     ** The term "
26390 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
263a0 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
263b0 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c  )==0" is equival
263c0 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ent.        ** t
263d0 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  o (pTo->isOrdere
263e0 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64  d==(-1))==(isOrd
263f0 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72  ered==(-1))" for
26400 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20   the range.     
26410 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76     ** of legal v
26420 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65  alues for isOrde
26430 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20  red, -1..64..   
26440 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26450 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54  for(jj=0, pTo=aT
26460 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c  o; jj<nTo; jj++,
26470 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
26480 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b     if( pTo->mask
26490 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20  Loop==maskNew.  
264a0 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54           && ((pT
264b0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
264c0 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
264d0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
264e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
264f0 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
26500 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
26510 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
26520 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26530 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
26540 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
26550 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69  ne of the existi
26560 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
26570 61 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63  aths match the c
26580 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20  andidate. */.   
26590 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
265a0 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
265b0 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78      && (rCost>mx
265c0 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d  Cost || (rCost==
265d0 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72  mxCost && rUnsor
265e0 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29  ted>=mxUnsorted)
265f0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
26600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26610 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64  e current candid
26620 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72  ate is no better
26630 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65   than any of the
26640 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20   mxChoice.      
26650 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63        ** paths c
26660 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
26670 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66  best-so-far buff
26680 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a  er.  So discard.
26690 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
266a0 68 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73  his candidate as
266b0 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a   not viable. */.
266c0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
266d0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
266e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
266f0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
26700 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
26710 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26720 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
26730 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
26740 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
26750 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
26760 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
26770 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
26780 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
26790 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73  Cost, nOut, rUns
267a0 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  orted,.         
267b0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
267c0 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
267d0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
267e0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
267f0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
26800 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
26810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
26820 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
26830 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61  is points it mea
26840 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ns that the new 
26850 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20  candidate path. 
26860 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
26870 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
26880 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
26890 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a  -so-far paths. *
268a0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
268b0 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
268c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
268d0 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
268e0 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
268f0 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
26900 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
26910 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
26920 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
26930 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
26940 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
26950 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
26960 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
26970 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26980 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
26990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
269a0 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
269b0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
269c0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
269d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
269e0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
269f0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
26a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
26a10 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
26a20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
26a30 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
26a40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
26a50 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
26a60 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
26a70 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
26a80 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c  nOut, rUnsorted,
26a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26aa0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
26ab0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
26ac0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
26ad0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
26ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26af0 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
26b00 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65 73  ches here if bes
26b10 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54  t-so-far path pT
26b20 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73  o=aTo[jj] covers
26b30 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
26b40 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f  * same set of lo
26b50 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20  ops and has the 
26b60 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 20 73  same isOrdered s
26b70 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20  etting as the.  
26b80 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69          ** candi
26b90 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63  date path.  Chec
26ba0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
26bb0 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
26bc0 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20   replace.       
26bd0 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20     ** pTo or if 
26be0 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68  the candidate sh
26bf0 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 2e  ould be skipped.
26c00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
26c10 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
26c20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 69 73 20 61  conditional is a
26c30 6e 20 65 78 70 61 6e 64 65 64 20 76 65 63 74 6f  n expanded vecto
26c40 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 71 75  r comparison equ
26c50 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 20 20  ivalent to:.    
26c60 20 20 20 20 20 20 2a 2a 20 20 20 28 70 54 6f 2d        **   (pTo-
26c70 3e 72 43 6f 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77  >rCost,pTo->nRow
26c80 2c 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 29  ,pTo->rUnsorted)
26c90 20 3c 3d 20 28 72 43 6f 73 74 2c 6e 4f 75 74 2c   <= (rCost,nOut,
26ca0 72 55 6e 73 6f 72 74 65 64 29 0a 20 20 20 20 20  rUnsorted).     
26cb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26cc0 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
26cd0 3c 72 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20  <rCost .        
26ce0 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73     || (pTo->rCos
26cf0 74 3d 3d 72 43 6f 73 74 0a 20 20 20 20 20 20 20  t==rCost.       
26d00 20 20 20 20 20 20 20 20 26 26 20 28 70 54 6f 2d          && (pTo-
26d10 3e 6e 52 6f 77 3c 6e 4f 75 74 0a 20 20 20 20 20  >nRow<nOut.     
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
26d30 20 28 70 54 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75   (pTo->nRow==nOu
26d40 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  t && pTo->rUnsor
26d50 74 65 64 3c 3d 72 55 6e 73 6f 72 74 65 64 29 0a  ted<=rUnsorted).
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20    ).            
26d80 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b    ).          ){
26d90 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
26da0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
26db0 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
26dc0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26dd0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
26de0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26df0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e10 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73    "Skip   %s cos
26e20 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
26e30 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
26e40 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
26e50 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
26e60 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
26e70 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55   rCost, nOut, rU
26e80 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nsorted,.       
26e90 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
26ea0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
26eb0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26ed0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26ee0 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d  ("   vs %s cost=
26ef0 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
26f00 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
26f10 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
26f20 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
26f30 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
26f40 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
26f50 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
26f60 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
26f70 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65  ted, pTo->isOrde
26f80 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73  red>=0 ? pTo->is
26f90 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
26fa0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
26fb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
26fc0 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20       /* Discard 
26fd0 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61  the candidate pa
26fe0 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20  th from further 
26ff0 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f  consideration */
27000 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
27010 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
27020 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20  t==rCost );.    
27030 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
27040 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27050 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27060 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
27070 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ost+1 );.       
27080 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65     /* Control re
27090 61 63 68 65 73 20 68 65 72 65 20 69 66 20 74 68  aches here if th
270a0 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  e candidate path
270b0 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
270c0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
270d0 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c   pTo path.  Repl
270e0 61 63 65 20 70 54 6f 20 77 69 74 68 20 74 68 65  ace pTo with the
270f0 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23   candidate. */.#
27100 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
27110 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
27120 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
27130 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
27140 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
27150 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
27160 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
27170 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74            "Updat
27180 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  e %s cost=%-3d,%
27190 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
271a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
271b0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
271c0 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
271d0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
271e0 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20  ut, rUnsorted,. 
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
27200 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
27210 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
27220 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
27230 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
27240 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73  tf("  was %s cos
27250 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
27260 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
27270 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
27280 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
27290 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
272a0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
272b0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
272c0 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65     pTo->rUnsorte
272d0 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  d, pTo->isOrdere
272e0 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
272f0 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
27300 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
27310 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
27320 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70         /* pWLoop
27330 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41   is a winner.  A
27340 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74  dd it to the set
27350 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20   of best so far 
27360 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  */.        pTo->
27370 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  maskLoop = pFrom
27380 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
27390 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
273a0 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c         pTo->revL
273b0 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  oop = revMask;. 
273c0 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77         pTo->nRow
273d0 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20   = nOut;.       
273e0 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
273f0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
27400 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55  ->rUnsorted = rU
27410 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
27420 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20   pTo->isOrdered 
27430 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  = isOrdered;.   
27440 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d       memcpy(pTo-
27450 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61  >aLoop, pFrom->a
27460 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65  Loop, sizeof(Whe
27470 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b  reLoop*)*iLoop);
27480 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c  .        pTo->aL
27490 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c  oop[iLoop] = pWL
274a0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  oop;.        if(
274b0 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29   nTo>=mxChoice )
274c0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20  {.          mxI 
274d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 0;.          m
274e0 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72  xCost = aTo[0].r
274f0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
27500 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f  mxUnsorted = aTo
27510 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  [0].nRow;.      
27520 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
27530 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
27540 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
27550 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
27560 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
27570 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20  >mxCost .       
27580 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72        || (pTo->r
27590 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
275a0 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d  pTo->rUnsorted>m
275b0 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20  xUnsorted) .    
275c0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
275d0 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
275e0 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
275f0 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e              mxUn
27600 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55  sorted = pTo->rU
27610 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
27620 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b         mxI = jj;
27630 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27640 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27650 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27660 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45   }..#ifdef WHERE
27670 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f  TRACE_ENABLED  /
27680 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28  * >=2 */.    if(
27690 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
276a0 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20  ce & 0x02 ){.   
276b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
276c0 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65  rintf("---- afte
276d0 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c  r round %d ----\
276e0 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  n", iLoop);.    
276f0 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d    for(ii=0, pTo=
27700 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b  aTo; ii<nTo; ii+
27710 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
27720 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27730 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d  rintf(" %s cost=
27740 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f  %-3d nrow=%-3d o
27750 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
27760 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
27770 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
27780 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
27790 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
277a0 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
277b0 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d  dered>=0 ? (pTo-
277c0 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20  >isOrdered+'0') 
277d0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
277e0 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
277f0 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed>0 ){.        
27800 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27810 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
27820 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
27830 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
27840 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
27850 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27860 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
27870 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
27880 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
27890 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
278a0 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
278b0 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
278c0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
278d0 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
278e0 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
278f0 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
27900 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
27910 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d    }..  if( nFrom
27920 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
27930 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27940 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c  e, "no query sol
27950 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ution");.    sql
27960 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
27970 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65   pSpace);.    re
27980 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
27990 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  R;.  }.  .  /* F
279a0 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
279b0 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d  ost path.  pFrom
279c0 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
279d0 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70  inting to that p
279e0 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d  ath */.  pFrom =
279f0 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69   aFrom;.  for(ii
27a00 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  =1; ii<nFrom; ii
27a10 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
27a20 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b  om->rCost>aFrom[
27a30 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f  ii].rCost ) pFro
27a40 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a  m = &aFrom[ii];.
27a50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57    }.  assert( pW
27a60 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
27a70 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
27a80 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
27a90 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
27aa0 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
27ab0 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
27ac0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
27ad0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
27ae0 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
27af0 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
27b00 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
27b10 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
27b20 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
27b30 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
27b40 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
27b50 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
27b60 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
27b70 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
27b80 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
27b90 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
27ba0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
27bb0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
27bc0 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49  T)!=0.   && (pWI
27bd0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
27be0 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
27bf0 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49  BY)==0.   && pWI
27c00 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
27c10 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
27c20 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73  OOP.   && nRowEs
27c30 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  t.  ){.    Bitma
27c40 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  sk notUsed;.    
27c50 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
27c60 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
27c70 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
27c80 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70  o->pResultSet, p
27c90 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
27ca0 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53         WHERE_DIS
27cb0 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31  TINCTBY, nLoop-1
27cc0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
27cd0 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
27ce0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
27cf0 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
27d00 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  et->nExpr ){.   
27d10 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
27d20 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
27d30 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
27d40 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66     }.  }.  pWInf
27d50 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  o->bOrderedInner
27d60 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  Loop = 0;.  if( 
27d70 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
27d80 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   ){.    if( pWIn
27d90 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
27da0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
27db0 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  Y ){.      if( p
27dc0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d  From->isOrdered=
27dd0 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
27de0 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
27df0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
27e00 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
27e10 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
27e20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
27e30 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  e{.      pWInfo-
27e40 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d  >nOBSat = pFrom-
27e50 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
27e60 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
27e70 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
27e80 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  op;.      if( pW
27e90 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20  Info->nOBSat<=0 
27ea0 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
27eb0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20  o->nOBSat = 0;. 
27ec0 20 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70         if( nLoop
27ed0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
27ee0 75 33 32 20 77 73 46 6c 61 67 73 20 3d 20 70 46  u32 wsFlags = pF
27ef0 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
27f00 2d 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  -1]->wsFlags;.  
27f10 20 20 20 20 20 20 20 20 69 66 28 20 28 77 73 46          if( (wsF
27f20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
27f30 52 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  ROW)==0 .       
27f40 20 20 20 20 26 26 20 28 77 73 46 6c 61 67 73 26      && (wsFlags&
27f50 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
27f60 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57  _COLUMN_IN))!=(W
27f70 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43  HERE_IPK|WHERE_C
27f80 4f 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20  OLUMN_IN).      
27f90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
27fa0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30     Bitmask m = 0
27fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
27fc0 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
27fd0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
27fe0 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
27ff0 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
28000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28010 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52          WHERE_OR
28020 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f  DERBY_LIMIT, nLo
28030 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
28040 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29  op[nLoop-1], &m)
28050 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
28060 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20  stcase( wsFlags 
28070 26 20 57 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20  & WHERE_IPK );. 
28080 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
28090 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57  ase( wsFlags & W
280a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
280b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
280c0 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  ( rc==pWInfo->pO
280d0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
280e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
280f0 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49  WInfo->bOrderedI
28100 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20  nnerLoop = 1;.  
28110 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
28120 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b  fo->revMask = m;
28130 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28140 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28150 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28160 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e   }.    if( (pWIn
28170 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
28180 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
28190 55 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70  UP).        && p
281a0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70  WInfo->nOBSat==p
281b0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
281c0 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e  >nExpr && nLoop>
281d0 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42  0.    ){.      B
281e0 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
281f0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   0;.      int nO
28200 72 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68  rder = wherePath
28210 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
28220 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
28230 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20  >pOrderBy, .    
28240 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20        pFrom, 0, 
28250 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e  nLoop-1, pFrom->
28260 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20  aLoop[nLoop-1], 
28270 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29  &revMask.      )
28280 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28290 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d  pWInfo->sorted==
282a0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
282b0 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70  Order==pWInfo->p
282c0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
282d0 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
282e0 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20  ->sorted = 1;.  
282f0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
28300 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b  vMask = revMask;
28310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28320 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   }...  pWInfo->n
28330 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e  RowOut = pFrom->
28340 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nRow;..  /* Free
28350 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   temporary memor
28360 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63  y and return suc
28370 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cess */.  sqlite
28380 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53  3DbFreeNN(db, pS
28390 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
283a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
283b0 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73  .** Most queries
283c0 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67   use only a sing
283d0 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61  le table (they a
283e0 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e  re not joins) an
283f0 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65  d have.** simple
28400 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
28410 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20  against indexed 
28420 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f  fields.  This ro
28430 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a  utine attempts.*
28440 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20  * to plan those 
28450 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69  simple cases usi
28460 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72  ng much less cer
28470 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a  emony than the.*
28480 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
28490 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c  e query planner,
284a0 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65   and thereby yie
284b0 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65  ld faster sqlite
284c0 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74  3_prepare().** t
284d0 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  imes for the com
284e0 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  mon case..**.** 
284f0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
28500 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74  on success, if t
28510 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
28520 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
28530 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75  .** no-frills qu
28540 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65  ery planner.  Re
28550 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69  turn zero if thi
28560 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68  s query needs th
28570 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  e .** general-pu
28580 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
28590 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ner..*/.static i
285a0 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  nt whereShortCut
285b0 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
285c0 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
285d0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
285e0 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  o;.  struct SrcL
285f0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
28600 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
28610 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
28620 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65   *pTerm;.  Where
28630 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69  Loop *pLoop;.  i
28640 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a  nt iCur;.  int j
28650 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
28660 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
28670 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
28680 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
28690 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
286a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
286b0 52 5f 53 55 42 43 4c 41 55 53 45 20 29 20 72 65  R_SUBCLAUSE ) re
286c0 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
286d0 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ( pWInfo->pTabLi
286e0 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20  st->nSrc>=1 );. 
286f0 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
28700 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
28710 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
28720 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74  ab;.  if( IsVirt
28730 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
28740 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65  rn 0;.  if( pIte
28750 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
28760 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  y ) return 0;.  
28770 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
28780 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26  ursor;.  pWC = &
28790 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70  pWInfo->sWC;.  p
287a0 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  Loop = pBuilder-
287b0 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  >pNew;.  pLoop->
287c0 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  wsFlags = 0;.  p
287d0 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b  Loop->nSkip = 0;
287e0 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74  .  pTerm = sqlit
287f0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
28800 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30  pWC, iCur, -1, 0
28810 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30  , WO_EQ|WO_IS, 0
28820 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
28830 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
28840 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28850 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
28860 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
28870 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
28880 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  |WHERE_IPK|WHERE
28890 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f  _ONEROW;.    pLo
288a0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  op->aLTerm[0] = 
288b0 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70  pTerm;.    pLoop
288c0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
288d0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
288e0 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a  .nEq = 1;.    /*
288f0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
28900 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20   a rowid lookup 
28910 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f  is 10 */.    pLo
28920 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20  op->rRun = 33;  
28930 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 33==sqlite3Lo
28940 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65  gEst(10) */.  }e
28950 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64  lse{.    for(pId
28960 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
28970 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
28980 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
28990 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20  nt opMask;.     
289a0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
289b0 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f  aLTermSpace==pLo
289c0 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20  op->aLTerm );.  
289d0 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75      if( !IsUniqu
289e0 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20  eIndex(pIdx).   
289f0 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61      || pIdx->pPa
28a00 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20  rtIdxWhere!=0 . 
28a10 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e        || pIdx->n
28a20 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65  KeyCol>ArraySize
28a30 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70  (pLoop->aLTermSp
28a40 61 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f  ace) .      ) co
28a50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70  ntinue;.      op
28a60 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69  Mask = pIdx->uni
28a70 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45  qNotNull ? (WO_E
28a80 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51  Q|WO_IS) : WO_EQ
28a90 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
28aa0 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
28ab0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
28ac0 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  pTerm = sqlite3W
28ad0 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
28ae0 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70  , iCur, j, 0, op
28af0 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20  Mask, pIdx);.   
28b00 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
28b10 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
28b20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
28b30 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28b40 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
28b50 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
28b60 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
28b70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d   }.      if( j!=
28b80 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  pIdx->nKeyCol ) 
28b90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
28ba0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
28bb0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
28bc0 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48  |WHERE_ONEROW|WH
28bd0 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
28be0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43     if( pIdx->isC
28bf0 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65  overing || (pIte
28c00 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 70 49 64  m->colUsed & pId
28c10 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 29 3d  x->colNotIdxed)=
28c20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
28c30 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
28c40 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
28c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
28c60 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b  oop->nLTerm = j;
28c70 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
28c80 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20  btree.nEq = j;. 
28c90 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
28ca0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
28cb0 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  x;.      /* TUNI
28cc0 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e  NG: Cost of a un
28cd0 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ique index looku
28ce0 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20  p is 15 */.     
28cf0 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
28d00 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74  9;  /* 39==sqlit
28d10 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a  e3LogEst(15) */.
28d20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28d30 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
28d40 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20  op->wsFlags ){. 
28d50 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d     pLoop->nOut =
28d60 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20   (LogEst)1;.    
28d70 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
28d80 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  oop = pLoop;.   
28d90 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
28da0 3e 73 4d 61 73 6b 53 65 74 2e 6e 3d 3d 31 20 26  >sMaskSet.n==1 &
28db0 26 20 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e  & iCur==pWInfo->
28dc0 73 4d 61 73 6b 53 65 74 2e 69 78 5b 30 5d 20 29  sMaskSet.ix[0] )
28dd0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73  ;.    pLoop->mas
28de0 6b 53 65 6c 66 20 3d 20 31 3b 20 2f 2a 20 73 71  kSelf = 1; /* sq
28df0 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
28e00 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
28e10 53 65 74 2c 20 69 43 75 72 29 3b 20 2a 2f 0a 20  Set, iCur); */. 
28e20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
28e30 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a  iTabCur = iCur;.
28e40 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77      pWInfo->nRow
28e50 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Out = 1;.    if(
28e60 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
28e70 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
28e80 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  at =  pWInfo->pO
28e90 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
28ea0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
28eb0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
28ec0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
28ed0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
28ee0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
28ef0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
28f00 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  UE;.    }.#ifdef
28f10 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
28f20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27    pLoop->cId = '
28f30 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0';.#endif.    r
28f40 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
28f50 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
28f60 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
28f70 6e 20 66 6f 72 20 65 78 70 72 49 73 44 65 74 65  n for exprIsDete
28f80 72 6d 69 6e 69 73 74 69 63 28 29 2e 0a 2a 2f 0a  rministic()..*/.
28f90 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
28fa0 6f 64 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74  odeIsDeterminist
28fb0 69 63 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ic(Walker *pWalk
28fc0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
28fd0 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
28fe0 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
28ff0 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
29000 79 28 70 45 78 70 72 2c 20 45 50 5f 43 6f 6e 73  y(pExpr, EP_Cons
29010 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20  tFunc)==0 ){.   
29020 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
29030 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
29040 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
29050 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
29060 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  inue;.}../*.** R
29070 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
29080 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  e expression con
29090 74 61 69 6e 73 20 6e 6f 20 6e 6f 6e 2d 64 65 74  tains no non-det
290a0 65 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20 0a  erministic SQL .
290b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20 44 6f  ** functions. Do
290c0 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 6e 6f   not consider no
290d0 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
290e0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  SQL functions th
290f0 61 74 20 61 72 65 20 0a 2a 2a 20 70 61 72 74 20  at are .** part 
29100 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 20 73 74  of sub-select st
29110 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
29120 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 44 65  tic int exprIsDe
29130 74 65 72 6d 69 6e 69 73 74 69 63 28 45 78 70 72  terministic(Expr
29140 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77   *p){.  Walker w
29150 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
29160 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
29170 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
29180 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
29190 20 65 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72   exprNodeIsDeter
291a0 6d 69 6e 69 73 74 69 63 3b 0a 20 20 77 2e 78 53  ministic;.  w.xS
291b0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
291c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
291d0 6b 46 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33  kFail;.  sqlite3
291e0 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
291f0 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
29200 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
29210 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
29220 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
29230 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
29240 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
29250 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
29260 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
29270 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
29280 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
29290 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
292a0 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
292b0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
292c0 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
292d0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
292e0 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
292f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
29300 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
29310 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
29320 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
29330 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
29340 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
29350 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
29360 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
29370 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
29380 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
29390 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
293a0 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
293b0 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
293c0 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
293d0 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
293e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
293f0 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
29400 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
29410 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
29420 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
29430 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
29440 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
29450 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
29460 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
29470 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
29480 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
29490 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
294a0 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
294b0 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
294c0 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
294d0 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
294e0 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
294f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
29500 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
29510 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
29520 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
29530 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
29540 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
29550 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
29560 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
29570 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
29580 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
29590 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
295a0 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
295b0 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295d0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
295e0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
295f0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
29600 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
29610 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
29620 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
29630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29640 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
29650 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
29660 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
29670 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
29680 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
29690 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
296a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
296b0 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
296c0 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
296d0 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
296e0 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
296f0 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
29700 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
29710 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
29720 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
29730 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
29740 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
29750 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
29760 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
29770 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
29780 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
29790 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
297a0 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
297b0 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
297c0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
297d0 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
297e0 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
297f0 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
29800 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
29810 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
29820 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
29830 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
29840 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
29850 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
29860 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
29870 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
29880 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
29890 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
298a0 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
298b0 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
298c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
298d0 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
298e0 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
298f0 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
29900 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
29910 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
29920 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
29930 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
29940 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
29950 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
29960 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
29970 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
29980 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
29990 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
299a0 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
299b0 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
299c0 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
299d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
299e0 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
299f0 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
29a00 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
29a10 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
29a20 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
29a30 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
29a40 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
29a50 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
29a60 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
29a70 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
29a80 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
29a90 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
29aa0 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
29ab0 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
29ac0 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
29ad0 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
29ae0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
29af0 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
29b00 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
29b10 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
29b20 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
29b30 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
29b40 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
29b50 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
29b60 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
29b70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
29b80 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
29b90 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
29ba0 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
29bb0 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
29bc0 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
29bd0 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
29be0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
29bf0 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
29c00 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
29c10 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
29c20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
29c30 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
29c40 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
29c50 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
29c60 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
29c70 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
29c80 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
29c90 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
29ca0 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
29cb0 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
29cc0 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
29cd0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
29ce0 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
29cf0 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
29d00 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
29d10 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
29d20 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
29d30 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
29d40 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
29d50 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
29d60 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
29d70 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
29d80 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
29d90 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
29da0 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
29db0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
29dc0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
29dd0 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
29de0 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
29df0 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
29e00 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
29e10 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
29e20 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
29e30 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
29e40 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
29e50 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
29e60 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
29e70 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
29e80 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
29e90 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
29ea0 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52  lause (or the GR
29eb0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  OUP BY clause.**
29ec0 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   if the WHERE_GR
29ed0 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
29ee0 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29  t in wctrlFlags)
29ef0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
29f00 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65  tement.** if the
29f10 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
29f20 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
29f30 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
29f40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
29f50 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
29f60 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
29f70 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
29f80 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20  hen pOrderBy is 
29f90 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
29fa0 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65  iIdxCur paramete
29fb0 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
29fc0 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
29fd0 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52  ex.  If .** WHER
29fe0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69  E_OR_SUBCLAUSE i
29ff0 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69  s set, iIdxCur i
2a000 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
2a010 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ber of an index.
2a020 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52  ** to use for OR
2a030 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2a040 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63  ng.  The WHERE c
2a050 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65  lause should use
2a060 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69   this.** specifi
2a070 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48  c cursor.  If WH
2a080 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2a090 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e  RED is set, then
2a0a0 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74   iIdxCur is.** t
2a0b0 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
2a0c0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63  in an array of c
2a0d0 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69  ursors for all i
2a0e0 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72  ndices.  iIdxCur
2a0f0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73   should.** be us
2a100 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
2a110 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75  e appropriate cu
2a120 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f  rsor depending o
2a130 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73  n which index is
2a140 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65  .** used..*/.Whe
2a150 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
2a160 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
2a170 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2a180 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2a190 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2a1a0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2a1b0 74 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  t,      /* FROM 
2a1c0 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f  clause: A list o
2a1d0 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
2a1e0 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
2a1f0 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
2a200 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2a210 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2a220 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2a230 72 42 79 2c 20 20 20 20 20 2f 2a 20 41 6e 20 4f  rBy,     /* An O
2a240 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
2a250 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72  P BY) clause, or
2a260 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
2a270 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c  ist *pResultSet,
2a280 20 20 20 2f 2a 20 51 75 65 72 79 20 72 65 73 75     /* Query resu
2a290 6c 74 20 73 65 74 2e 20 20 52 65 71 27 64 20 66  lt set.  Req'd f
2a2a0 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20  or DISTINCT */. 
2a2b0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
2a2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a2d0 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
2a2e0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
2a2f0 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41  nt.h */.  int iA
2a300 75 78 41 72 67 20 20 20 20 20 20 20 20 20 20 20  uxArg           
2a310 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 52    /* If WHERE_OR
2a320 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65  _SUBCLAUSE is se
2a330 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
2a340 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
2a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a360 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53 45   ** If WHERE_USE
2a370 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68 65  _LIMIT, then the
2a380 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f   limit amount */
2a390 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
2a3a0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
2a3b0 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
2a3c0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
2a3d0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
2a3e0 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
2a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a400 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
2a410 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
2a420 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
2a430 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
2a440 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
2a450 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2a460 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2a470 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
2a480 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
2a490 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2a4a0 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
2a4b0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
2a4c0 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
2a4d0 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
2a4e0 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
2a4f0 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
2a500 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
2a510 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
2a520 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
2a530 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
2a540 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
2a550 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
2a560 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
2a570 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
2a580 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
2a590 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
2a5a0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
2a5b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
2a5c0 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
2a5d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
2a5e0 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
2a5f0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2a620 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
2a630 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2a640 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2a650 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
2a660 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2a670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2a680 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
2a690 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30  8 bFordelete = 0
2a6a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46  ;         /* OPF
2a6b0 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72  LAG_FORDELETE or
2a6c0 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70   zero, as approp
2a6d0 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65  riate */..  asse
2a6e0 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
2a6f0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2a700 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20  MULTIROW)==0 || 
2a710 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72 6c  (.        (wctrl
2a720 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2a730 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
2a740 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74 72  0 .     && (wctr
2a750 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2a760 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20  R_SUBCLAUSE)==0 
2a770 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c  .  ));..  /* Onl
2a780 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f  y one of WHERE_O
2a790 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20 57  R_SUBCLAUSE or W
2a7a0 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a  HERE_USE_LIMIT *
2a7b0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
2a7c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2a7d0 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
2a7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2a7f0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2a800 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d 3d  ERE_USE_LIMIT)==
2a810 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61  0 );..  /* Varia
2a820 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
2a830 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
2a840 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
2a850 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
2a860 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a  of(sWLB));..  /*
2a870 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20   An ORDER/GROUP 
2a880 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72  BY clause of mor
2a890 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20  e than 63 terms 
2a8a0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
2a8b0 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  zed */.  testcas
2a8c0 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  e( pOrderBy && p
2a8d0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
2a8e0 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70  BMS-1 );.  if( p
2a8f0 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
2a900 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20  rBy->nExpr>=BMS 
2a910 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
2a920 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
2a930 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
2a940 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
2a950 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
2a960 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
2a970 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
2a980 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
2a990 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
2a9a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2a9b0 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
2a9c0 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
2a9d0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
2a9e0 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
2a9f0 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
2aa00 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
2aa10 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
2aa20 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
2aa30 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2aa40 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2aa50 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
2aa60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
2aa70 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
2aa80 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
2aa90 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
2aaa0 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
2aab0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
2aac0 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
2aad0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2aae0 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
2aaf0 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
2ab00 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
2ab10 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2ab20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2ab30 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
2ab40 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
2ab50 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
2ab60 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
2ab70 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
2ab80 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2ab90 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  SE flag is set, 
2aba0 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
2abb0 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
2abc0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
2abd0 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
2abe0 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
2abf0 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
2ac00 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
2ac10 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
2ac20 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
2ac30 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2ac40 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
2ac50 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2ac60 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2ac70 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
2ac80 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
2ac90 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
2aca0 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
2acb0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
2acc0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
2acd0 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
2ace0 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
2acf0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
2ad00 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
2ad10 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
2ad20 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
2ad30 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
2ad40 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
2ad50 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
2ad60 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
2ad70 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
2ad80 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
2ad90 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
2ada0 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
2adb0 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
2adc0 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
2add0 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
2ade0 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
2adf0 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
2ae00 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
2ae10 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
2ae20 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
2ae30 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
2ae40 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
2ae50 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
2ae60 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
2ae70 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2ae80 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
2ae90 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
2aea0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
2aeb0 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
2aec0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2aed0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2aee0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
2aef0 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
2af00 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2af10 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
2af20 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
2af30 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
2af40 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
2af50 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2af60 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
2af70 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rBy;.  pWInfo->p
2af80 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
2af90 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c    pWInfo->pResul
2afa0 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65  tSet = pResultSe
2afb0 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43  t;.  pWInfo->aiC
2afc0 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70  urOnePass[0] = p
2afd0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
2afe0 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  ass[1] = -1;.  p
2aff0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
2b000 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  nTabList;.  pWIn
2b010 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49  fo->iBreak = pWI
2b020 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
2b030 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2b040 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e  Label(v);.  pWIn
2b050 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  fo->wctrlFlags =
2b060 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70   wctrlFlags;.  p
2b070 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20  WInfo->iLimit = 
2b080 69 41 75 78 41 72 67 3b 0a 20 20 70 57 49 6e 66  iAuxArg;.  pWInf
2b090 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
2b0a0 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
2b0b0 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d 65 6d 73 65  eryLoop;.  memse
2b0c0 74 28 26 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  t(&pWInfo->nOBSa
2b0d0 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  t, 0, .         
2b0e0 6f 66 66 73 65 74 6f 66 28 57 68 65 72 65 49 6e  offsetof(WhereIn
2b0f0 66 6f 2c 73 57 43 29 20 2d 20 6f 66 66 73 65 74  fo,sWC) - offset
2b100 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 6e 4f 42  of(WhereInfo,nOB
2b110 53 61 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  Sat));.  memset(
2b120 26 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30  &pWInfo->a[0], 0
2b130 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
2b140 6f 70 29 2b 6e 54 61 62 4c 69 73 74 2a 73 69 7a  op)+nTabList*siz
2b150 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
2b160 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
2b170 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
2b180 45 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a  EPASS_OFF );  /*
2b190 20 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c 74   ONEPASS default
2b1a0 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d  s to OFF */.  pM
2b1b0 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f  askSet = &pWInfo
2b1c0 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57  ->sMaskSet;.  sW
2b1d0 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e  LB.pWInfo = pWIn
2b1e0 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d  fo;.  sWLB.pWC =
2b1f0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
2b200 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68   sWLB.pNew = (Wh
2b210 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72  ereLoop*)(((char
2b220 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57  *)pWInfo)+nByteW
2b230 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
2b240 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2b250 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29  NMENT(sWLB.pNew)
2b260 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49   );.  whereLoopI
2b270 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a  nit(sWLB.pNew);.
2b280 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2b290 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d  BUG.  sWLB.pNew-
2b2a0 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64  >cId = '*';.#end
2b2b0 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74  if..  /* Split t
2b2c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2b2d0 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
2b2e0 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
2b2f0 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
2b300 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
2b310 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
2b320 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
2b330 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70  .  initMaskSet(p
2b340 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69  MaskSet);.  sqli
2b350 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e  te3WhereClauseIn
2b360 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
2b370 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69   pWInfo);.  sqli
2b380 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 26 70  te3WhereSplit(&p
2b390 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65  WInfo->sWC, pWhe
2b3a0 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  re, TK_AND);.   
2b3b0 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
2b3c0 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61  ase: No FROM cla
2b3d0 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  use.  */.  if( n
2b3e0 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  TabList==0 ){.  
2b3f0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
2b400 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
2b410 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
2b420 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c  r;.    if( wctrl
2b430 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2b440 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
2b450 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
2b460 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
2b470 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
2b480 20 20 20 20 7d 0a 20 20 20 20 45 78 70 6c 61 69      }.    Explai
2b490 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
2b4a0 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 43 4f 4e  se, 0, "SCAN CON
2b4b0 53 54 41 4e 54 20 52 4f 57 22 29 29 3b 0a 20 20  STANT ROW"));.  
2b4c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 73  }else{.    /* As
2b4d0 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20  sign a bit from 
2b4e0 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65  the bitmask to e
2b4f0 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
2b500 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
2b510 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2b520 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  N-th term of the
2b530 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2b540 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61  assigned a bitma
2b550 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 20 20  sk of 1<<N..    
2b560 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
2b570 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  le of the previo
2b580 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e 73 75  us sentence ensu
2b590 72 65 73 20 74 68 74 61 20 69 66 20 58 20 69 73  res thta if X is
2b5a0 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
2b5b0 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65 20  .    ** a table 
2b5c0 54 2c 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74  T, then X-1 is t
2b5d0 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
2b5e0 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  ll other tables 
2b5f0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54  to the left of T
2b600 2e 0a 20 20 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67  ..    ** Knowing
2b610 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
2b620 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
2b630 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66  he left of a lef
2b640 74 20 6a 6f 69 6e 20 69 73 0a 20 20 20 20 2a 2a  t join is.    **
2b650 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
2b660 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 20 20 2a  ket #3015..    *
2b670 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
2b680 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20  at bitmasks are 
2b690 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
2b6a0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74  pTabList->nSrc t
2b6b0 61 62 6c 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  ables in.    ** 
2b6c0 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
2b6d0 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
2b6e0 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
2b6f0 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
2b700 6c 6c 79 0a 20 20 20 20 2a 2a 20 65 71 75 61 6c  lly.    ** equal
2b710 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
2b720 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
2b730 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
2b740 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 57 48 45  f the.    ** WHE
2b750 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
2b760 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 20  flag is set..   
2b770 20 2a 2f 0a 20 20 20 20 69 69 20 3d 20 30 3b 0a   */.    ii = 0;.
2b780 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 63 72      do{.      cr
2b790 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
2b7a0 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
2b7b0 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2b7c0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54     sqlite3WhereT
2b7d0 61 62 46 75 6e 63 41 72 67 73 28 70 50 61 72 73  abFuncArgs(pPars
2b7e0 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e, &pTabList->a[
2b7f0 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ii], &pWInfo->sW
2b800 43 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  C);.    }while( 
2b810 28 2b 2b 69 69 29 3c 70 54 61 62 4c 69 73 74 2d  (++ii)<pTabList-
2b820 3e 6e 53 72 63 20 29 3b 0a 20 20 23 69 66 64 65  >nSrc );.  #ifde
2b830 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2b840 20 20 20 7b 0a 20 20 20 20 20 20 42 69 74 6d 61     {.      Bitma
2b850 73 6b 20 6d 78 20 3d 20 30 3b 0a 20 20 20 20 20  sk mx = 0;.     
2b860 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
2b870 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
2b880 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ++){.        Bit
2b890 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33  mask m = sqlite3
2b8a0 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61  WhereGetMask(pMa
2b8b0 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
2b8c0 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
2b8d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b8e0 20 6d 3e 3d 6d 78 20 29 3b 0a 20 20 20 20 20 20   m>=mx );.      
2b8f0 20 20 6d 78 20 3d 20 6d 3b 0a 20 20 20 20 20 20    mx = m;.      
2b900 7d 0a 20 20 20 20 7d 0a 20 20 23 65 6e 64 69 66  }.    }.  #endif
2b910 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 41 6e 61  .  }.  .  /* Ana
2b920 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
2b930 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
2b940 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
2b950 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61  eExprAnalyze(pTa
2b960 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
2b970 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
2b980 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2b990 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2b9a0 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69  ror;..  /* Speci
2b9b0 61 6c 20 63 61 73 65 3a 20 57 48 45 52 45 20 74  al case: WHERE t
2b9c0 65 72 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  erms that do not
2b9d0 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 74 61   refer to any ta
2b9e0 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
2b9f0 0a 20 20 2a 2a 20 28 63 6f 6e 73 74 61 6e 74 20  .  ** (constant 
2ba00 65 78 70 72 65 73 73 69 6f 6e 73 29 2e 20 45 76  expressions). Ev
2ba10 61 6c 75 61 74 65 20 65 61 63 68 20 73 75 63 68  aluate each such
2ba20 20 74 65 72 6d 2c 20 61 6e 64 20 6a 75 6d 70 20   term, and jump 
2ba30 6f 76 65 72 20 61 6c 6c 20 74 68 65 0a 20 20 2a  over all the.  *
2ba40 2a 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65  * generated code
2ba50 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
2ba60 73 20 6e 6f 74 20 74 72 75 65 2e 20 20 0a 20 20  s not true.  .  
2ba70 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 64  **.  ** Do not d
2ba80 6f 20 74 68 69 73 20 69 66 20 74 68 65 20 65 78  o this if the ex
2ba90 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
2baa0 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  s non-determinis
2bab0 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  tic functions.  
2bac0 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2bad0 77 69 74 68 69 6e 20 61 20 73 75 62 2d 73 65 6c  within a sub-sel
2bae0 65 63 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ect. This is not
2baf0 20 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72   strictly requir
2bb00 65 64 2c 20 62 75 74 0a 20 20 2a 2a 20 70 72 65  ed, but.  ** pre
2bb10 73 65 72 76 65 73 20 53 51 4c 69 74 65 27 73 20  serves SQLite's 
2bb20 6c 65 67 61 63 79 20 62 65 68 61 76 69 6f 75 72  legacy behaviour
2bb30 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
2bb40 67 20 74 77 6f 20 63 61 73 65 73 3a 0a 20 20 2a  g two cases:.  *
2bb50 2a 0a 20 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e  *.  **   FROM ..
2bb60 2e 20 57 48 45 52 45 20 72 61 6e 64 6f 6d 28 29  . WHERE random()
2bb70 3e 30 3b 20 20 20 20 20 20 20 20 20 20 20 2d 2d  >0;           --
2bb80 20 65 76 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f   eval random() o
2bb90 6e 63 65 20 70 65 72 20 72 6f 77 0a 20 20 2a 2a  nce per row.  **
2bba0 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52     FROM ... WHER
2bbb0 45 20 28 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  E (SELECT random
2bbc0 28 29 29 3e 30 3b 20 20 2d 2d 20 65 76 61 6c 20  ())>0;  -- eval 
2bbd0 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20 6f 76  random() once ov
2bbe0 65 72 61 6c 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72  erall.  */.  for
2bbf0 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70  (ii=0; ii<sWLB.p
2bc00 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  WC->nTerm; ii++)
2bc10 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
2bc20 2a 70 54 20 3d 20 26 73 57 4c 42 2e 70 57 43 2d  *pT = &sWLB.pWC-
2bc30 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  >a[ii];.    if( 
2bc40 70 54 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  pT->wtFlags & TE
2bc50 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e  RM_VIRTUAL ) con
2bc60 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2bc70 54 2d 3e 70 72 65 72 65 71 41 6c 6c 3d 3d 30 20  T->prereqAll==0 
2bc80 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20  && (nTabList==0 
2bc90 7c 7c 20 65 78 70 72 49 73 44 65 74 65 72 6d 69  || exprIsDetermi
2bca0 6e 69 73 74 69 63 28 70 54 2d 3e 70 45 78 70 72  nistic(pT->pExpr
2bcb0 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
2bcc0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
2bcd0 50 61 72 73 65 2c 20 70 54 2d 3e 70 45 78 70 72  Parse, pT->pExpr
2bce0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
2bcf0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2bd00 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 2d 3e  ULL);.      pT->
2bd10 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
2bd20 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
2bd30 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ..  if( wctrlFla
2bd40 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
2bd50 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
2bd60 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65  if( isDistinctRe
2bd70 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20  dundant(pParse, 
2bd80 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
2bd90 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53  o->sWC, pResultS
2bda0 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  et) ){.      /* 
2bdb0 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72  The DISTINCT mar
2bdc0 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73  king is pointles
2bdd0 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a  s.  Ignore it. *
2bde0 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
2bdf0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
2be00 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
2be10 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
2be20 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
2be30 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
2be40 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73  ORDER BY the res
2be50 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20  ult set to make 
2be60 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73  distinct process
2be70 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20  ing easier */.  
2be80 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72      pWInfo->wctr
2be90 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
2bea0 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20  DISTINCTBY;.    
2beb0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
2bec0 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  By = pResultSet;
2bed0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2bee0 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57   Construct the W
2bef0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2bf00 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
2bf10 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2bf20 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ED).  if( sqlite
2bf30 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
2bf40 66 66 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  ffff ){.    sqli
2bf50 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2bf60 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
2bf70 61 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c  art *** (wctrlFl
2bf80 61 67 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c  ags: 0x%x",wctrl
2bf90 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
2bfa0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2bfb0 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a  RE_USE_LIMIT ){.
2bfc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2bfd0 75 67 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69  ugPrintf(", limi
2bfe0 74 3a 20 25 64 22 2c 20 69 41 75 78 41 72 67 29  t: %d", iAuxArg)
2bff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2c000 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2c010 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  )\n");.  }.  if(
2c020 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2c030 63 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a  ce & 0x100 ){ /*
2c040 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72   Display all ter
2c050 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
2c060 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 73 71  clause */.    sq
2c070 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
2c080 50 72 69 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b  Print(sWLB.pWC);
2c090 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
2c0a0 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
2c0b0 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
2c0c0 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
2c0d0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2c0e0 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
2c0f0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2c100 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2c110 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45  .  .#ifdef WHERE
2c120 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2c130 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2c140 72 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a  reTrace ){    /*
2c150 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20   Display all of 
2c160 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
2c170 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57  jects */.      W
2c180 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20  hereLoop *p;.   
2c190 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2c1a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2c1b0 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31  r zLabel[] = "01
2c1c0 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68  23456789abcdefgh
2c1d0 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79  ijklmnopqrstuvwy
2c1e0 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  xz".            
2c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c210 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
2c220 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
2c230 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
2c240 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20  o->pLoops, i=0; 
2c250 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
2c260 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p, i++){.       
2c270 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
2c280 5b 69 25 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65  [i%(sizeof(zLabe
2c290 6c 29 2d 31 29 5d 3b 0a 20 20 20 20 20 20 20 20  l)-1)];.        
2c2a0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
2c2b0 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
2c2c0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
2c2d0 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61  f.  .    wherePa
2c2e0 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
2c2f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
2c300 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2c310 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2c320 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57  rror;.    if( pW
2c330 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
2c340 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61  {.       wherePa
2c350 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
2c360 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2c370 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  +1);.       if( 
2c380 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c390 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2c3a0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  inError;.    }. 
2c3b0 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
2c3c0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
2c3d0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
2c3e0 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
2c3f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49  )!=0 ){.     pWI
2c400 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41  nfo->revMask = A
2c410 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66  LLBITS;.  }.  if
2c420 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2c430 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
2c440 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
2c450 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2c460 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
2c470 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2c480 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
2c490 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
2c4a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c4b0 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
2c4c0 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
2c4d0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
2c4e0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2c4f0 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
2c500 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c510 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
2c520 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49  =%d,0x%llx", pWI
2c530 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49  nfo->nOBSat, pWI
2c540 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
2c550 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
2c560 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2c570 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
2c580 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2c590 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
2c5a0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2c5b0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
2c5c0 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
2c5d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c5e0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
2c5f0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
2c600 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
2c610 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2c620 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
2c630 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
2c640 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2c650 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
2c660 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
2c670 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
2c680 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2c690 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
2c6a0 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
2c6b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c6c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
2c6d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2c6e0 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
2c6f0 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
2c700 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
2c710 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
2c720 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
2c730 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57  .pWLoop, sWLB.pW
2c740 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
2c750 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 74 65 6d  ndif..  /* Attem
2c760 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65  pt to omit table
2c770 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20  s from the join 
2c780 74 68 61 74 20 64 6f 20 6e 6f 74 20 61 66 66 65  that do not affe
2c790 63 74 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  ct the result.. 
2c7a0 20 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20   ** For a table 
2c7b0 74 6f 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68  to not affect th
2c7c0 65 20 72 65 73 75 6c 74 2c 20 74 68 65 20 66 6f  e result, the fo
2c7d0 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62 65 20  llowing must be 
2c7e0 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
2c7f0 20 20 31 29 20 54 68 65 20 71 75 65 72 79 20 6d    1) The query m
2c800 75 73 74 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  ust not be an ag
2c810 67 72 65 67 61 74 65 2e 0a 20 20 2a 2a 20 20 20  gregate..  **   
2c820 32 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73  2) The table mus
2c830 74 20 62 65 20 74 68 65 20 52 48 53 20 6f 66 20  t be the RHS of 
2c840 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 2a  a LEFT JOIN..  *
2c850 2a 20 20 20 33 29 20 45 69 74 68 65 72 20 74 68  *   3) Either th
2c860 65 20 71 75 65 72 79 20 6d 75 73 74 20 62 65 20  e query must be 
2c870 44 49 53 54 49 4e 43 54 2c 20 6f 72 20 65 6c 73  DISTINCT, or els
2c880 65 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  e the ON or USIN
2c890 47 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 20 20  G clause.  **   
2c8a0 20 20 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20     must contain 
2c8b0 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 61  a constraint tha
2c8c0 74 20 6c 69 6d 69 74 73 20 74 68 65 20 73 63 61  t limits the sca
2c8d0 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  n of the table t
2c8e0 6f 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 74 20  o .  **      at 
2c8f0 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65 20 72 6f  most a single ro
2c900 77 2e 0a 20 20 2a 2a 20 20 20 34 29 20 54 68 65  w..  **   4) The
2c910 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20   table must not 
2c920 62 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  be referenced by
2c930 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
2c940 20 71 75 65 72 79 20 61 70 61 72 74 0a 20 20 2a   query apart.  *
2c950 2a 20 20 20 20 20 20 66 72 6f 6d 20 69 74 73 20  *      from its 
2c960 6f 77 6e 20 55 53 49 4e 47 20 6f 72 20 4f 4e 20  own USING or ON 
2c970 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
2c980 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67  * For example, g
2c990 69 76 65 6e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  iven:.  **.  ** 
2c9a0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2c9b0 20 74 31 28 69 70 6b 20 49 4e 54 45 47 45 52 20   t1(ipk INTEGER 
2c9c0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 31 29  PRIMARY KEY, v1)
2c9d0 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
2c9e0 45 20 54 41 42 4c 45 20 74 32 28 69 70 6b 20 49  E TABLE t2(ipk I
2c9f0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2ca00 45 59 2c 20 76 32 29 3b 0a 20 20 2a 2a 20 20 20  EY, v2);.  **   
2ca10 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2ca20 33 28 69 70 6b 20 49 4e 54 45 47 45 52 20 50 52  3(ipk INTEGER PR
2ca30 49 4d 41 52 59 20 4b 45 59 2c 20 76 33 29 3b 0a  IMARY KEY, v3);.
2ca40 20 20 2a 2a 0a 20 20 2a 2a 20 74 68 65 6e 20 74    **.  ** then t
2ca50 61 62 6c 65 20 74 32 20 63 61 6e 20 62 65 20 6f  able t2 can be o
2ca60 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
2ca70 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
2ca80 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2ca90 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31 20 0a  v1, v3 FROM t1 .
2caa0 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20    **       LEFT 
2cab0 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 20 28 74  JOIN t2 USING (t
2cac0 31 2e 69 70 6b 3d 74 32 2e 69 70 6b 29 0a 20 20  1.ipk=t2.ipk).  
2cad0 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f  **       LEFT JO
2cae0 49 4e 20 74 33 20 55 53 49 4e 47 20 28 74 31 2e  IN t3 USING (t1.
2caf0 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20 20 2a 2a  ipk=t3.ipk).  **
2cb00 0a 20 20 2a 2a 20 6f 72 20 66 72 6f 6d 3a 0a 20  .  ** or from:. 
2cb10 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
2cb20 45 43 54 20 44 49 53 54 49 4e 43 54 20 76 31 2c  ECT DISTINCT v1,
2cb30 20 76 33 20 46 52 4f 4d 20 74 31 20 0a 20 20 2a   v3 FROM t1 .  *
2cb40 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49  *       LEFT JOI
2cb50 4e 20 74 32 0a 20 20 2a 2a 20 20 20 20 20 20 20  N t2.  **       
2cb60 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20 55 53 49  LEFT JOIN t3 USI
2cb70 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33 2e 69 70  NG (t1.ipk=t3.ip
2cb80 6b 29 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  k).  */.  notRea
2cb90 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
2cba0 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
2cbb0 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20  nLevel>=2.   && 
2cbc0 70 52 65 73 75 6c 74 53 65 74 21 3d 30 20 20 20  pResultSet!=0   
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
2cbe0 75 61 72 61 6e 74 65 65 73 20 63 6f 6e 64 69 74  uarantees condit
2cbf0 69 6f 6e 20 28 31 29 20 61 62 6f 76 65 20 2a 2f  ion (1) above */
2cc00 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
2cc10 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
2cc20 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
2cc30 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  in).  ){.    int
2cc40 20 69 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   i;.    Bitmask 
2cc50 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65  tabUsed = sqlite
2cc60 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
2cc70 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
2cc80 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
2cc90 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
2cca0 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65   ){.      tabUse
2ccb0 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  d |= sqlite3Wher
2ccc0 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
2ccd0 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
2cce0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20  rderBy);.    }. 
2ccf0 20 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d     for(i=pWInfo-
2cd00 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 31 3b  >nLevel-1; i>=1;
2cd10 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 57 68 65   i--){.      Whe
2cd20 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
2cd30 70 45 6e 64 3b 0a 20 20 20 20 20 20 73 74 72 75  pEnd;.      stru
2cd40 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2cd50 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 70 4c  *pItem;.      pL
2cd60 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  oop = pWInfo->a[
2cd70 69 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  i].pWLoop;.     
2cd80 20 70 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f   pItem = &pWInfo
2cd90 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2cda0 6f 6f 70 2d 3e 69 54 61 62 5d 3b 0a 20 20 20 20  oop->iTab];.    
2cdb0 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67    if( (pItem->fg
2cdc0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
2cdd0 45 46 54 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  EFT)==0 ) contin
2cde0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ue;.      if( (w
2cdf0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2ce00 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
2ce10 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
2ce20 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2ce30 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
2ce40 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2ce50 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2ce60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74    }.      if( (t
2ce70 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e  abUsed & pLoop->
2ce80 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 63  maskSelf)!=0 ) c
2ce90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2cea0 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e  End = sWLB.pWC->
2ceb0 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54  a + sWLB.pWC->nT
2cec0 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  erm;.      for(p
2ced0 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61  Term=sWLB.pWC->a
2cee0 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54  ; pTerm<pEnd; pT
2cef0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
2cf00 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
2cf10 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
2cf20 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 7b 0a 20  askSelf)!=0 ){. 
2cf30 20 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78           if( !Ex
2cf40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
2cf50 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
2cf60 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
2cf70 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 45      || pTerm->pE
2cf80 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
2cf90 61 62 6c 65 21 3d 70 49 74 65 6d 2d 3e 69 43 75  able!=pItem->iCu
2cfa0 72 73 6f 72 0a 20 20 20 20 20 20 20 20 20 20 29  rsor.          )
2cfb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
2cfc0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2cfd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2cfe0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 65   }.      if( pTe
2cff0 72 6d 3c 70 45 6e 64 20 29 20 63 6f 6e 74 69 6e  rm<pEnd ) contin
2d000 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ue;.      WHERET
2d010 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
2d020 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
2d030 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
2d040 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
2d050 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 70 4c 6f  notReady &= ~pLo
2d060 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2d070 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57      for(pTerm=sW
2d080 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  LB.pWC->a; pTerm
2d090 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  <pEnd; pTerm++){
2d0a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
2d0b0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
2d0c0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2d0d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2d0e0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
2d0f0 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
2d100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d110 7d 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 70  }.      if( i!=p
2d120 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20  WInfo->nLevel-1 
2d130 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2d140 42 79 74 65 20 3d 20 28 70 57 49 6e 66 6f 2d 3e  Byte = (pWInfo->
2d150 6e 4c 65 76 65 6c 2d 31 2d 69 29 20 2a 20 73 69  nLevel-1-i) * si
2d160 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
2d170 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76  ;.        memmov
2d180 65 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2c  e(&pWInfo->a[i],
2d190 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 2b 31 5d   &pWInfo->a[i+1]
2d1a0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2d1b0 7d 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  }.      pWInfo->
2d1c0 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20  nLevel--;.      
2d1d0 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20  nTabList--;.    
2d1e0 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
2d1f0 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
2d200 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
2d210 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70  ed ***\n"));.  p
2d220 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e  WInfo->pParse->n
2d230 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49  QueryLoop += pWI
2d240 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20  nfo->nRowOut;.. 
2d250 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
2d260 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
2d270 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
2d280 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
2d290 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
2d2a0 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
2d2b0 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
2d2c0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
2d2d0 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 0a 20  ropriate..  **. 
2d2e0 20 2a 2a 20 41 20 6f 6e 65 2d 70 61 73 73 20 61   ** A one-pass a
2d2f0 70 70 72 6f 61 63 68 20 63 61 6e 20 62 65 20 75  pproach can be u
2d300 73 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 65  sed if the calle
2d310 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20  r has requested 
2d320 6f 6e 65 0a 20 20 2a 2a 20 61 6e 64 20 65 69 74  one.  ** and eit
2d330 68 65 72 20 28 61 29 20 74 68 65 20 73 63 61 6e  her (a) the scan
2d340 20 76 69 73 69 74 73 20 61 74 20 6d 6f 73 74 20   visits at most 
2d350 6f 6e 65 20 72 6f 77 20 6f 72 20 28 62 29 20 65  one row or (b) e
2d360 61 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ach.  ** of the 
2d370 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
2d380 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
2d390 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  * the caller has
2d3a0 20 69 6e 64 69 63 61 74 65 64 20 74 68 61 74 20   indicated that 
2d3b0 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f  a one-pass appro
2d3c0 61 63 68 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ach can be used.
2d3d0 20 20 2a 2a 20 20 20 20 20 77 69 74 68 20 6d 75    **     with mu
2d3e0 6c 74 69 70 6c 65 20 72 6f 77 73 20 28 62 79 20  ltiple rows (by 
2d3f0 73 65 74 74 69 6e 67 20 57 48 45 52 45 5f 4f 4e  setting WHERE_ON
2d400 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 2c  EPASS_MULTIROW),
2d410 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 74 68   and.  **   * th
2d420 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
2d430 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
2d440 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 65 69 74  and.  **   * eit
2d450 68 65 72 20 74 68 65 20 73 63 61 6e 20 64 6f 65  her the scan doe
2d460 73 20 6e 6f 74 20 75 73 65 20 74 68 65 20 4f 52  s not use the OR
2d470 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 72   optimization or
2d480 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   the caller.  **
2d490 20 20 20 20 20 69 73 20 61 20 44 45 4c 45 54 45       is a DELETE
2d4a0 20 6f 70 65 72 61 74 69 6f 6e 20 28 57 48 45 52   operation (WHER
2d4b0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 20  E_DUPLICATES_OK 
2d4c0 69 73 20 6f 6e 6c 79 20 73 70 65 63 69 66 69 65  is only specifie
2d4d0 64 0a 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 44  d.  **     for D
2d4e0 45 4c 45 54 45 29 2e 0a 20 20 2a 2a 0a 20 20 2a  ELETE)..  **.  *
2d4f0 2a 20 54 68 65 20 6c 61 73 74 20 71 75 61 6c 69  * The last quali
2d500 66 69 63 61 74 69 6f 6e 20 69 73 20 62 65 63 61  fication is beca
2d510 75 73 65 20 61 6e 20 55 50 44 41 54 45 20 73 74  use an UPDATE st
2d520 61 74 65 6d 65 6e 74 20 75 73 65 73 0a 20 20 2a  atement uses.  *
2d530 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61 69 43 75  * WhereInfo.aiCu
2d540 72 4f 6e 65 50 61 73 73 5b 31 5d 20 74 6f 20 64  rOnePass[1] to d
2d550 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2d560 20 6f 72 20 6e 6f 74 20 69 74 20 72 65 61 6c 6c   or not it reall
2d570 79 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61  y can.  ** use a
2d580 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f 61   one-pass approa
2d590 63 68 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ch, and this is 
2d5a0 6e 6f 74 20 73 65 74 20 61 63 63 75 72 61 74 65  not set accurate
2d5b0 6c 79 20 66 6f 72 20 73 63 61 6e 73 0a 20 20 2a  ly for scans.  *
2d5c0 2a 20 74 68 61 74 20 75 73 65 20 74 68 65 20 4f  * that use the O
2d5d0 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  R optimization..
2d5e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
2d5f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d600 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2d610 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f  ED)==0 || pWInfo
2d620 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20  ->nLevel==1 );. 
2d630 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
2d640 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2d650 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b 0a  _DESIRED)!=0 ){.
2d660 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20      int wsFlags 
2d670 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  = pWInfo->a[0].p
2d680 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  WLoop->wsFlags;.
2d690 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20      int bOnerow 
2d6a0 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  = (wsFlags & WHE
2d6b0 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20  RE_ONEROW)!=0;. 
2d6c0 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 20 7c     if( bOnerow |
2d6d0 7c 20 28 0a 20 20 20 20 20 20 20 20 30 21 3d 28  | (.        0!=(
2d6e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d6f0 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
2d700 52 4f 57 29 0a 20 20 20 20 20 26 26 20 30 3d 3d  ROW).     && 0==
2d710 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
2d720 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
2d730 20 20 20 20 26 26 20 28 30 3d 3d 28 77 73 46 6c      && (0==(wsFl
2d740 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
2d750 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46  I_OR) || (wctrlF
2d760 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
2d770 4c 49 43 41 54 45 53 5f 4f 4b 29 29 0a 20 20 20  LICATES_OK)).   
2d780 20 29 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66   )){.      pWInf
2d790 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62 4f  o->eOnePass = bO
2d7a0 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53 5f  nerow ? ONEPASS_
2d7b0 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53  SINGLE : ONEPASS
2d7c0 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20 69 66  _MULTI;.      if
2d7d0 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c  ( HasRowid(pTabL
2d7e0 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20  ist->a[0].pTab) 
2d7f0 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57 48  && (wsFlags & WH
2d800 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b  ERE_IDX_ONLY) ){
2d810 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 63 74  .        if( wct
2d820 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d830 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
2d840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
2d850 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c 41  ordelete = OPFLA
2d860 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20 20  G_FORDELETE;.   
2d870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2d880 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
2d890 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 77  op->wsFlags = (w
2d8a0 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52 45 5f  sFlags & ~WHERE_
2d8b0 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  IDX_ONLY);.     
2d8c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2d8d0 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
2d8e0 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
2d8f0 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
2d900 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
2d910 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
2d920 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
2d930 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c  /.  for(ii=0, pL
2d940 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
2d950 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
2d960 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
2d970 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
2d980 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
2d990 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
2d9a0 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
2d9b0 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
2d9c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
2d9d0 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  e/index */.    s
2d9e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2d9f0 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20  em *pTabItem;.. 
2da00 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
2da10 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2da20 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
2da30 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
2da40 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20  pTab;.    iDb = 
2da50 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2da60 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
2da70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f  Schema);.    pLo
2da80 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
2da90 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54  oop;.    if( (pT
2daa0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
2dab0 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
2dac0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
2dad0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
2dae0 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
2daf0 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
2db00 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2db10 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
2db20 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2db30 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2db40 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
2db50 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
2db60 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
2db70 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
2db80 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
2db90 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
2dba0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2dbb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2dbc0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2dbd0 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
2dbe0 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41  0, pVTab, P4_VTA
2dbf0 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  B);.    }else if
2dc00 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
2dc10 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  ) ){.      /* no
2dc20 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  op */.    }else.
2dc30 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
2dc40 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2dc50 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2dc60 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2dc70 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2dc80 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2dc90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
2dca0 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65  t op = OP_OpenRe
2dcb0 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  ad;.      if( pW
2dcc0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
2dcd0 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
2dce0 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
2dcf0 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
2dd00 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
2dd10 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62  nePass[0] = pTab
2dd20 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
2dd30 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71       };.      sq
2dd40 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
2dd50 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
2dd60 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70  >iCursor, iDb, p
2dd70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20  Tab, op);.      
2dd80 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d  assert( pTabItem
2dd90 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65  ->iCursor==pLeve
2dda0 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20  l->iTabCur );.  
2ddb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
2ddc0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
2ddd0 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
2dde0 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  Tab->nCol==BMS-1
2ddf0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2de00 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  se( pWInfo->eOne
2de10 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2de20 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  F && pTab->nCol=
2de30 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66  =BMS );.      if
2de40 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
2de50 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
2de60 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d  && pTab->nCol<BM
2de70 53 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54  S && HasRowid(pT
2de80 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42  ab) ){.        B
2de90 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49  itmask b = pTabI
2dea0 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
2deb0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
2dec0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62  .        for(; b
2ded0 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d  ; b=b>>1, n++){}
2dee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2def0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
2df00 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  -1, SQLITE_INT_T
2df10 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54  O_PTR(n), P4_INT
2df20 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  32);.        ass
2df30 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
2df40 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  ol );.      }.#i
2df50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2df60 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
2df70 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
2df80 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
2df90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2dfa0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2dfb0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
2dfc0 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a  EQ|bFordelete);.
2dfd0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
2dfe0 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
2dff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2e000 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72 64 65  angeP5(v, bForde
2e010 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23  lete);.      }.#
2e020 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2e030 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
2e040 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c 69 74  MASK.      sqlit
2e050 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2e060 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
2e070 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  ed, pTabItem->iC
2e080 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20  ursor, 0, 0,.   
2e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0a0 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20           (const 
2e0b0 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e 63  u8*)&pTabItem->c
2e0c0 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34  olUsed, P4_INT64
2e0d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
2e0e0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2e0f0 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
2e100 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
2e110 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
2e120 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2e130 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2e140 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2e150 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  ED ){.      Inde
2e160 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e  x *pIx = pLoop->
2e170 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
2e180 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
2e190 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  Cur;.      int o
2e1a0 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
2e1b0 0a 20 20 20 20 20 20 2f 2a 20 69 41 75 78 41 72  .      /* iAuxAr
2e1c0 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  g is always set 
2e1d0 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  to a positive va
2e1e0 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69  lue if ONEPASS i
2e1f0 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  s possible */.  
2e200 20 20 20 20 61 73 73 65 72 74 28 20 69 41 75 78      assert( iAux
2e210 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66  Arg!=0 || (pWInf
2e220 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2e230 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2e240 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20  SIRED)==0 );.   
2e250 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
2e260 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d  (pTab) && IsPrim
2e270 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29  aryKeyIndex(pIx)
2e280 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72  .       && (wctr
2e290 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2e2a0 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 0a  R_SUBCLAUSE)!=0.
2e2b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2e2c0 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65 20   /* This is one 
2e2d0 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70  term of an OR-op
2e2e0 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67  timization using
2e2f0 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2e300 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a   of a.        **
2e310 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
2e320 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66  able.  No need f
2e330 6f 72 20 61 20 73 65 70 61 72 61 74 65 20 69 6e  or a separate in
2e340 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  dex */.        i
2e350 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65  IndexCur = pLeve
2e360 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20 20  l->iTabCur;.    
2e370 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20      op = 0;.    
2e380 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49 6e    }else if( pWIn
2e390 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
2e3a0 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
2e3b0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d       Index *pJ =
2e3c0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
2e3d0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  >pIndex;.       
2e3e0 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75   iIndexCur = iAu
2e3f0 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 61 73  xArg;.        as
2e400 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73  sert( wctrlFlags
2e410 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2e420 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20  _DESIRED );.    
2e430 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
2e440 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78  S(pJ) && pJ!=pIx
2e450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49   ){.          iI
2e460 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20  ndexCur++;.     
2e470 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e       pJ = pJ->pN
2e480 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
2e490 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
2e4a0 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
2e4b0 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
2e4c0 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64  nePass[1] = iInd
2e4d0 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c  exCur;.      }el
2e4e0 73 65 20 69 66 28 20 69 41 75 78 41 72 67 20 26  se if( iAuxArg &
2e4f0 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
2e500 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2e510 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)!=0 ){.      
2e520 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41    iIndexCur = iA
2e530 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 6f  uxArg;.        o
2e540 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78  p = OP_ReopenIdx
2e550 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e560 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2e570 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2e580 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
2e590 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2e5a0 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20   = iIndexCur;.  
2e5b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
2e5c0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
2e5d0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
2e5e0 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43   assert( iIndexC
2e5f0 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ur>=0 );.      i
2e600 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  f( op ){.       
2e610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e620 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78  p3(v, op, iIndex
2e630 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
2e640 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
2e650 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
2e660 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
2e670 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2e680 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2e690 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
2e6a0 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  NT)!=0.         
2e6b0 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
2e6c0 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
2e6d0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53  MN_RANGE|WHERE_S
2e6e0 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20  KIPSCAN))==0.   
2e6f0 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
2e700 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
2e710 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d  RE_ORDERBY_MIN)=
2e720 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =0.         && p
2e730 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2e740 21 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  !=WHERE_DISTINCT
2e750 5f 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20 20  _ORDERED.       
2e760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2e770 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2e780 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
2e790 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20  EQ); /* Hint to 
2e7a0 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20  COMDB2 */.      
2e7b0 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65    }.        Vdbe
2e7c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
2e7d0 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
2e7e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2e7f0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
2e800 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a  _MASK.        {.
2e810 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f            u64 co
2e820 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  lUsed = 0;.     
2e830 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b       int ii, jj;
2e840 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2e850 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f  i=0; ii<pIx->nCo
2e860 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  lumn; ii++){.   
2e870 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49           jj = pI
2e880 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b  x->aiColumn[ii];
2e890 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e8a0 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65   jj<0 ) continue
2e8b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2e8c0 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36  ( jj>63 ) jj = 6
2e8d0 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  3;.            i
2e8e0 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f  f( (pTabItem->co
2e8f0 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
2e900 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  jj))==0 ) contin
2e910 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2e920 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34  colUsed |= ((u64
2e930 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69  )1)<<(ii<63 ? ii
2e940 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20   : 63);.        
2e950 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2e960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
2e970 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
2e980 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72  sUsed, iIndexCur
2e990 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9b0 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f          (u8*)&co
2e9c0 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29  lUsed, P4_INT64)
2e9d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
2e9e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
2e9f0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
2ea00 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  MASK */.      }.
2ea10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
2ea20 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f  b>=0 ) sqlite3Co
2ea30 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
2ea40 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
2ea50 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
2ea60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2ea70 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
2ea80 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2ea90 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
2eaa0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
2eab0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
2eac0 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
2ead0 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
2eae0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
2eaf0 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
2eb00 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
2eb10 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
2eb20 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
2eb30 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
2eb40 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
2eb50 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
2eb60 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  i++){.    int ad
2eb70 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69  drExplain;.    i
2eb80 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  nt wsFlags;.    
2eb90 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
2eba0 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46  ->a[ii];.    wsF
2ebb0 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  lags = pLevel->p
2ebc0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  WLoop->wsFlags;.
2ebd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ebe0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
2ebf0 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65  DEX.    if( (pLe
2ec00 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
2ec10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
2ec20 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
2ec30 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75       constructAu
2ec40 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61  tomaticIndex(pPa
2ec50 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  rse, &pWInfo->sW
2ec60 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
2ec70 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b     &pTabList->a[
2ec80 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20  pLevel->iFrom], 
2ec90 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
2eca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
2ecb0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2ecc0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2ecd0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rror;.    }.#end
2ece0 69 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61  if.    addrExpla
2ecf0 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  in = sqlite3Wher
2ed00 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28  eExplainOneScan(
2ed10 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
2ed20 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
2ed30 6c 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20 20  l, wctrlFlags.  
2ed40 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d    );.    pLevel-
2ed50 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69  >addrBody = sqli
2ed60 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2ed70 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65  dr(v);.    notRe
2ed80 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ady = sqlite3Whe
2ed90 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  reCodeOneLoopSta
2eda0 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e  rt(pWInfo, ii, n
2edb0 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
2edc0 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
2edd0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
2ede0 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46  nt;.    if( (wsF
2edf0 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
2ee00 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72  _OR)==0 && (wctr
2ee10 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 5f  lFlags&WHERE_OR_
2ee20 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b  SUBCLAUSE)==0 ){
2ee30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
2ee40 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73  ereAddScanStatus
2ee50 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  (v, pTabList, pL
2ee60 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69  evel, addrExplai
2ee70 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
2ee80 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56   /* Done. */.  V
2ee90 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
2eea0 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
2eeb0 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74  E-core"));.  ret
2eec0 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
2eed0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
2eee0 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
2eef0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a  hereBeginError:.
2ef00 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a    if( pWInfo ){.
2ef10 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
2ef20 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
2ef30 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2ef40 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46  ;.    whereInfoF
2ef50 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2ef60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2ef70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 74 20 6f  .}../*.** Part o
2ef80 66 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  f sqlite3WhereEn
2ef90 64 28 29 20 77 69 6c 6c 20 72 65 77 72 69 74 65  d() will rewrite
2efa0 20 6f 70 63 6f 64 65 73 20 74 6f 20 72 65 66 65   opcodes to refe
2efb0 72 65 6e 63 65 20 74 68 65 0a 2a 2a 20 69 6e 64  rence the.** ind
2efc0 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 20 74  ex rather than t
2efd0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
2efe0 49 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  In SQLITE_DEBUG 
2eff0 6d 6f 64 65 2c 20 77 65 20 77 61 6e 74 0a 2a 2a  mode, we want.**
2f000 20 74 6f 20 74 72 61 63 65 20 74 68 6f 73 65 20   to trace those 
2f010 63 68 61 6e 67 65 73 20 69 66 20 50 52 41 47 4d  changes if PRAGM
2f020 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61 63  A vdbe_addoptrac
2f030 65 3d 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  e=on.  This rout
2f040 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 74 68 61 74  ine.** does that
2f050 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
2f060 49 54 45 5f 44 45 42 55 47 0a 23 20 64 65 66 69  ITE_DEBUG.# defi
2f070 6e 65 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65  ne OpcodeRewrite
2f080 54 72 61 63 65 28 44 2c 4b 2c 50 29 20 2f 2a 20  Trace(D,K,P) /* 
2f090 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6c 73 65 0a 23  no-op */.#else.#
2f0a0 20 64 65 66 69 6e 65 20 4f 70 63 6f 64 65 52 65   define OpcodeRe
2f0b0 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b 2c 50  writeTrace(D,K,P
2f0c0 29 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 70  ) sqlite3WhereOp
2f0d0 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65  codeRewriteTrace
2f0e0 28 44 2c 4b 2c 50 29 0a 20 20 73 74 61 74 69 63  (D,K,P).  static
2f0f0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65   void sqlite3Whe
2f100 72 65 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54  reOpcodeRewriteT
2f110 72 61 63 65 28 0a 20 20 20 20 73 71 6c 69 74 65  race(.    sqlite
2f120 33 20 2a 64 62 2c 0a 20 20 20 20 69 6e 74 20 70  3 *db,.    int p
2f130 63 2c 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  c,.    VdbeOp *p
2f140 4f 70 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  Op.  ){.    if( 
2f150 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
2f160 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
2f170 63 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ce)==0 ) return;
2f180 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f190 50 72 69 6e 74 4f 70 28 30 2c 20 70 63 2c 20 70  PrintOp(0, pc, p
2f1a0 4f 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Op);.  }.#endif.
2f1b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2f1c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
2f1d0 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
2f1e0 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
2f1f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2f200 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
2f210 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
2f220 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
2f230 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
2f240 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61  o *pWInfo){.  Pa
2f250 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
2f260 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
2f270 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2f280 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2f290 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
2f2a0 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c  pLevel;.  WhereL
2f2b0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72  oop *pLoop;.  Sr
2f2c0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
2f2d0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2f2e0 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
2f2f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2f300 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
2f310 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
2f320 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  code..  */.  Vdb
2f330 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
2f340 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f  v, "End WHERE-co
2f350 72 65 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 70  re"));.  for(i=p
2f360 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
2f370 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
2f380 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70   int addr;.    p
2f390 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
2f3a0 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70  >a[i];.    pLoop
2f3b0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2f3c0 70 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  p;.    if( pLeve
2f3d0 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
2f3e0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2f3f0 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45  _DISABLE_SKIPAHE
2f400 41 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20  AD_DISTINCT.    
2f410 20 20 69 6e 74 20 61 64 64 72 53 65 65 6b 20 3d    int addrSeek =
2f420 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   0;.      Index 
2f430 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74  *pIdx;.      int
2f440 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   n;.      if( pW
2f450 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
2f460 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
2f470 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20 20 26  ORDERED.       &
2f480 26 20 69 3d 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65  & i==pWInfo->nLe
2f490 76 65 6c 2d 31 20 20 2f 2a 20 54 69 63 6b 65 74  vel-1  /* Ticket
2f4a0 20 5b 65 66 39 33 31 38 37 35 37 62 31 35 32 65   [ef9318757b152e
2f4b0 33 5d 20 32 30 31 37 2d 31 30 2d 32 31 20 2a 2f  3] 2017-10-21 */
2f4c0 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f  .       && (pLoo
2f4d0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2f4e0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
2f4f0 20 20 20 20 20 20 26 26 20 28 70 49 64 78 20 3d        && (pIdx =
2f500 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2f510 70 49 6e 64 65 78 29 2d 3e 68 61 73 53 74 61 74  pIndex)->hasStat
2f520 31 0a 20 20 20 20 20 20 20 26 26 20 28 6e 20 3d  1.       && (n =
2f530 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2f540 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20 20 20 20  nIdxCol)>0.     
2f550 20 20 26 26 20 70 49 64 78 2d 3e 61 69 52 6f 77    && pIdx->aiRow
2f560 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a 20 20  LogEst[n]>=36.  
2f570 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
2f580 6e 74 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e  nt r1 = pParse->
2f590 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
2f5a0 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20 20 20  int j, op;.     
2f5b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
2f5c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2f5d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f5e0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2f5f0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2f600 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20 20 20  , j, r1+j);.    
2f610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
2f620 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b  arse->nMem += n+
2f630 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  1;.        op = 
2f640 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50  pLevel->op==OP_P
2f650 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c 54 20  rev ? OP_SeekLT 
2f660 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20 20 20  : OP_SeekGT;.   
2f670 20 20 20 20 20 61 64 64 72 53 65 65 6b 20 3d 20       addrSeek = 
2f680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f690 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c 65 76  4Int(v, op, pLev
2f6a0 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 2c 20  el->iIdxCur, 0, 
2f6b0 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  r1, n);.        
2f6c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2f6d0 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29  , op==OP_SeekLT)
2f6e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2f6f0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
2f700 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20 20 20  OP_SeekGT);.    
2f710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f720 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
2f730 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  , 1, pLevel->p2)
2f740 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2f750 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41 42   /* SQLITE_DISAB
2f760 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53  LE_SKIPAHEAD_DIS
2f770 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20 20 2f  TINCT */.      /
2f780 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
2f790 65 3a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  e: Advance to th
2f7a0 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  e next row */.  
2f7b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2f7c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2f7d0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
2f7e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f7f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65  dbeAddOp3(v, pLe
2f800 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
2f810 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c  >p1, pLevel->p2,
2f820 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20   pLevel->p3);.  
2f830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2f840 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
2f850 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64  l->p5);.      Vd
2f860 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2f870 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2f880 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2f890 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20  p==OP_Next);.   
2f8a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2f8b0 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
2f8c0 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20  =OP_Prev);.     
2f8d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2f8e0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2f8f0 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66 6e 64 65  P_VNext);.#ifnde
2f900 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2f910 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49  _SKIPAHEAD_DISTI
2f920 4e 43 54 0a 20 20 20 20 20 20 69 66 28 20 61 64  NCT.      if( ad
2f930 64 72 53 65 65 6b 20 29 20 73 71 6c 69 74 65 33  drSeek ) sqlite3
2f940 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2f950 61 64 64 72 53 65 65 6b 29 3b 0a 23 65 6e 64 69  addrSeek);.#endi
2f960 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2f970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2f980 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
2f990 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
2f9a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2f9b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2f9c0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
2f9d0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
2f9e0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
2f9f0 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
2fa00 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2fa10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2fa20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2fa30 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
2fa40 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
2fa50 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
2fa60 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
2fa70 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
2fa80 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
2fa90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2faa0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2fab0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
2fac0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2fad0 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d  In->eEndLoopOp!=
2fae0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
2faf0 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e 6e 50       if( pIn->nP
2fb00 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 20  refix ){.       
2fb10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
2fb20 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2fb30 45 52 45 5f 49 4e 5f 45 41 52 4c 59 4f 55 54 20  ERE_IN_EARLYOUT 
2fb40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2fb50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2fb60 49 6e 74 28 76 2c 20 4f 50 5f 49 66 4e 6f 48 6f  Int(v, OP_IfNoHo
2fb70 70 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  pe, pLevel->iIdx
2fb80 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
2fbb0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 0a  rrentAddr(v)+2,.
2fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2fbe0 6e 2d 3e 69 42 61 73 65 2c 20 70 49 6e 2d 3e 6e  n->iBase, pIn->n
2fbf0 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 20  Prefix);.       
2fc00 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2fc10 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
2fc20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
2fc30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fc40 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2fc50 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
2fc60 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
2fc70 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2fc80 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
2fc90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2fca0 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
2fcb0 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a  opOp==OP_Prev);.
2fcc0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2fcd0 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d  verageIf(v, pIn-
2fce0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f  >eEndLoopOp==OP_
2fcf0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Next);.        }
2fd00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fd10 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2fd20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
2fd30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2fd40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2fd50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2fd60 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
2fd70 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
2fd80 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20  ->addrSkip ){.  
2fd90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
2fda0 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  oto(v, pLevel->a
2fdb0 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  ddrSkip);.      
2fdc0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2fdd0 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20  "next skip-scan 
2fde0 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75  on %s", pLoop->u
2fdf0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
2fe00 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
2fe10 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2fe20 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e(v, pLevel->add
2fe30 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71  rSkip);.      sq
2fe40 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2fe50 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e(v, pLevel->add
2fe60 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a  rSkip-2);.    }.
2fe70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
2fe80 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48  IKE_DOESNT_MATCH
2fe90 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66 28 20 70  _BLOBS.    if( p
2fea0 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
2feb0 65 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ep ){.      sqli
2fec0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fed0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
2fee0 2c 20 28 69 6e 74 29 28 70 4c 65 76 65 6c 2d 3e  , (int)(pLevel->
2fef0 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e 31 29  iLikeRepCntr>>1)
2ff00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ff10 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
2ff20 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a  ->addrLikeRep);.
2ff30 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2ff40 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ge(v);.    }.#en
2ff50 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76  dif.    if( pLev
2ff60 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
2ff70 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
2ff80 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
2ff90 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
2ffa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2ffb0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
2ffc0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20  el->iLeftJoin); 
2ffd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2ffe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2fff0 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
30000 4e 4c 59 29 3d 3d 30 20 7c 7c 20 28 77 73 20 26  NLY)==0 || (ws &
30010 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
30020 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
30030 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
30040 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
30050 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
30060 65 6c 2d 3e 69 54 61 62 43 75 72 3d 3d 70 54 61  el->iTabCur==pTa
30070 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
30080 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 20  >iFrom].iCursor 
30090 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
300a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
300b0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
300c0 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20  el->iTabCur);.  
300d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
300e0 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
300f0 58 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  XED) .       || 
30100 28 28 77 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  ((ws & WHERE_MUL
30110 54 49 5f 4f 52 29 20 26 26 20 70 4c 65 76 65 6c  TI_OR) && pLevel
30120 2d 3e 75 2e 70 43 6f 76 69 64 78 29 20 0a 20 20  ->u.pCovidx) .  
30130 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
30140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
30150 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
30160 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
30170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30180 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  if( pLevel->op==
30190 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20  OP_Return ){.   
301a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
301b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
301c0 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  ub, pLevel->p1, 
301d0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
301e0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
301f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30200 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
30210 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
30220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
30230 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
30240 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
30250 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65  }.    VdbeModule
30260 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
30270 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25   WHERE-loop%d: %
30280 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20  s", i,.         
30290 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
302a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
302b0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70  pLevel->iFrom].p
302c0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
302d0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
302e0 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
302f0 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
30300 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
30310 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
30320 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
30330 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
30340 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
30350 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72  Break);..  asser
30360 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
30370 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  l<=pTabList->nSr
30380 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  c );.  for(i=0, 
30390 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
303a0 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
303b0 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  el; i++, pLevel+
303c0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c  +){.    int k, l
303d0 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20  ast;.    VdbeOp 
303e0 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20  *pOp;.    Index 
303f0 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73  *pIdx = 0;.    s
30400 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
30410 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26  em *pTabItem = &
30420 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
30430 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
30440 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
30450 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
30460 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
30470 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  0 );.    pLoop =
30480 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
30490 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63  ..    /* For a c
304a0 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67  o-routine, chang
304b0 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e all OP_Column 
304c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
304d0 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
304e0 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  * the co-routine
304f0 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66   into OP_Copy of
30500 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65   result containe
30510 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  d in a register.
30520 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64  .    ** OP_Rowid
30530 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c   becomes OP_Null
30540 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
30550 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69   pTabItem->fg.vi
30560 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
30570 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
30580 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
30590 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
305a0 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
305b0 6f 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 4c  oCopy(pParse, pL
305c0 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20  evel->addrBody, 
305d0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
305e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
305f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
30600 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
30610 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  , 0);.      cont
30620 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
30630 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e   /* If this scan
30640 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
30650 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73  make VDBE code s
30660 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20  ubstitutions to 
30670 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a  read data.    **
30680 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
30690 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20  instead of from 
306a0 74 68 65 20 74 61 62 6c 65 20 77 68 65 72 65 20  the table where 
306b0 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f  possible.  In so
306c0 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20  me cases.    ** 
306d0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
306e0 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 74  n prevents the t
306f0 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62  able from ever b
30700 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68  eing read, which
30710 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c   can.    ** yiel
30720 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20  d a significant 
30730 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
30740 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  t..    ** .    *
30750 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
30760 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
30770 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
30780 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
30790 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
307a0 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
307b0 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
307c0 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
307d0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
307e0 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
307f0 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
30800 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
30810 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
30820 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
30830 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
30840 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
30850 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
30860 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
30870 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
30880 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  /.    if( pLoop-
30890 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
308a0 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f  E_INDEXED|WHERE_
308b0 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
308c0 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
308d0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
308e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
308f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
30900 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
30910 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
30920 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
30930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30940 70 49 64 78 0a 20 20 20 20 20 26 26 20 28 70 57  pIdx.     && (pW
30950 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
30960 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20 21  ONEPASS_OFF || !
30970 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
30980 54 61 62 6c 65 29 29 0a 20 20 20 20 20 26 26 20  Table)).     && 
30990 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
309a0 64 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6c  d.    ){.      l
309b0 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
309c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
309d0 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65  .      k = pLeve
309e0 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 23 69 66  l->addrBody;.#if
309f0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
30a00 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66  .      if( db->f
30a10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
30a20 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
30a30 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
30a40 54 52 41 4e 53 4c 41 54 45 20 6f 70 63 6f 64 65  TRANSLATE opcode
30a50 73 20 69 6e 20 72 61 6e 67 65 20 25 64 2e 2e 25  s in range %d..%
30a60 64 5c 6e 22 2c 20 6b 2c 20 6c 61 73 74 2d 31 29  d\n", k, last-1)
30a70 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
30a80 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  .      pOp = sql
30a90 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
30aa0 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b   k);.      for(;
30ab0 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f   k<last; k++, pO
30ac0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
30ad0 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65  ( pOp->p1!=pLeve
30ae0 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e  l->iTabCur ) con
30af0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
30b00 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
30b10 4f 50 5f 43 6f 6c 75 6d 6e 0a 23 69 66 64 65 66  OP_Column.#ifdef
30b20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
30b30 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20  FFSET_SQL_FUNC. 
30b40 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e          || pOp->
30b50 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 66 66 73 65  opcode==OP_Offse
30b60 74 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  t.#endif.       
30b70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
30b80 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  t x = pOp->p2;. 
30b90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
30ba0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70   pIdx->pTable==p
30bb0 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab );.         
30bc0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
30bd0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
30be0 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
30bf0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
30c00 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
30c10 20 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 70             x = p
30c20 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b  Pk->aiColumn[x];
30c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
30c40 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20  ert( x>=0 );.   
30c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30c60 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f     x = sqlite3Co
30c70 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78  lumnOfIndex(pIdx
30c80 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , x);.          
30c90 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20  if( x>=0 ){.    
30ca0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
30cb0 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = x;.           
30cc0 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
30cd0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
30ce0 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65          OpcodeRe
30cf0 77 72 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b  writeTrace(db, k
30d00 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
30d10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
30d20 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
30d30 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
30d40 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e  X_ONLY)==0 || x>
30d50 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
30d60 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e    || pWInfo->eOn
30d70 65 50 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20  ePass );.       
30d80 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
30d90 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
30da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
30db0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
30dc0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
30dd0 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
30de0 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
30df0 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65          OpcodeRe
30e00 77 72 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b  writeTrace(db, k
30e10 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
30e20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
30e30 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 75 6c 6c  pcode==OP_IfNull
30e40 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Row ){.         
30e50 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
30e60 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
30e70 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72        OpcodeRewr
30e80 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20  iteTrace(db, k, 
30e90 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pOp);.        }.
30ea0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
30eb0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
30ec0 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
30ed0 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
30ee0 6f 70 54 72 61 63 65 20 29 20 70 72 69 6e 74 66  opTrace ) printf
30ef0 28 22 54 52 41 4e 53 4c 41 54 45 20 63 6f 6d 70  ("TRANSLATE comp
30f00 6c 65 74 65 5c 6e 22 29 3b 0a 23 65 6e 64 69 66  lete\n");.#endif
30f10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
30f20 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20   Final cleanup. 
30f30 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51   */.  pParse->nQ
30f40 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  ueryLoop = pWInf
30f50 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
30f60 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46  op;.  whereInfoF
30f70 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
30f80 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.