/ Hex Artifact Content
Login

Artifact 23f955de6db320fa5afcbe569687e649e5c9be1380c742fe7c5e9939e18cbcbe:


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: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
78b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
78c0: 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d  OP_Next, pLevel-
78d0: 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f  >iTabCur, addrTo
78e0: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
78f0: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
7900: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7910: 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  (v, SQLITE_STMTS
7920: 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29  TATUS_AUTOINDEX)
7930: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
7940: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
7950: 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  op);.  sqlite3Re
7960: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
7970: 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
7980: 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  .  .  /* Jump he
7990: 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67  re when skipping
79a0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
79b0: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
79c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
79d0: 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f  addrInit);..end_
79e0: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
79f0: 65 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  e:.  sqlite3Expr
7a00: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
7a10: 62 2c 20 70 50 61 72 74 69 61 6c 29 3b 0a 7d 0a  b, pPartial);.}.
7a20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7a30: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
7a40: 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65  INDEX */..#ifnde
7a50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
7a60: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
7a70: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
7a80: 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65  pulate an sqlite
7a90: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
7aa0: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68  ucture. It is th
7ab0: 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
7ac0: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
7ad0: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
7ae0: 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72   release the str
7af0: 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73  ucture.** by pas
7b00: 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72  sing the pointer
7b10: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
7b20: 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71  s function to sq
7b30: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
7b40: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
7b50: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f  index_info *allo
7b60: 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20  cateIndexInfo(. 
7b70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7ba0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
7bb0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bd0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
7be0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
7bf0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  */.  Bitmask mUn
7c00: 75 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  usable,         
7c10: 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74       /* Ignore t
7c20: 65 72 6d 73 20 77 69 74 68 20 74 68 65 73 65 20  erms with these 
7c30: 70 72 65 72 65 71 73 20 2a 2f 0a 20 20 73 74 72  prereqs */.  str
7c40: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
7c50: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
7c60: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
7c70: 74 65 72 6d 20 74 68 61 74 20 69 73 20 74 68 65  term that is the
7c80: 20 76 74 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c   vtab */.  ExprL
7c90: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
7ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7cb0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7cc0: 65 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6d 4e 6f  e */.  u16 *pmNo
7cd0: 4f 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  Omit            
7ce0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
7cf0: 66 20 74 65 72 6d 73 20 6e 6f 74 20 74 6f 20 6f  f terms not to o
7d00: 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
7d10: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
7d20: 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
7d30: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7d40: 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
7d50: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
7d60: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
7d70: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
7d80: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7d90: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
7da0: 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
7db0: 73 74 72 75 63 74 20 48 69 64 64 65 6e 49 6e 64  struct HiddenInd
7dc0: 65 78 49 6e 66 6f 20 2a 70 48 69 64 64 65 6e 3b  exInfo *pHidden;
7dd0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
7de0: 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  erm;.  int nOrde
7df0: 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  rBy;.  sqlite3_i
7e00: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
7e10: 6e 66 6f 3b 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d  nfo;.  u16 mNoOm
7e20: 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  it = 0;..  /* Co
7e30: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
7e40: 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45  f possible WHERE
7e50: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
7e60: 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20  nts referring.  
7e70: 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75  ** to this virtu
7e80: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  al table */.  fo
7e90: 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
7ea0: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
7eb0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
7ec0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
7ed0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
7ee0: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
7ef0: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
7f00: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
7f10: 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75  ereqRight & mUnu
7f20: 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65  sable ) continue
7f30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
7f40: 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
7f50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
7f60: 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
7f70: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7f80: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7f90: 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
7fa0: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7fb0: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
7fc0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7fd0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7fe0: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
7ff0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
8000: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8010: 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  O_ALL );.    if(
8020: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
8030: 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55 49 56 29  or & ~(WO_EQUIV)
8040: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
8050: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
8060: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
8070: 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
8080: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
8090: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
80a0: 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 6e 54  >=(-1) );.    nT
80b0: 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
80c0: 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
80d0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
80e0: 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
80f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
8100: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
8110: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
8120: 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
8130: 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
8140: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
8150: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
8160: 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
8170: 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
8180: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
8190: 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
81a0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
81b0: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
81c0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
81d0: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
81e0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
81f0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
8200: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
8210: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
8220: 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
8230: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
8240: 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
8250: 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
8260: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
8270: 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
8280: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
8290: 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
82a0: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
82b0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
82c0: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
82d0: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
8300: 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
8310: 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
8320: 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
8340: 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
8350: 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 2b 20  rBy)*nOrderBy + 
8360: 73 69 7a 65 6f 66 28 2a 70 48 69 64 64 65 6e 29  sizeof(*pHidden)
8370: 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
8380: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
8390: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
83a0: 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
83b0: 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ory");.    retur
83c0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
83d0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
83e0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
83f0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
8400: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
8410: 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
8420: 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
8430: 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
8440: 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
8450: 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
8460: 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
8470: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
8480: 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
8490: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
84a0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
84b0: 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
84c0: 20 70 48 69 64 64 65 6e 20 3d 20 28 73 74 72 75   pHidden = (stru
84d0: 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e  ct HiddenIndexIn
84e0: 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d  fo*)&pIdxInfo[1]
84f0: 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  ;.  pIdxCons = (
8500: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
8510: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
8520: 29 26 70 48 69 64 64 65 6e 5b 31 5d 3b 0a 20 20  )&pHidden[1];.  
8530: 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
8540: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
8550: 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
8560: 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
8570: 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
8580: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
8590: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
85a0: 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
85b0: 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e  OrderBy];.  *(in
85c0: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
85d0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
85e0: 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  m;.  *(int*)&pId
85f0: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
8600: 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  = nOrderBy;.  *(
8610: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
8620: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
8630: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
8640: 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43  nstraint = pIdxC
8650: 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  ons;.  *(struct 
8660: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
8670: 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66  derby**)&pIdxInf
8680: 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49  o->aOrderBy = pI
8690: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73  dxOrderBy;.  *(s
86a0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
86b0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
86c0: 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
86d0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
86e0: 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 70 55 73 61 67 65 3b 0a          pUsage;.
8730: 0a 20 20 70 48 69 64 64 65 6e 2d 3e 70 57 43 20  .  pHidden->pWC 
8740: 3d 20 70 57 43 3b 0a 20 20 70 48 69 64 64 65 6e  = pWC;.  pHidden
8750: 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
8760: 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  e;.  for(i=j=0, 
8770: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
8780: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
8790: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75   pTerm++){.    u
87a0: 31 36 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  16 op;.    if( p
87b0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
87c0: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
87d0: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
87e0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
87f0: 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73  reqRight & mUnus
8800: 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  able ) continue;
8810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50  .    assert( IsP
8820: 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d  owerOfTwo(pTerm-
8830: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f  >eOperator & ~WO
8840: 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74  _EQUIV) );.    t
8850: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
8860: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
8870: 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  N );.    testcas
8880: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
8890: 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
88a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
88b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
88c0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
88d0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
88e0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
88f0: 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  _ALL );.    if( 
8900: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
8910: 72 20 26 20 7e 28 57 4f 5f 45 51 55 49 56 29 29  r & ~(WO_EQUIV))
8920: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
8930: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
8940: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
8950: 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
8960: 20 20 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66      if( (pSrc->f
8970: 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
8980: 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26  LEFT)!=0.     &&
8990: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
89a0: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
89b0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
89c0: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70    && (pTerm->eOp
89d0: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 7c  erator & (WO_IS|
89e0: 57 4f 5f 49 53 4e 55 4c 4c 29 29 0a 20 20 20 20  WO_ISNULL)).    
89f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 22  ){.      /* An "
8a00: 49 53 22 20 74 65 72 6d 20 69 6e 20 74 68 65 20  IS" term in the 
8a10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65  WHERE clause whe
8a20: 72 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  re the virtual t
8a30: 61 62 6c 65 20 69 73 20 74 68 65 20 72 68 73 0a  able is the rhs.
8a40: 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 4c 45        ** of a LE
8a50: 46 54 20 4a 4f 49 4e 2e 20 44 6f 20 6e 6f 74 20  FT JOIN. Do not 
8a60: 70 61 73 73 20 74 68 69 73 20 74 65 72 6d 20 74  pass this term t
8a70: 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  o the virtual ta
8a80: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  ble.      ** imp
8a90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 73 20  lementation, as 
8aa0: 74 68 69 73 20 63 61 6e 20 6c 65 61 64 20 74 6f  this can lead to
8ab0: 20 69 6e 63 6f 72 72 65 63 74 20 72 65 73 75 6c   incorrect resul
8ac0: 74 73 20 66 72 6f 6d 20 53 51 4c 20 73 75 63 68  ts from SQL such
8ad0: 0a 20 20 20 20 20 20 2a 2a 20 61 73 3a 0a 20 20  .      ** as:.  
8ae0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
8af0: 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 76 74 61    "LEFT JOIN vta
8b00: 62 20 57 48 45 52 45 20 76 74 61 62 2e 63 6f 6c  b WHERE vtab.col
8b10: 20 49 53 20 4e 55 4c 4c 22 20 20 2a 2f 0a 20 20   IS NULL"  */.  
8b20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
8b30: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8b40: 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
8b50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
8b60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8b70: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
8b80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
8b90: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
8ba0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e  m->u.leftColumn>
8bb0: 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64  =(-1) );.    pId
8bc0: 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e  xCons[j].iColumn
8bd0: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
8be0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
8bf0: 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  Cons[j].iTermOff
8c00: 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20  set = i;.    op 
8c10: 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  = pTerm->eOperat
8c20: 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
8c30: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
8c40: 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
8c50: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 41 55 58 20   if( op==WO_AUX 
8c60: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  ){.      pIdxCon
8c70: 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d  s[j].op = pTerm-
8c80: 3e 65 4d 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d  >eMatchOp;.    }
8c90: 65 6c 73 65 20 69 66 28 20 6f 70 20 26 20 28 57  else if( op & (W
8ca0: 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 20  O_ISNULL|WO_IS) 
8cb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  ){.      if( op=
8cc0: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =WO_ISNULL ){.  
8cd0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
8ce0: 5d 2e 6f 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ].op = SQLITE_IN
8cf0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49  DEX_CONSTRAINT_I
8d00: 53 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  SNULL;.      }el
8d10: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78  se{.        pIdx
8d20: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c  Cons[j].op = SQL
8d30: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8d40: 41 49 4e 54 5f 49 53 3b 0a 20 20 20 20 20 20 7d  AINT_IS;.      }
8d50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8d60: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
8d70: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 20   = (u8)op;.     
8d80: 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
8d90: 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
8da0: 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
8db0: 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
8dc0: 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
8dd0: 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
8de0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8df0: 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
8e00: 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
8e10: 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
8e20: 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
8e30: 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
8e40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
8e50: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
8e60: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
8e70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8e80: 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
8e90: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8ea0: 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LT );.      asse
8eb0: 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
8ec0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8ed0: 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  NT_LE );.      a
8ee0: 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
8ef0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8f00: 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
8f10: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
8f20: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
8f30: 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
8f40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
8f50: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
8f60: 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54  O_IN|WO_EQ|WO_LT
8f70: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
8f80: 47 45 7c 57 4f 5f 41 55 58 29 20 29 3b 0a 0a 20  GE|WO_AUX) );.. 
8f90: 20 20 20 20 20 69 66 28 20 6f 70 20 26 20 28 57       if( op & (W
8fa0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
8fb0: 7c 57 4f 5f 47 45 29 0a 20 20 20 20 20 20 20 26  |WO_GE).       &
8fc0: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  & sqlite3ExprIsV
8fd0: 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e 70 45 78  ector(pTerm->pEx
8fe0: 70 72 2d 3e 70 52 69 67 68 74 29 20 0a 20 20 20  pr->pRight) .   
8ff0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66     ){.        if
9000: 28 20 69 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69 74  ( i<16 ) mNoOmit
9010: 20 7c 3d 20 28 31 20 3c 3c 20 69 29 3b 0a 20 20   |= (1 << i);.  
9020: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f        if( op==WO
9030: 5f 4c 54 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a  _LT ) pIdxCons[j
9040: 5d 2e 6f 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20  ].op = WO_LE;.  
9050: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f        if( op==WO
9060: 5f 47 54 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a  _GT ) pIdxCons[j
9070: 5d 2e 6f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20  ].op = WO_GE;.  
9080: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9090: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
90a0: 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
90b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
90c0: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
90d0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
90e0: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
90f0: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
9100: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
9110: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
9120: 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
9130: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
9140: 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f 6d 69 74    }..  *pmNoOmit
9150: 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 72 65   = mNoOmit;.  re
9160: 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d  turn pIdxInfo;.}
9170: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ../*.** The tabl
9180: 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  e object referen
9190: 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ce passed as the
91a0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
91b0: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
91c0: 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73  n.** must repres
91d0: 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  ent a virtual ta
91e0: 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
91f0: 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78  on invokes the x
9200: 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d  BestIndex().** m
9210: 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
9220: 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20  tual table with 
9230: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
9240: 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  x_info object th
9250: 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61  at.** comes in a
9260: 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65  s the 3rd argume
9270: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
9280: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
9290: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70   error occurs, p
92a0: 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74  Parse is populat
92b0: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
92c0: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 6e 0a   message and an.
92d0: 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ** appropriate e
92e0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
92f0: 75 72 6e 65 64 2e 20 20 41 20 72 65 74 75 72 6e  urned.  A return
9300: 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   of SQLITE_CONST
9310: 52 41 49 4e 54 20 66 72 6f 6d 0a 2a 2a 20 78 42  RAINT from.** xB
9320: 65 73 74 49 6e 64 65 78 20 69 73 20 6e 6f 74 20  estIndex is not 
9330: 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
9340: 72 6f 72 2e 20 20 53 51 4c 49 54 45 5f 43 4f 4e  ror.  SQLITE_CON
9350: 53 54 52 41 49 4e 54 20 69 6e 64 69 63 61 74 65  STRAINT indicate
9360: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 75  s that.** the cu
9370: 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74  rrent configurat
9380: 69 6f 6e 20 6f 66 20 22 75 6e 75 73 61 62 6c 65  ion of "unusable
9390: 22 20 66 6c 61 67 73 20 69 6e 20 73 71 6c 69 74  " flags in sqlit
93a0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 63 61  e3_index_info ca
93b0: 6e 0a 2a 2a 20 6e 6f 74 20 72 65 73 75 6c 74 20  n.** not result 
93c0: 69 6e 20 61 20 76 61 6c 69 64 20 70 6c 61 6e 2e  in a valid plan.
93d0: 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
93e0: 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  r not an error i
93f0: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69  s returned, it i
9400: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
9410: 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
9420: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
9430: 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53  lly free p->idxS
9440: 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46  tr if p->needToF
9450: 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61  reeIdxStr indica
9460: 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73  tes.** that this
9470: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
9480: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62  .static int vtab
9490: 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20  BestIndex(Parse 
94a0: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
94b0: 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pTab, sqlite3_in
94c0: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
94d0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
94e0: 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tab = sqlite3Get
94f0: 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
9500: 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b  b, pTab)->pVtab;
9510: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52  .  int rc;..  TR
9520: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
9530: 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d  );.  rc = pVtab-
9540: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49  >pModule->xBestI
9550: 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a  ndex(pVtab, p);.
9560: 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
9570: 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72  UTS(p);..  if( r
9580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
9590: 72 63 21 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc!=SQLITE_CONST
95a0: 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 69 66 28  RAINT ){.    if(
95b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
95c0: 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M ){.      sqlit
95d0: 65 33 4f 6f 6d 46 61 75 6c 74 28 70 50 61 72 73  e3OomFault(pPars
95e0: 65 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73  e->db);.    }els
95f0: 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45  e if( !pVtab->zE
9600: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
9610: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9620: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c  Parse, "%s", sql
9630: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
9640: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9650: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9660: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
9670: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
9680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
9690: 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
96a0: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74  >zErrMsg);.  pVt
96b0: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
96c0: 0a 20 20 2f 2f 20 61 73 73 65 72 74 28 20 70 50  .  // assert( pP
96d0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 7c 7c  arse->nErr==0 ||
96e0: 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc!=SQLITE_OK 
96f0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 43 4f  && rc!=SQLITE_CO
9700: 4e 53 54 52 41 49 4e 54 29 20 29 3b 0a 20 20 72  NSTRAINT) );.  r
9710: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
9720: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
9730: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9740: 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
9750: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9760: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
9770: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
9780: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
9790: 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
97a0: 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
97b0: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
97c0: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
97d0: 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
97e0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
97f0: 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
9800: 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
9810: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52 65  ws less than pRe
9820: 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  c.**    aStat[1]
9830: 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
9840: 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
9850: 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65  to pRec.**.** Re
9860: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
9870: 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68 61  f the sample tha
9880: 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73  t is the smalles
9890: 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a  t sample that.**
98a0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
98b0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
98c0: 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  c. Note that thi
98d0: 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 61  s index is not a
98e0: 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f 20  n index.** into 
98f0: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
9900: 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20 69  ray - it is an i
9910: 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72 74  ndex into a virt
9920: 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  ual set of sampl
9930: 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74  es.** based on t
9940: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
9950: 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68 65  Sample[] and the
9960: 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
9970: 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a 20  s in record .** 
9980: 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  pRec. .*/.static
9990: 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61   int whereKeySta
99a0: 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ts(.  Parse *pPa
99b0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
99c0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
99d0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
99e0: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
99f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9a00: 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
9a10: 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e  omain of */.  Un
9a20: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
9a30: 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63  ec,       /* Vec
9a40: 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  tor of values to
9a50: 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
9a60: 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20  nt roundUp,     
9a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
9a80: 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20  und up if true. 
9a90: 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66   Round down if f
9aa0: 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  alse */.  tRowcn
9ab0: 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20  t *aStat        
9ac0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74        /* OUT: st
9ad0: 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65  ats written here
9ae0: 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61   */.){.  IndexSa
9af0: 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20  mple *aSample = 
9b00: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20  pIdx->aSample;. 
9b10: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b30: 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72 65  Index of require
9b40: 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b  d stats in anEq[
9b50: 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  ] etc. */.  int 
9b60: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9b70: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9b80: 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65   of first sample
9b90: 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e   >= pRec */.  in
9ba0: 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20 20  t iSample;      
9bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61            /* Sma
9bc0: 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72  llest sample lar
9bd0: 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ger than or equa
9be0: 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69  l to pRec */.  i
9bf0: 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20  nt iMin = 0;    
9c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
9c10: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f  allest sample no
9c20: 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a  t yet tested */.
9c30: 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20    int iTest;    
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c50: 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20   Next sample to 
9c60: 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  test */.  int re
9c70: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
9c80: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
9c90: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  of comparison op
9ca0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
9cb0: 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20   nField;        
9cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9cd0: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
9ce0: 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  pRec */.  tRowcn
9cf0: 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20 20  t iLower = 0;   
9d00: 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20        /* anLt[] 
9d10: 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72 67  + anEq[] of larg
9d20: 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63 20  est sample pRec 
9d30: 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  is > */..#ifndef
9d40: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
9d50: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9d60: 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64  ( pParse );.#end
9d70: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  if.  assert( pRe
9d80: 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
9d90: 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e  ( pIdx->nSample>
9da0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9db0: 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26  Rec->nField>0 &&
9dc0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70   pRec->nField<=p
9dd0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20  Idx->nSampleCol 
9de0: 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69  );..  /* Do a bi
9df0: 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f 20 66  nary search to f
9e00: 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 73 61  ind the first sa
9e10: 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74 68 61  mple greater tha
9e20: 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20  n or equal.  ** 
9e30: 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65 63  to pRec. If pRec
9e40: 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
9e50: 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73 65  le field, the se
9e60: 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f 20  t of samples to 
9e70: 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20 73  search.  ** is s
9e80: 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70 6c  imply the aSampl
9e90: 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74 68  e[] array. If th
9ea0: 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61  e samples in aSa
9eb0: 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d  mple[] contain m
9ec0: 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f 6e  ore.  ** than on
9ed0: 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66 69  e fields, all fi
9ee0: 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  elds following t
9ef0: 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67 6e  he first are ign
9f00: 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored..  **.  ** 
9f10: 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73  If pRec contains
9f20: 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72 65   N fields, where
9f30: 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20   N is more than 
9f40: 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65 6c  one, then as wel
9f50: 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73 61  l as the.  ** sa
9f60: 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65  mples in aSample
9f70: 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74 6f  [] (truncated to
9f80: 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65 20   N fields), the 
9f90: 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73 20  search also has 
9fa0: 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  to.  ** consider
9fb0: 20 70 72 65 66 69 78 65 73 20 6f 66 20 74 68 6f   prefixes of tho
9fc0: 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72 20  se samples. For 
9fd0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
9fe0: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 20  set of samples. 
9ff0: 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20 69   ** in aSample i
a000: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
a010: 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28 61   aSample[0] = (a
a020: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  , 5) .  **     a
a030: 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c 20  Sample[1] = (a, 
a040: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53  10) .  **     aS
a050: 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20 35  ample[2] = (b, 5
a060: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
a070: 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30 30  ple[3] = (c, 100
a080: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
a090: 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30 35  ple[4] = (c, 105
a0a0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ).  **.  ** Then
a0b0: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
a0c0: 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c 79  e should ideally
a0d0: 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73 20   be the samples 
a0e0: 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a 20  above and the . 
a0f0: 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66 69   ** unique prefi
a100: 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64  xes [a], [b] and
a110: 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65 20   [c]. But since 
a120: 74 68 61 74 20 69 73 20 68 61 72 64 20 74 6f 20  that is hard to 
a130: 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20  organize, .  ** 
a140: 74 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c 6c  the code actuall
a150: 79 20 73 65 61 72 63 68 65 73 20 74 68 69 73 20  y searches this 
a160: 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  set:.  **.  **  
a170: 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a 20     0: (a) .  ** 
a180: 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a 20      1: (a, 5) . 
a190: 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20 31   **     2: (a, 1
a1a0: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a 20  0) .  **     3: 
a1b0: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
a1c0: 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20 20    4: (b) .  **  
a1d0: 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20 20     5: (b, 5) .  
a1e0: 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a 20  **     6: (c) . 
a1f0: 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20 31   **     7: (c, 1
a200: 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38 3a  00) .  **     8:
a210: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20 20   (c, 105).  **  
a220: 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a 20     9: (c, 105). 
a230: 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63   **.  ** For eac
a240: 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20  h sample in the 
a250: 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c  aSample[] array,
a260: 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20 70   N samples are p
a270: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20 20  resent in the.  
a280: 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73 61 6d  ** effective sam
a290: 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74 68  ple array. In th
a2a0: 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65 73  e above, samples
a2b0: 20 30 20 61 6e 64 20 31 20 61 72 65 20 62 61 73   0 and 1 are bas
a2c0: 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d 70  ed on .  ** samp
a2d0: 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20 53  le aSample[0]. S
a2e0: 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20 6f  amples 2 and 3 o
a2f0: 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74 63  n aSample[1] etc
a300: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65  ..  **.  ** Ofte
a310: 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20 65  n, sample i of e
a320: 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 65  ach block of N e
a330: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 73  ffective samples
a340: 20 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c 64   has (i+1) field
a350: 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  s..  ** Except, 
a360: 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79 20  each sample may 
a370: 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 65  be extended to e
a380: 6e 73 75 72 65 20 74 68 61 74 20 69 74 20 69 73  nsure that it is
a390: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
a3a0: 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74  .  ** equal to t
a3b0: 68 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d 70  he previous samp
a3c0: 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  le in the array.
a3d0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e   For example, in
a3e0: 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20 2a   the above, .  *
a3f0: 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74 68  * sample 2 is th
a400: 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 6f  e first sample o
a410: 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 73  f a block of N s
a420: 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66 69  amples, so at fi
a430: 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70 70  rst it .  ** app
a440: 65 61 72 73 20 74 68 61 74 20 69 74 20 73 68 6f  ears that it sho
a450: 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20 69  uld be 1 field i
a460: 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72 2c  n size. However,
a470: 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65   that would make
a480: 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65   it .  ** smalle
a490: 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31 2c  r than sample 1,
a4a0: 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   so the binary s
a4b0: 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74 20  earch would not 
a4c0: 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75 6c  work. As a resul
a4d0: 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  t, .  ** it is e
a4e0: 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20 66  xtended to two f
a4f0: 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c 69  ields. The dupli
a500: 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73 20  cates that this 
a510: 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20 0a  creates do not .
a520: 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70    ** cause any p
a530: 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
a540: 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e 6e  nField = pRec->n
a550: 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d 20  Field;.  iCol = 
a560: 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20 70  0;.  iSample = p
a570: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e  Idx->nSample * n
a580: 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20 20  Field;.  do{.   
a590: 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20 20   int iSamp;     
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a5b0: 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d 70  * Index in aSamp
a5c0: 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61 6d  le[] of test sam
a5d0: 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ple */.    int n
a5e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a600: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
a610: 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a  test sample */..
a620: 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69      iTest = (iMi
a630: 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20 20  n+iSample)/2;.  
a640: 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74 20    iSamp = iTest 
a650: 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69 66  / nField;.    if
a660: 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20 20  ( iSamp>0 ){.   
a670: 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f 73     /* The propos
a680: 65 64 20 65 66 66 65 63 74 69 76 65 20 73 61 6d  ed effective sam
a690: 70 6c 65 20 69 73 20 61 20 70 72 65 66 69 78 20  ple is a prefix 
a6a0: 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c  of sample aSampl
a6b0: 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20 20  e[iSamp]..      
a6c0: 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  ** Specifically,
a6d0: 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70 72   the shortest pr
a6e0: 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73 74  efix of at least
a6f0: 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69 65   (1 + iTest%nFie
a700: 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ld) .      ** fi
a710: 65 6c 64 73 20 74 68 61 74 20 69 73 20 67 72 65  elds that is gre
a720: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70 72  ater than the pr
a730: 65 76 69 6f 75 73 20 65 66 66 65 63 74 69 76 65  evious effective
a740: 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20 20   sample.  */.   
a750: 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74 20     for(n=(iTest 
a760: 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20 6e  % nField) + 1; n
a770: 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20  <nField; n++){. 
a780: 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
a790: 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74  le[iSamp-1].anLt
a7a0: 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b 69  [n-1]!=aSample[i
a7b0: 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20  Samp].anLt[n-1] 
a7c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
a7d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a7e0: 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31 3b    n = iTest + 1;
a7f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65 63  .    }..    pRec
a800: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20 20  ->nField = n;.  
a810: 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
a820: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
a830: 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e  (aSample[iSamp].
a840: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  n, aSample[iSamp
a850: 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20 20  ].p, pRec);.    
a860: 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
a870: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
a880: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
a890: 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69  n-1] + aSample[i
a8a0: 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b  Samp].anEq[n-1];
a8b0: 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54  .      iMin = iT
a8c0: 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  est+1;.    }else
a8d0: 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 6e   if( res==0 && n
a8e0: 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20  <nField ){.     
a8f0: 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
a900: 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
a910: 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d  1];.      iMin =
a920: 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20   iTest+1;.      
a930: 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  res = -1;.    }e
a940: 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d 70  lse{.      iSamp
a950: 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20  le = iTest;.    
a960: 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20    iCol = n-1;.  
a970: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65    }.  }while( re
a980: 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70 6c  s && iMin<iSampl
a990: 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d 70  e );.  i = iSamp
a9a0: 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23 69  le / nField;..#i
a9b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a9c0: 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  G.  /* The follo
a9d0: 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
a9e0: 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61  ements check tha
a9f0: 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  t the binary sea
aa00: 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62  rch code.  ** ab
aa10: 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69  ove found the ri
aa20: 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73  ght answer. This
aa30: 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f   block serves no
aa40: 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20   purpose other. 
aa50: 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f   ** than to invo
aa60: 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e 20  ke the asserts. 
aa70: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
aa80: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
aa90: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ed==0 ){.    if(
aaa0: 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
aab0: 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20   /* If (res==0) 
aac0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70 52  is true, then pR
aad0: 65 63 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c  ec must be equal
aae0: 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a 2f   to sample i. */
aaf0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
ab00: 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
ab10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ab20: 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29  iCol==nField-1 )
ab30: 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46  ;.      pRec->nF
ab40: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
ab50: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
ab60: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
ab70: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
ab80: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
ab90: 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20 20  ].p, pRec) .    
aba0: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
abb0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
abc0: 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ed .      );.   
abd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
abe0: 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78 2d   Unless i==pIdx-
abf0: 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63 61  >nSample, indica
ac00: 74 69 6e 67 20 74 68 61 74 20 70 52 65 63 20 69  ting that pRec i
ac10: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20  s larger than.  
ac20: 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c      ** all sampl
ac30: 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c  es in the aSampl
ac40: 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63 20  e[] array, pRec 
ac50: 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
ac60: 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  than the.      *
ac70: 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64  * (iCol+1) field
ac80: 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
ac90: 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  e i.  */.      a
aca0: 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d 3e  ssert( i<=pIdx->
acb0: 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30 20  nSample && i>=0 
acc0: 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  );.      pRec->n
acd0: 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a  Field = iCol+1;.
ace0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
acf0: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a  =pIdx->nSample .
ad00: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
ad10: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
ad20: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
ad30: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
ad40: 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20  p, pRec)>0.     
ad50: 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
ad60: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
ad70: 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69  d );..      /* i
ad80: 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c 3d  f i==0 and iCol=
ad90: 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20  =0, then record 
ada0: 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72 20  pRec is smaller 
adb0: 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  than all samples
adc0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
add0: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
ade0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
adf0: 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70 52  (iCol>0) then pR
ae00: 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  ec must.      **
ae10: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
ae20: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
ae30: 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70 72   (iCol) field pr
ae40: 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69  efix of sample i
ae50: 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28 69  ..      ** If (i
ae60: 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20 6d  >0), then pRec m
ae70: 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65 61  ust also be grea
ae80: 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ter than sample 
ae90: 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20  (i-1).  */.     
aea0: 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20   if( iCol>0 ){. 
aeb0: 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
aec0: 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  eld = iCol;.    
aed0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
aee0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
aef0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
af00: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
af10: 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20 20   pRec)<=0.      
af20: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
af30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
af40: 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
af50: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
af60: 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
af70: 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20  eld = nField;.  
af80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
af90: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
afa0: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
afb0: 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  -1].n, aSample[i
afc0: 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20  -1].p, pRec)<0. 
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
afe0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
aff0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
b000: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
b010: 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
b020: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20  ITE_DEBUG */..  
b030: 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
b040: 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65 63    /* Record pRec
b050: 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61 6d   is equal to sam
b060: 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73 73  ple i */.    ass
b070: 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c  ert( iCol==nFiel
b080: 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61 74  d-1 );.    aStat
b090: 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
b0a0: 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
b0b0: 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d   aStat[1] = aSam
b0c0: 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c  ple[i].anEq[iCol
b0d0: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
b0e0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
b0f0: 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20 66  , the (iCol+1) f
b100: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 61  ield prefix of a
b110: 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65  Sample[i] is the
b120: 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20 73   first .    ** s
b130: 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72  ample that is gr
b140: 65 61 74 65 72 20 74 68 61 6e 20 70 52 65 63 2e  eater than pRec.
b150: 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78 2d   Or, if i==pIdx-
b160: 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70 52  >nSample then pR
b170: 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61 72  ec.    ** is lar
b180: 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d  ger than all sam
b190: 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72 61  ples in the arra
b1a0: 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e  y. */.    tRowcn
b1b0: 74 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a  t iUpper, iGap;.
b1c0: 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78 2d      if( i>=pIdx-
b1d0: 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  >nSample ){.    
b1e0: 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69 74    iUpper = sqlit
b1f0: 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49  e3LogEstToInt(pI
b200: 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  dx->aiRowLogEst[
b210: 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0]);.    }else{.
b220: 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
b230: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69  Sample[i].anLt[i
b240: 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Col];.    }..   
b250: 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70   if( iLower>=iUp
b260: 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61  per ){.      iGa
b270: 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 0;.    }else
b280: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
b290: 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a  Upper - iLower;.
b2a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f      }.    if( ro
b2b0: 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69  undUp ){.      i
b2c0: 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33  Gap = (iGap*2)/3
b2d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b2e0: 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33     iGap = iGap/3
b2f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61  ;.    }.    aSta
b300: 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20  t[0] = iLower + 
b310: 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74 5b  iGap;.    aStat[
b320: 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45  1] = pIdx->aAvgE
b330: 71 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20 7d  q[nField-1];.  }
b340: 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74  ..  /* Restore t
b350: 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20  he pRec->nField 
b360: 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
b370: 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52  urning.  */.  pR
b380: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  ec->nField = nFi
b390: 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  eld;.  return i;
b3a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b3b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
b3c0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a  _OR_STAT4 */../*
b3d0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74  .** If it is not
b3e0: 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20   NULL, pTerm is 
b3f0: 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76  a term that prov
b400: 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72  ides an upper or
b410: 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20   lower.** bound 
b420: 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e  on a range scan.
b430: 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65   Without conside
b440: 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69  ring pTerm, it i
b450: 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20  s estimated .** 
b460: 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69  that the scan wi
b470: 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f  ll visit nNew ro
b480: 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ws. This functio
b490: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  n returns the nu
b4a0: 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65  mber.** estimate
b4b0: 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20  d to be visited 
b4c0: 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65  after taking pTe
b4d0: 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e  rm into account.
b4e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  .**.** If the us
b4f0: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  er explicitly sp
b500: 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69  ecified a likeli
b510: 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72  hood() value for
b520: 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74   this term,.** t
b530: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
b540: 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65  alue is the like
b550: 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65  lihood multiplie
b560: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
b570: 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73  of.** input rows
b580: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69  . Otherwise, thi
b590: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
b5a0: 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e  es that an "IS N
b5b0: 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a  OT NULL" term.**
b5c0: 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f   has a likelihoo
b5d0: 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61  d of 0.50, and a
b5e0: 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20  ny other term a 
b5f0: 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e  likelihood of 0.
b600: 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  25..*/.static Lo
b610: 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65 41  gEst whereRangeA
b620: 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d 20  djust(WhereTerm 
b630: 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e  *pTerm, LogEst n
b640: 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e  New){.  LogEst n
b650: 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66  Ret = nNew;.  if
b660: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69  ( pTerm ){.    i
b670: 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
b680: 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
b690: 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nRet += pTerm->t
b6a0: 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65  ruthProb;.    }e
b6b0: 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
b6c0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
b6d0: 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
b6e0: 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20    nRet -= 20;   
b6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d       assert( 20=
b700: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
b710: 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ) );.    }.  }. 
b720: 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a   return nRet;.}.
b730: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b740: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
b750: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75  STAT4./*.** Retu
b760: 72 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  rn the affinity 
b770: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  for a single col
b780: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e  umn of an index.
b790: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
b7a0: 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e  IndexColumnAffin
b7b0: 69 74 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ity(sqlite3 *db,
b7c0: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
b7d0: 74 20 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65 72  t iCol){.  asser
b7e0: 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  t( iCol>=0 && iC
b7f0: 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ol<pIdx->nColumn
b800: 20 29 3b 0a 20 20 69 66 28 20 21 70 49 64 78 2d   );.  if( !pIdx-
b810: 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20  >zColAff ){.    
b820: 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
b830: 41 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 20  AffinityStr(db, 
b840: 70 49 64 78 29 3d 3d 30 20 29 20 72 65 74 75 72  pIdx)==0 ) retur
b850: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
b860: 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  B;.  }.  return 
b870: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43  pIdx->zColAff[iC
b880: 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ol];.}.#endif...
b890: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b8a0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
b8b0: 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  AT4./* .** This 
b8c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
b8d0: 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
b8e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
b8f0: 73 20 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a  s visited by a.*
b900: 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20  * range-scan on 
b910: 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65  a skip-scan inde
b920: 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  x. For example:.
b930: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
b940: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
b950: 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c   b, c);.**   SEL
b960: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
b970: 45 52 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45  ERE a=? AND c BE
b980: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a  TWEEN ? AND ?;.*
b990: 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70  *.** Value pLoop
b9a0: 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e  ->nOut is curren
b9b0: 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 65  tly set to the e
b9c0: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
b9d0: 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69  of rows .** visi
b9e0: 74 65 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67  ted for scanning
b9f0: 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20   (a=? AND b=?). 
ba00: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
ba10: 64 75 63 65 73 20 74 68 61 74 20 65 73 74 69 6d  duces that estim
ba20: 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20  ate .** by some 
ba30: 66 61 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e  factor to accoun
ba40: 74 20 66 6f 72 20 74 68 65 20 28 63 20 42 45 54  t for the (c BET
ba50: 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78  WEEN ? AND ?) ex
ba60: 70 72 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a  pression based.*
ba70: 2a 20 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64  * on the stat4 d
ba80: 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ata for the inde
ba90: 78 2e 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c  x. this scan wil
baa0: 6c 20 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75  l be peformed mu
bab0: 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
bac0: 20 28 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20   (once for each 
bad0: 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f  (a,b) combinatio
bae0: 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  n that matches a
baf0: 3d 3f 29 20 69 73 20 64 65 61 6c 74 20 77 69 74  =?) is dealt wit
bb00: 68 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  h .** by the cal
bb10: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f  ler..**.** It do
bb20: 65 73 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e  es this by scann
bb30: 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
bb40: 73 74 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63  stat4 samples, c
bb50: 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a  omparing values.
bb60: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
bb70: 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  m pLower and pUp
bb80: 70 65 72 20 77 69 74 68 20 74 68 65 20 63 6f 72  per with the cor
bb90: 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
bba0: 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d  n in each.** sam
bbb0: 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20  ple. If L and U 
bbc0: 61 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  are the number o
bbd0: 66 20 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20  f samples found 
bbe0: 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
bbf0: 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74  or.** equal to t
bc00: 68 65 20 76 61 6c 75 65 73 20 65 78 74 72 61 63  he values extrac
bc10: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
bc20: 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
bc30: 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20  ctively, and.** 
bc40: 4e 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  N is the total n
bc50: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
bc60: 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  , the pLoop->nOu
bc70: 74 20 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73  t value is adjus
bc80: 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  ted.** as follow
bc90: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20  s:.**.**   nOut 
bca0: 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55  = nOut * ( min(U
bcb0: 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a   - L, 1) / N ).*
bcc0: 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69  *.** If pLower i
bcd0: 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c  s NULL, or a val
bce0: 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  ue cannot be ext
bcf0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
bd00: 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65  term, L is.** se
bd10: 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55  t to zero. If pU
bd20: 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72  pper is NULL, or
bd30: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
bd40: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
bd50: 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65  m it,.** U is se
bd60: 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  t to N..**.** No
bd70: 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  rmally, this fun
bd80: 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f  ction sets *pbDo
bd90: 6e 65 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72  ne to 1 before r
bda0: 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65  eturning. Howeve
bdb0: 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75  r,.** if no valu
bdc0: 65 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74  e can be extract
bdd0: 65 64 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70  ed from either p
bde0: 4c 6f 77 65 72 20 6f 72 20 70 55 70 70 65 72 20  Lower or pUpper 
bdf0: 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65  (and so the.** e
be00: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
be10: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65  umber of rows de
be20: 6c 69 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20  livered remains 
be30: 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44  unchanged), *pbD
be40: 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61  one.** is left a
be50: 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  s is..**.** If a
be60: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
be70: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
be80: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
be90: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
bea0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
beb0: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
bec0: 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28  angeSkipScanEst(
bed0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bee0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
bef0: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
bf00: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
bf10: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
bf20: 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
bf30: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
bf40: 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
bf50: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
bf60: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
bf70: 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
bf80: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
bf90: 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
bfa0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
bfb0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
bfc0: 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61  Loop,    /* Upda
bfd0: 74 65 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c  te the .nOut val
bfe0: 75 65 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20  ue of this loop 
bff0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65  */.  int *pbDone
c000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
c010: 20 74 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c   to true if at l
c020: 65 61 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76  east one expr. v
c030: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 2a  alue extracted *
c040: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
c050: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
c060: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
c070: 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
c080: 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74  ree.nEq;.  sqlit
c090: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c0a0: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65  >db;.  int nLowe
c0b0: 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55  r = -1;.  int nU
c0c0: 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c  pper = p->nSampl
c0d0: 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  e+1;.  int rc = 
c0e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
c0f0: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  aff = sqlite3Ind
c100: 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79  exColumnAffinity
c110: 28 64 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20  (db, p, nEq);.  
c120: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
c130: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c    .  sqlite3_val
c140: 75 65 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20  ue *p1 = 0;     
c150: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
c160: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
c170: 77 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  wer */.  sqlite3
c180: 5f 76 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20  _value *p2 = 0; 
c190: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
c1a0: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
c1b0: 20 70 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c   pUpper */.  sql
c1c0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
c1d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
c1e0: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
c1f0: 66 72 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a  from record */..
c200: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
c210: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
c220: 50 61 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c  Parse, p->azColl
c230: 5b 6e 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c  [nEq]);.  if( pL
c240: 6f 77 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ower ){.    rc =
c250: 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c   sqlite3Stat4Val
c260: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
c270: 65 2c 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72  e, pLower->pExpr
c280: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26  ->pRight, aff, &
c290: 70 31 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20  p1);.    nLower 
c2a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
c2b0: 55 70 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  Upper && rc==SQL
c2c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
c2d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 56   = sqlite3Stat4V
c2e0: 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
c2f0: 72 73 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78  rse, pUpper->pEx
c300: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c  pr->pRight, aff,
c310: 20 26 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65   &p2);.    nUppe
c320: 72 20 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e  r = p2 ? 0 : p->
c330: 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20  nSample;.  }..  
c340: 69 66 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a  if( p1 || p2 ){.
c350: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
c360: 6e 74 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f  nt nDiff;.    fo
c370: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
c380: 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61  E_OK && i<p->nSa
c390: 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
c3a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
c3b0: 61 74 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d  at4Column(db, p-
c3c0: 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70  >aSample[i].p, p
c3d0: 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  ->aSample[i].n, 
c3e0: 6e 45 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20  nEq, &pVal);.   
c3f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c400: 45 5f 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20  E_OK && p1 ){.  
c410: 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
c420: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
c430: 65 28 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c  e(p1, pVal, pCol
c440: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
c450: 72 65 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b  res>=0 ) nLower+
c460: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
c470: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c480: 4f 4b 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20  OK && p2 ){.    
c490: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71      int res = sq
c4a0: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
c4b0: 70 32 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29  p2, pVal, pColl)
c4c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
c4d0: 73 3e 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b  s>=0 ) nUpper++;
c4e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c4f0: 20 20 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70     nDiff = (nUpp
c500: 65 72 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20  er - nLower);.  
c510: 20 20 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29    if( nDiff<=0 )
c520: 20 6e 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20   nDiff = 1;..   
c530: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
c540: 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e  both an upper an
c550: 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70  d lower bound sp
c560: 65 63 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65  ecified, and the
c570: 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69   .    ** compari
c580: 73 6f 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68  sons indicate th
c590: 61 74 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  at they are clos
c5a0: 65 20 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20  e together, use 
c5b0: 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20  the fallback.   
c5c0: 20 2a 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75   ** method (assu
c5d0: 6d 65 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  me that the scan
c5e0: 20 76 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20   visits 1/64 of 
c5f0: 74 68 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73  the rows) for es
c600: 74 69 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20  timating.    ** 
c610: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
c620: 77 73 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65  ws visited. Othe
c630: 72 77 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20  rwise, estimate 
c640: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
c650: 77 73 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  ws.    ** using 
c660: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
c670: 69 62 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ibed in the head
c680: 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74  er comment for t
c690: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
c6a0: 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d  .    if( nDiff!=
c6b0: 31 20 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c  1 || pUpper==0 |
c6c0: 7c 20 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20  | pLower==0 ){. 
c6d0: 20 20 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74       int nAdjust
c6e0: 20 3d 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73   = (sqlite3LogEs
c6f0: 74 28 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20  t(p->nSample) - 
c700: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44  sqlite3LogEst(nD
c710: 69 66 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f  iff));.      pLo
c720: 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a  op->nOut -= nAdj
c730: 75 73 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f  ust;.      *pbDo
c740: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48  ne = 1;.      WH
c750: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28  ERETRACE(0x10, (
c760: 22 72 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e  "range skip-scan
c770: 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75   regions: %u..%u
c780: 20 20 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d    adjust=%d est=
c790: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 20 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72    nLower, nUpper
c7c0: 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c  , nAdjust*-1, pL
c7d0: 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20  oop->nOut));.   
c7e0: 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
c7f0: 20 61 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65   assert( *pbDone
c800: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ==0 );.  }..  sq
c810: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
c820: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  1);.  sqlite3Val
c830: 75 65 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71  ueFree(p2);.  sq
c840: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
c850: 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
c860: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
c870: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
c880: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
c890: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c8a0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
c8b0: 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
c8c0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
c8d0: 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64   will be visited
c8e0: 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .** by scanning 
c8f0: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72  an index for a r
c900: 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20  ange of values. 
c910: 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61  The range may ha
c920: 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62  ve an upper.** b
c930: 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f  ound, a lower bo
c940: 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68  und, or both. Th
c950: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
c960: 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68  erms that set th
c970: 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c  e upper.** and l
c980: 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20  ower bounds are 
c990: 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70  represented by p
c9a0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
c9b0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46   respectively. F
c9c0: 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61  or.** example, a
c9d0: 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64  ssuming that ind
c9e0: 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29  ex p is on t1(a)
c9f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
ca00: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
ca10: 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
ca20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ca30: 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20        |_____|   
ca40: 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20  |_____|.**      
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20   |         |.** 
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55      pLower    pU
ca90: 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69  pper.**.** If ei
caa0: 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65  ther of the uppe
cab0: 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64  r or lower bound
cac0: 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
cad0: 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61   then NULL is pa
cae0: 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65  ssed in.** place
caf0: 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
cb00: 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e  nding WhereTerm.
cb10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
cb20: 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70   in (pBuilder->p
cb30: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
cb40: 29 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ) is the number 
cb50: 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  of the index.** 
cb60: 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
cb70: 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  o the range cons
cb80: 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
cb90: 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
cba0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c  mber of.** equal
cbb0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
cbc0: 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
cbd0: 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
cbe0: 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
cbf0: 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69  e,.** assuming i
cc00: 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28  ndex p is on t1(
cc10: 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
cc20: 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
cc30: 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
cc40: 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
cc50: 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
cc60: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
cc70: 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 31 20  nEq is set to 1 
cc80: 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65  (as the range re
cc90: 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c  stricted column,
cca0: 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e   b, is the secon
ccb0: 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  d .** left-most 
ccc0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
ccd0: 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
cce0: 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
ccf0: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
cd00: 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
cd10: 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
cd20: 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
cd30: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  o 0..**.** When 
cd40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
cd50: 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20   called, *pnOut 
cd60: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 71  is set to the sq
cd70: 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66  lite3LogEst() of
cd80: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
cd90: 66 20 72 6f 77 73 20 74 68 61 74 20 74 68 65 20  f rows that the 
cda0: 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65 78  index scan is ex
cdb0: 70 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 20  pected to visit 
cdc0: 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73  without .** cons
cdd0: 69 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67  idering the rang
cde0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49  e constraints. I
cdf0: 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e  f nEq is 0, then
ce00: 20 2a 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e   *pnOut is the n
ce10: 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77  umber of .** row
ce20: 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20  s in the index. 
ce30: 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  Assuming no erro
ce40: 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74  r occurs, *pnOut
ce50: 20 69 73 20 61 64 6a 75 73 74 65 64 20 28 72 65   is adjusted (re
ce60: 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63  duced).** to acc
ce70: 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e  ount for the ran
ce80: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70  ge constraints p
ce90: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
cea0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20  ..** .** In the 
ceb0: 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74  absence of sqlit
cec0: 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20  e_stat4 ANALYZE 
ced0: 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68  data, or if such
cee0: 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a   data cannot be.
cef0: 2a 2a 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c  ** used, a singl
cf00: 65 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69  e range inequali
cf10: 74 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73  ty reduces the s
cf20: 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
cf30: 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a   factor of 4. .*
cf40: 2a 20 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20  * and a pair of 
cf50: 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f  constraints (x>?
cf60: 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65   AND x<?) reduce
cf70: 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e  s the expected n
cf80: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73  umber of.** rows
cf90: 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61   visited by a fa
cfa0: 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73  ctor of 64..*/.s
cfb0: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
cfc0: 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50  angeScanEst(.  P
cfd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
cfe0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
cff0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
d000: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
d010: 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
d020: 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72  pBuilder,.  Wher
d030: 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
d040: 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
d050: 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
d060: 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
d070: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
d080: 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
d090: 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
d0a0: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
d0b0: 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
d0c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
d0d0: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20  ereLoop *pLoop  
d0e0: 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65     /* Modify the
d0f0: 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65   .nOut and maybe
d100: 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f   .rRun fields */
d110: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
d120: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
d130: 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f  nOut = pLoop->nO
d140: 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65  ut;.  LogEst nNe
d150: 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w;..#ifdef SQLIT
d160: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
d170: 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20  R_STAT4.  Index 
d180: 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
d190: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
d1a0: 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
d1b0: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69  .btree.nEq;..  i
d1c0: 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  f( p->nSample>0 
d1d0: 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c  && nEq<p->nSampl
d1e0: 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74 69 6d  eCol.   && Optim
d1f0: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
d200: 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
d210: 45 5f 53 74 61 74 33 34 29 0a 20 20 29 7b 0a 20  E_Stat34).  ){. 
d220: 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69     if( nEq==pBui
d230: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
d240: 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65  ){.      Unpacke
d250: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
d260: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
d270: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b        tRowcnt a[
d280: 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42  2];.      int nB
d290: 74 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  tm = pLoop->u.bt
d2a0: 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 20 20 20 20  ree.nBtm;.      
d2b0: 69 6e 74 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70  int nTop = pLoop
d2c0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a  ->u.btree.nTop;.
d2d0: 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62  .      /* Variab
d2e0: 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62  le iLower will b
d2f0: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
d300: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
d310: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
d320: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64        ** the ind
d330: 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73  ex that are less
d340: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
d350: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
d360: 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20  ge query. The.  
d370: 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75      ** lower bou
d380: 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e  nd being the con
d390: 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50  catenation of $P
d3a0: 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24   and $L, where $
d3b0: 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  P is the.      *
d3c0: 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72  * key-prefix for
d3d0: 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76  med by the nEq v
d3e0: 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67  alues matched ag
d3f0: 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65  ainst the nEq le
d400: 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ft-most.      **
d410: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
d420: 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
d430: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
d440: 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ower..      **. 
d450: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70       ** Or, if p
d460: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72  Lower is NULL or
d470: 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78   $L cannot be ex
d480: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20  tracted from it 
d490: 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20  (because it.    
d4a0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
d4b0: 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
d4c0: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
d4d0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
d4e0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
d4f0: 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75   range is $P. Du
d500: 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20  e to a quirk in 
d510: 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79  the way whereKey
d520: 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65  Stats() works, e
d530: 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  ven.      ** if 
d540: 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $L is available,
d550: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
d560: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62   is called for b
d570: 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20  oth ($P) and .  
d580: 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61      ** ($P:$L) a
d590: 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  nd the larger of
d5a0: 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65   the two returne
d5b0: 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64  d values is used
d5c0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
d5d0: 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
d5e0: 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73  Upper is to be s
d5f0: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
d600: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
d610: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a   of rows.      *
d620: 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
d630: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  upper bound of t
d640: 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
d650: 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20  Where the upper 
d660: 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69  bound.      ** i
d670: 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72  s either ($P) or
d680: 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c   ($P:$U). Again,
d690: 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61   even if $U is a
d6a0: 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76  vailable, both v
d6b0: 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  alues.      ** o
d6c0: 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71  f iUpper are req
d6d0: 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b  uested of whereK
d6e0: 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68  eyStats() and th
d6f0: 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a  e smaller used..
d700: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
d710: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
d720: 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65  rows between the
d730: 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74   two bounds is t
d740: 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d  hen just iUpper-
d750: 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f  iLower..      */
d760: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
d770: 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Lower;     /* Ro
d780: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
d790: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
d7a0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55        tRowcnt iU
d7b0: 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  pper;     /* Row
d7c0: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
d7d0: 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  upper bound */. 
d7e0: 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78       int iLwrIdx
d7f0: 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d   = -2;   /* aSam
d800: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f  ple[] for the lo
d810: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
d820: 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d     int iUprIdx =
d830: 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -1;   /* aSampl
d840: 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65  e[] for the uppe
d850: 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20  r bound */..    
d860: 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20    if( pRec ){.  
d870: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d880: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42  pRec->nField!=pB
d890: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
d8a0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  d );.        pRe
d8b0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69  c->nField = pBui
d8c0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
d8d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
d8e0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77  * Determine iLow
d8f0: 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73  er and iUpper us
d900: 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a  ing ($P) only. *
d910: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d  /.      if( nEq=
d920: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  =0 ){.        iL
d930: 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
d940: 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52    iUpper = p->nR
d950: 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d 65  owEst0;.      }e
d960: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
d970: 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20  Note: this call 
d980: 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a  could be optimiz
d990: 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20  ed away - since 
d9a0: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20  the same values 
d9b0: 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  must .        **
d9c0: 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
d9d0: 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e  sted when testin
d9e0: 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72  g key $P in wher
d9f0: 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e  eEqualScanEst().
da00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65    */.        whe
da10: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
da20: 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
da30: 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65  );.        iLowe
da40: 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
da50: 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20    iUpper = a[0] 
da60: 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  + a[1];.      }.
da70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
da80: 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f  Lower==0 || (pLo
da90: 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
daa0: 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21   (WO_GT|WO_GE))!
dab0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
dac0: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
dad0: 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61   (pUpper->eOpera
dae0: 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  tor & (WO_LT|WO_
daf0: 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  LE))!=0 );.     
db00: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f 72   assert( p->aSor
db10: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
db20: 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f     if( p->aSortO
db30: 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20  rder[nEq] ){.   
db40: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65       /* The role
db50: 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64 20  s of pLower and 
db60: 70 55 70 70 65 72 20 61 72 65 20 73 77 61 70 70  pUpper are swapp
db70: 65 64 20 66 6f 72 20 61 20 44 45 53 43 20 69 6e  ed for a DESC in
db80: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  dex */.        S
db90: 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c 20  WAP(WhereTerm*, 
dba0: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29 3b  pLower, pUpper);
dbb0: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e  .        SWAP(in
dbc0: 74 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a  t, nBtm, nTop);.
dbd0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
dbe0: 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  * If possible, i
dbf0: 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c  mprove on the iL
dc00: 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20 75 73  ower estimate us
dc10: 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a  ing ($P:$L). */.
dc20: 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72        if( pLower
dc30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
dc40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
dc50: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20        /* Values 
dc60: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
dc70: 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  Expr */.        
dc80: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
dc90: 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
dca0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
dcb0: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
dcc0: 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
dcd0: 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
dce0: 78 70 72 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c 20  xpr, nBtm, nEq, 
dcf0: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  &n);.        if(
dd00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
dd10: 26 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  & n ){.         
dd20: 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
dd30: 20 20 20 20 20 20 20 20 20 75 31 36 20 6d 61 73           u16 mas
dd40: 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b  k = WO_GT|WO_LE;
dd50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
dd60: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
dd70: 53 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20  Size(pExpr)>n ) 
dd80: 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f  mask = (WO_LE|WO
dd90: 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _LT);.          
dda0: 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iLwrIdx = whereK
ddb0: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
ddc0: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
ddd0: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
dde0: 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72   a[0] + ((pLower
ddf0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61  ->eOperator & ma
de00: 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b  sk) ? a[1] : 0);
de10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
de20: 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f  New>iLower ) iLo
de30: 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  wer = iNew;.    
de40: 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
de50: 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d          pLower =
de60: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
de70: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
de80: 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
de90: 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70  rove on the iUpp
dea0: 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
deb0: 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20  g ($P:$U). */.  
dec0: 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29      if( pUpper )
ded0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  {.        int n;
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
def0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78      /* Values ex
df00: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
df10: 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
df20: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70  pr *pExpr = pUpp
df30: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
df40: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
df50: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
df60: 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
df70: 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
df80: 72 2c 20 6e 54 6f 70 2c 20 6e 45 71 2c 20 26 6e  r, nTop, nEq, &n
df90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
dfa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dfb0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  n ){.          t
dfc0: 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
dfd0: 20 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20         u16 mask 
dfe0: 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_GT|WO_LE;. 
dff0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
e000: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
e010: 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61  ze(pExpr)>n ) ma
e020: 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c  sk = (WO_LE|WO_L
e030: 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 55  T);.          iU
e040: 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79  prIdx = whereKey
e050: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
e060: 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20   pRec, 1, a);.  
e070: 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61          iNew = a
e080: 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e  [0] + ((pUpper->
e090: 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b  eOperator & mask
e0a0: 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
e0b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
e0c0: 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65  w<iUpper ) iUppe
e0d0: 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
e0e0: 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
e0f0: 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30        pUpper = 0
e100: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e110: 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c    }..      pBuil
e120: 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
e130: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
e140: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e150: 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
e160: 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
e170: 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74      nNew = sqlit
e180: 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20  e3LogEst(iUpper 
e190: 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20  - iLower);.     
e1a0: 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
e1b0: 20 49 66 20 62 6f 74 68 20 69 55 70 70 65 72 20   If both iUpper 
e1c0: 61 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64  and iLower are d
e1d0: 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20  erived from the 
e1e0: 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
e1f0: 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61  * sample, then a
e200: 73 73 75 6d 65 20 74 68 65 79 20 61 72 65 20 34  ssume they are 4
e210: 78 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65  x more selective
e220: 2e 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20  .  This brings. 
e230: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
e240: 65 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74  estimated select
e250: 69 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69  ivity more in li
e260: 6e 65 20 77 69 74 68 20 77 68 61 74 20 69 74 20  ne with what it 
e270: 77 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20  would be.       
e280: 20 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74     ** if estimat
e290: 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 75  ed without the u
e2a0: 73 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61  se of STAT3/4 ta
e2b0: 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  bles. */.       
e2c0: 20 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d     if( iLwrIdx==
e2d0: 69 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d  iUprIdx ) nNew -
e2e0: 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32  = 20;  assert( 2
e2f0: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
e300: 28 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  (4) );.        }
e310: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e320: 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20  nNew = 10;      
e330: 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71    assert( 10==sq
e340: 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29  lite3LogEst(2) )
e350: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e360: 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75      if( nNew<nOu
e370: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  t ){.          n
e380: 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  Out = nNew;.    
e390: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48      }.        WH
e3a0: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28  ERETRACE(0x10, (
e3b0: 22 53 54 41 54 34 20 72 61 6e 67 65 20 73 63 61  "STAT4 range sca
e3c0: 6e 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25  n: %u..%u  est=%
e3d0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75   (u32)iLower, (u
e400: 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29  32)iUpper, nOut)
e410: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
e430: 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20  bDone = 0;.     
e440: 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65   rc = whereRange
e450: 53 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61 72  SkipScanEst(pPar
e460: 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70  se, pLower, pUpp
e470: 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e  er, pLoop, &bDon
e480: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44  e);.      if( bD
e490: 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b  one ) return rc;
e4a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
e4b0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e4c0: 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
e4d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
e4e0: 70 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73  pBuilder);.  ass
e4f0: 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70  ert( pLower || p
e500: 55 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a  Upper );.#endif.
e510: 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72    assert( pUpper
e520: 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e  ==0 || (pUpper->
e530: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
e540: 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e  NULL)==0 );.  nN
e550: 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41  ew = whereRangeA
e560: 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f  djust(pLower, nO
e570: 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68  ut);.  nNew = wh
e580: 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70  ereRangeAdjust(p
e590: 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20  Upper, nNew);.. 
e5a0: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74   /* TUNING: If t
e5b0: 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20  here is both an 
e5c0: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
e5d0: 6c 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65  limit and neithe
e5e0: 72 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73  r limit.  ** has
e5f0: 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d   an application-
e600: 64 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f  defined likeliho
e610: 6f 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65  od(), assume the
e620: 20 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72   range is.  ** r
e630: 65 64 75 63 65 64 20 62 79 20 61 6e 20 61 64 64  educed by an add
e640: 69 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69  itional 75%. Thi
e650: 73 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79  s means that, by
e660: 20 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65   default, an ope
e670: 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e  n-ended.  ** ran
e680: 67 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63  ge query (e.g. c
e690: 6f 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d  ol > ?) is assum
e6a0: 65 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20  ed to match 1/4 
e6b0: 6f 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  of the rows in t
e6c0: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57  he.  ** index. W
e6d0: 68 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61  hile a closed ra
e6e0: 6e 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45  nge (e.g. col BE
e6f0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69  TWEEN ? AND ?) i
e700: 73 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20  s estimated to. 
e710: 20 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f   ** match 1/64 o
e720: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20  f the index. */ 
e730: 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26  .  if( pLower &&
e740: 20 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72   pLower->truthPr
e750: 6f 62 3e 30 20 26 26 20 70 55 70 70 65 72 20 26  ob>0 && pUpper &
e760: 26 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50  & pUpper->truthP
e770: 72 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65  rob>0 ){.    nNe
e780: 77 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20  w -= 20;.  }..  
e790: 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21  nOut -= (pLower!
e7a0: 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30  =0) + (pUpper!=0
e7b0: 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30  );.  if( nNew<10
e7c0: 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20   ) nNew = 10;.  
e7d0: 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20  if( nNew<nOut ) 
e7e0: 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66  nOut = nNew;.#if
e7f0: 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
e800: 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69  ACE_ENABLED).  i
e810: 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e  f( pLoop->nOut>n
e820: 4f 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45  Out ){.    WHERE
e830: 54 52 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e  TRACE(0x10,("Ran
e840: 67 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e  ge scan lowers n
e850: 4f 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25  Out from %d to %
e860: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
e870: 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
e880: 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20  >nOut, nOut));. 
e890: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f   }.#endif.  pLoo
e8a0: 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
e8b0: 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e  t)nOut;.  return
e8c0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
e8d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
e8e0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
e8f0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
e900: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
e910: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
e920: 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
e930: 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
e940: 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
e950: 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
e960: 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
e970: 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
e980: 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
e990: 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
e9a0: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
e9b0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
e9c0: 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
e9d0: 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
e9e0: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
e9f0: 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
ea00: 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
ea10: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
ea20: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
ea30: 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
ea40: 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
ea50: 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
ea60: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
ea70: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
ea80: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
ea90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
eaa0: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
eab0: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
eac0: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
ead0: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
eae0: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
eaf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
eb00: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
eb10: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
eb20: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
eb30: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
eb40: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
eb50: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
eb60: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
eb70: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
eb80: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
eb90: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
eba0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
ebb0: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
ebc0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
ebd0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
ebe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
ebf0: 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
ec00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ec10: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ec20: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
ec30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ec40: 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
ec50: 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
ec60: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
ec70: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
ec80: 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68   for VALUE in th
ec90: 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72  e x=VALUE constr
eca0: 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  aint */.  tRowcn
ecb0: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
ecc0: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
ecd0: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
ece0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
ecf0: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
ed00: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
ed10: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
ed20: 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  Eq = pBuilder->p
ed30: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
ed40: 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
ed50: 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
ed60: 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 69 6e 74  der->pRec;.  int
ed70: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
ed80: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
ed90: 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
eda0: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  e */.  tRowcnt a
edb0: 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
edc0: 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a   /* Statistics *
edd0: 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20  /.  int bOk;..  
ede0: 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29  assert( nEq>=1 )
edf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c  ;.  assert( nEq<
ee00: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  =p->nColumn );. 
ee10: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
ee20: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ple!=0 );.  asse
ee30: 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  rt( p->nSample>0
ee40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
ee50: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
ee60: 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49  d<nEq );..  /* I
ee70: 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74  f values are not
ee80: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
ee90: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
eea0: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65   index to the le
eeb0: 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  ft.  ** of this 
eec0: 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65  one, no estimate
eed0: 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65   can be made. Re
eee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
eef0: 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70  OUND. */.  if( p
ef00: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
ef10: 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20  id<(nEq-1) ){.  
ef20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ef30: 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20  NOTFOUND;.  }.. 
ef40: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   /* This is an o
ef50: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
ef60: 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  . The call to sq
ef70: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
ef80: 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62  etValue().  ** b
ef90: 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72  elow would retur
efa0: 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  n the same value
efb0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e  .  */.  if( nEq>
efc0: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  =p->nColumn ){. 
efd0: 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20     *pnRow = 1;. 
efe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
eff0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
f000: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
f010: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
f020: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
f030: 70 72 2c 20 31 2c 20 6e 45 71 2d 31 2c 20 26 62  pr, 1, nEq-1, &b
f040: 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  Ok);.  pBuilder-
f050: 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
f060: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f070: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
f080: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65   if( bOk==0 ) re
f090: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
f0a0: 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72  OUND;.  pBuilder
f0b0: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45  ->nRecValid = nE
f0c0: 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74  q;..  whereKeySt
f0d0: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
f0e0: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48  Rec, 0, a);.  WH
f0f0: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
f100: 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65  equality scan re
f110: 67 69 6f 6e 73 20 25 73 28 25 64 29 3a 20 25 64  gions %s(%d): %d
f120: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
f130: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65          p->zName
f140: 2c 20 6e 45 71 2d 31 2c 20 28 69 6e 74 29 61 5b  , nEq-1, (int)a[
f150: 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d  1]));.  *pnRow =
f160: 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75   a[1];.  .  retu
f170: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
f180: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
f190: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
f1a0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
f1b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
f1c0: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
f1d0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
f1e0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
f1f0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
f200: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49  based on.** an I
f210: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65  N constraint whe
f220: 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
f230: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
f240: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
f250: 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
f260: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
f270: 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78  *        WHERE x
f280: 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a   IN (1,2,3,4).**
f290: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
f2a0: 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
f2b0: 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
f2c0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
f2d0: 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
f2e0: 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
f2f0: 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
f300: 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
f310: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
f320: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
f330: 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
f340: 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
f350: 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
f360: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
f370: 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
f380: 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
f390: 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
f3a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
f3b0: 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
f3c0: 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
f3d0: 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
f3e0: 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
f3f0: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
f400: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
f410: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
f420: 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  t whereInScanEst
f430: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f440: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
f450: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
f460: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
f470: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
f480: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
f490: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
f4a0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c  ,     /* The val
f4b0: 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52  ue list on the R
f4c0: 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c  HS of "x IN (v1,
f4d0: 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20  v2,v3,...)" */. 
f4e0: 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20   tRowcnt *pnRow 
f4f0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
f500: 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
f510: 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
f520: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
f530: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
f540: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
f550: 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71    i64 nRow0 = sq
f560: 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
f570: 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  (p->aiRowLogEst[
f580: 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56  0]);.  int nRecV
f590: 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
f5a0: 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e  >nRecValid;.  in
f5b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f5c0: 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63  ;     /* Subfunc
f5d0: 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
f5e0: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45   */.  tRowcnt nE
f5f0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
f600: 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
f610: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
f620: 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  m */.  tRowcnt n
f630: 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f  RowEst = 0;    /
f640: 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
f650: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
f660: 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rows */.  int i;
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
f690: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
f6a0: 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
f6b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
f6c0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
f6d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
f6e0: 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52  ){.    nEst = nR
f6f0: 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ow0;.    rc = wh
f700: 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
f710: 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
f720: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
f730: 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20  xpr, &nEst);.   
f740: 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74   nRowEst += nEst
f750: 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
f760: 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63  nRecValid = nRec
f770: 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66  Valid;.  }..  if
f780: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f790: 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  ){.    if( nRowE
f7a0: 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f  st > nRow0 ) nRo
f7b0: 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  wEst = nRow0;.  
f7c0: 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45    *pnRow = nRowE
f7d0: 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  st;.    WHERETRA
f7e0: 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77  CE(0x10,("IN row
f7f0: 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25   estimate: est=%
f800: 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b  d\n", nRowEst));
f810: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
f820: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
f830: 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b  id==nRecValid );
f840: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f850: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f860: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
f870: 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64  _STAT4 */...#ifd
f880: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
f890: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
f8a0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
f8b0: 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a   a WhereTerm obj
f8c0: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
f8d0: 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e  id whereTermPrin
f8e0: 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
f8f0: 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a  rm, int iTerm){.
f900: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
f910: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
f920: 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25  ugPrintf("TERM-%
f930: 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65  -3d NULL\n", iTe
f940: 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rm);.  }else{.  
f950: 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
f960: 0a 20 20 20 20 63 68 61 72 20 7a 4c 65 66 74 5b  .    char zLeft[
f970: 35 30 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  50];.    memcpy(
f980: 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29  zType, "...", 4)
f990: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
f9a0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
f9b0: 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b  VIRTUAL ) zType[
f9c0: 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20 69 66  0] = 'V';.    if
f9d0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
f9e0: 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29  or & WO_EQUIV  )
f9f0: 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b   zType[1] = 'E';
fa00: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
fa10: 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
fa20: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
fa30: 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d  in) ) zType[2] =
fa40: 20 27 4c 27 3b 0a 20 20 20 20 69 66 28 20 70 54   'L';.    if( pT
fa50: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fa60: 20 57 4f 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20   WO_SINGLE ){.  
fa70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
fa80: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66  intf(sizeof(zLef
fa90: 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 7b  t),zLeft,"left={
faa0: 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  %d:%d}",.       
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
fad0: 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  r, pTerm->u.left
fae0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c  Column);.    }el
faf0: 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
fb00: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
fb10: 29 21 3d 30 20 26 26 20 70 54 65 72 6d 2d 3e 75  )!=0 && pTerm->u
fb20: 2e 70 4f 72 49 6e 66 6f 21 3d 30 20 29 7b 0a 20  .pOrInfo!=0 ){. 
fb30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
fb40: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65  rintf(sizeof(zLe
fb50: 66 74 29 2c 7a 4c 65 66 74 2c 22 69 6e 64 65 78  ft),zLeft,"index
fb60: 61 62 6c 65 3d 30 78 25 6c 6c 64 22 2c 20 0a 20  able=0x%lld", . 
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb80: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 70        pTerm->u.p
fb90: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
fba0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
fbb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
fbc0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65  rintf(sizeof(zLe
fbd0: 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d  ft),zLeft,"left=
fbe0: 25 64 22 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74  %d", pTerm->left
fbf0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
fc00: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
fc10: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 54  rintf(.       "T
fc20: 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73 20 25  ERM-%-3d %p %s %
fc30: 2d 31 32 73 20 70 72 6f 62 3d 25 2d 33 64 20 6f  -12s prob=%-3d o
fc40: 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67 73  p=0x%03x wtFlags
fc50: 3d 30 78 25 30 34 78 22 2c 0a 20 20 20 20 20 20  =0x%04x",.      
fc60: 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a   iTerm, pTerm, z
fc70: 54 79 70 65 2c 20 7a 4c 65 66 74 2c 20 70 54 65  Type, zLeft, pTe
fc80: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20  rm->truthProb,. 
fc90: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
fca0: 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77  erator, pTerm->w
fcb0: 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  tFlags);.    if(
fcc0: 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 20 29   pTerm->iField )
fcd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
fce0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 69 46 69  ebugPrintf(" iFi
fcf0: 65 6c 64 3d 25 64 5c 6e 22 2c 20 70 54 65 72 6d  eld=%d\n", pTerm
fd00: 2d 3e 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 7d  ->iField);.    }
fd10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
fd20: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
fd30: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
fd40: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
fd50: 78 70 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45  xpr(0, pTerm->pE
fd60: 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23  xpr, 0);.  }.}.#
fd70: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48  endif..#ifdef WH
fd80: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
fd90: 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20  ./*.** Show the 
fda0: 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
fdb0: 20 6f 66 20 61 20 57 68 65 72 65 43 6c 61 75 73   of a WhereClaus
fdc0: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
fdd0: 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e  3WhereClausePrin
fde0: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
fdf0: 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  WC){.  int i;.  
fe00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 43 2d 3e  for(i=0; i<pWC->
fe10: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
fe20: 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
fe30: 26 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a  &pWC->a[i], i);.
fe40: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
fe50: 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
fe60: 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72  ENABLED./*.** Pr
fe70: 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  int a WhereLoop 
fe80: 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67  object for debug
fe90: 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f  ging purposes.*/
fea0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
feb0: 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72  reLoopPrint(Wher
fec0: 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43  eLoop *p, WhereC
fed0: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57  lause *pWC){.  W
fee0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
fef0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
ff00: 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57    int nb = 1+(pW
ff10: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
ff20: 6e 53 72 63 2b 33 29 2f 34 3b 0a 20 20 73 74 72  nSrc+3)/4;.  str
ff30: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
ff40: 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f   *pItem = pWInfo
ff50: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
ff60: 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65  p->iTab;.  Table
ff70: 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
ff80: 70 54 61 62 3b 0a 20 20 42 69 74 6d 61 73 6b 20  pTab;.  Bitmask 
ff90: 6d 41 6c 6c 20 3d 20 28 28 28 42 69 74 6d 61 73  mAll = (((Bitmas
ffa0: 6b 29 31 29 3c 3c 28 6e 62 2a 34 29 29 20 2d 20  k)1)<<(nb*4)) - 
ffb0: 31 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  1;.  sqlite3Debu
ffc0: 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25  gPrintf("%c%2d.%
ffd0: 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70  0*llx.%0*llx", p
ffe0: 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20  ->cId,.         
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
10000 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b  Tab, nb, p->mask
10010 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65  Self, nb, p->pre
10020 72 65 71 20 26 20 6d 41 6c 6c 29 3b 0a 20 20 73  req & mAll);.  s
10030 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
10040 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
10070 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
10080 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
10090 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
100a0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
100b0 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
100c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
100d0 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  e;.    if( p->u.
100e0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
100f0 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
10100 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
10110 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
10120 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
10130 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
10140 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
10150 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
10160 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
10170 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
10180 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
10190 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
101a0 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
101b0 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
101c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
101d0 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
101e0 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
101f0 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
10200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
10210 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
10220 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
10230 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
10240 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
10250 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
10260 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
10270 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
10280 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
102b0 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
102c0 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
102d0 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
102e0 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
102f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
10300 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
10310 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
10320 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
10330 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10340 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
10350 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
10360 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
10370 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46    }.  if( p->wsF
10380 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
10390 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c  PSCAN ){.    sql
103a0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
103b0 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c  " f %05x %d-%d",
103c0 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
103d0 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29  nLTerm,p->nSkip)
103e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
103f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
10400 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22  f(" f %05x N %d"
10410 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
10420 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  >nLTerm);.  }.  
10430 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
10440 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
10450 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
10460 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
10470 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  ut);.  if( p->nL
10480 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33  Term && (sqlite3
10490 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
104a0 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  00)!=0 ){.    in
104b0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
104c0 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69  ; i<p->nLTerm; i
104d0 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
104e0 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54  TermPrint(p->aLT
104f0 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  erm[i], i);.    
10500 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
10510 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75  /*.** Convert bu
10520 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61  lk memory into a
10530 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70   valid WhereLoop
10540 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73   that can be pas
10550 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c  sed.** to whereL
10560 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73  oopClear harmles
10570 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sly..*/.static v
10580 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  oid whereLoopIni
10590 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  t(WhereLoop *p){
105a0 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
105b0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20  ->aLTermSpace;. 
105c0 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a   p->nLTerm = 0;.
105d0 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72    p->nLSlot = Ar
105e0 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72  raySize(p->aLTer
105f0 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73  mSpace);.  p->ws
10600 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Flags = 0;.}../*
10610 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68  .** Clear the Wh
10620 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e  ereLoop.u union.
10630 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f    Leave WhereLoo
10640 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e  p.pLTerm intact.
10650 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10660 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
10670 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
10680 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
10690 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
106a0 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41   & (WHERE_VIRTUA
106b0 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54  LTABLE|WHERE_AUT
106c0 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  O_INDEX) ){.    
106d0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
106e0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
106f0 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75  ABLE)!=0 && p->u
10700 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
10710 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
10720 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69  free(p->u.vtab.i
10730 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d  dxStr);.      p-
10740 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
10750 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75   = 0;.      p->u
10760 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30  .vtab.idxStr = 0
10770 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10780 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
10790 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
107a0 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65  =0 && p->u.btree
107b0 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
107c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
107d0 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
107e0 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
107f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10800 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e  DbFreeNN(db, p->
10810 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b  u.btree.pIndex);
10820 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
10830 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
10840 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
10850 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65   Deallocate inte
10860 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64  rnal memory used
10870 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20   by a WhereLoop 
10880 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
10890 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43   void whereLoopC
108a0 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62  lear(sqlite3 *db
108b0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
108c0 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
108d0 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
108e0 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
108f0 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  NN(db, p->aLTerm
10900 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  );.  whereLoopCl
10910 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b  earUnion(db, p);
10920 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
10930 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  (p);.}../*.** In
10940 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  crease the memor
10950 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72  y allocation for
10960 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d   pLoop->aLTerm[]
10970 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20   to be at least 
10980 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
10990 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
109a0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
109b0 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20  ereLoop *p, int 
109c0 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  n){.  WhereTerm 
109d0 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70  **paNew;.  if( p
109e0 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65  ->nLSlot>=n ) re
109f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10a00 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a    n = (n+7)&~7;.
10a10 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65    paNew = sqlite
10a20 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
10a30 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  b, sizeof(p->aLT
10a40 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66  erm[0])*n);.  if
10a50 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74  ( paNew==0 ) ret
10a60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10a70 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28  _BKPT;.  memcpy(
10a80 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d  paNew, p->aLTerm
10a90 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
10aa0 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74  rm[0])*p->nLSlot
10ab0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65  );.  if( p->aLTe
10ac0 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61  rm!=p->aLTermSpa
10ad0 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ce ) sqlite3DbFr
10ae0 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65  eeNN(db, p->aLTe
10af0 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d  rm);.  p->aLTerm
10b00 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e   = paNew;.  p->n
10b10 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74  LSlot = n;.  ret
10b20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10b30 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
10b40 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
10b50 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69  e second pLoop i
10b60 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a  nto the first..*
10b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
10b80 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74  reLoopXfer(sqlit
10b90 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
10ba0 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f  p *pTo, WhereLoo
10bb0 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65  p *pFrom){.  whe
10bc0 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
10bd0 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28  (db, pTo);.  if(
10be0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
10bf0 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d  (db, pTo, pFrom-
10c00 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20  >nLTerm) ){.    
10c10 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20  memset(&pTo->u, 
10c20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75  0, sizeof(pTo->u
10c30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
10c40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
10c50 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70  ;.  }.  memcpy(p
10c60 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45  To, pFrom, WHERE
10c70 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a  _LOOP_XFER_SZ);.
10c80 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
10c90 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54  Term, pFrom->aLT
10ca0 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d  erm, pTo->nLTerm
10cb0 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54  *sizeof(pTo->aLT
10cc0 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  erm[0]));.  if( 
10cd0 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
10ce0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
10cf0 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  BLE ){.    pFrom
10d00 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
10d10 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
10d20 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61  f( (pFrom->wsFla
10d30 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
10d40 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
10d50 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e   pFrom->u.btree.
10d60 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
10d70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10d80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  OK;.}../*.** Del
10d90 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ete a WhereLoop 
10da0 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
10db0 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44   void whereLoopD
10dc0 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
10dd0 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
10de0 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  {.  whereLoopCle
10df0 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c  ar(db, p);.  sql
10e00 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
10e10 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   p);.}../*.** Fr
10e20 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
10e30 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
10e40 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
10e50 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
10e60 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
10e70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
10e80 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
10e90 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
10ea0 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
10eb0 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 57 68  el; i++){.    Wh
10ec0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
10ed0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
10ee0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
10ef0 2d 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65  ->pWLoop && (pLe
10f00 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
10f10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
10f20 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 73  ABLE) ){.      s
10f30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10f40 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
10f50 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  nLoop);.    }.  
10f60 7d 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  }.  sqlite3Where
10f70 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49  ClauseClear(&pWI
10f80 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 77 68 69  nfo->sWC);.  whi
10f90 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
10fa0 70 73 20 29 7b 0a 20 20 20 20 57 68 65 72 65 4c  ps ){.    WhereL
10fb0 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d  oop *p = pWInfo-
10fc0 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 70 57 49  >pLoops;.    pWI
10fd0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d  nfo->pLoops = p-
10fe0 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
10ff0 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
11000 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 73 71  db, p);.  }.  sq
11010 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
11020 2c 20 70 57 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  , pWInfo);.}../*
11030 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
11040 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
11050 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
11060 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58  :.**.**   (1)  X
11070 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72   has the same or
11080 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74   lower cost that
11090 20 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 75   Y.**   (2)  X u
110a0 73 65 73 20 66 65 77 65 72 20 57 48 45 52 45 20  ses fewer WHERE 
110b0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
110c0 6e 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 45 76  n Y.**   (3)  Ev
110d0 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
110e0 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20   term used by X 
110f0 69 73 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20  is also used by 
11100 59 0a 2a 2a 20 20 20 28 34 29 20 20 58 20 73 6b  Y.**   (4)  X sk
11110 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20  ips at least as 
11120 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20  many columns as 
11130 59 0a 2a 2a 20 20 20 28 35 29 20 20 49 66 20 58  Y.**   (5)  If X
11140 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   is a covering i
11150 6e 64 65 78 2c 20 74 68 61 6e 20 59 20 69 73 20  ndex, than Y is 
11160 74 6f 6f 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74  too.**.** Condit
11170 69 6f 6e 73 20 28 32 29 20 61 6e 64 20 28 33 29  ions (2) and (3)
11180 20 6d 65 61 6e 20 74 68 61 74 20 58 20 69 73 20   mean that X is 
11190 61 20 22 70 72 6f 70 65 72 20 73 75 62 73 65 74  a "proper subset
111a0 22 20 6f 66 20 59 2e 0a 2a 2a 20 49 66 20 58 20  " of Y..** If X 
111b0 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
111c0 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69  et of Y then Y i
111d0 73 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63  s a better choic
111e0 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74  e and ought.** t
111f0 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63  o have a lower c
11200 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ost.  This routi
11210 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ne returns TRUE 
11220 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a  when that cost .
11230 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  ** relationship 
11240 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20  is inverted and 
11250 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75  needs to be adju
11260 73 74 65 64 2e 20 20 43 6f 6e 73 74 72 61 69 6e  sted.  Constrain
11270 74 20 28 34 29 0a 2a 2a 20 77 61 73 20 61 64 64  t (4).** was add
11280 65 64 20 62 65 63 61 75 73 65 20 69 66 20 58 20  ed because if X 
11290 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c  uses skip-scan l
112a0 65 73 73 20 74 68 61 6e 20 59 20 69 74 20 73 74  ess than Y it st
112b0 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73  ill might.** des
112c0 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  erve a lower cos
112d0 74 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20  t even if it is 
112e0 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
112f0 6f 66 20 59 2e 20 20 43 6f 6e 73 74 72 61 69 6e  of Y.  Constrain
11300 74 20 28 35 29 0a 2a 2a 20 77 61 73 20 61 64 64  t (5).** was add
11310 65 64 20 62 65 63 61 75 73 65 20 61 20 63 6f 76  ed because a cov
11320 65 72 69 6e 67 20 69 6e 64 65 78 20 70 72 6f 62  ering index prob
11330 61 62 6c 79 20 64 65 73 65 72 76 65 73 20 74 6f  ably deserves to
11340 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f   have a lower co
11350 73 74 0a 2a 2a 20 74 68 61 6e 20 61 20 6e 6f 6e  st.** than a non
11360 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
11370 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20  even if it is a 
11380 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a  proper subset..*
11390 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
113a0 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
113b0 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e  perSubset(.  con
113c0 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58  st WhereLoop *pX
113d0 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
113e0 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f   WhereLoop to co
113f0 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  mpare */.  const
11400 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20   WhereLoop *pY  
11410 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
11420 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57 68   against this Wh
11430 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  ereLoop */.){.  
11440 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20  int i, j;.  if( 
11450 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e  pX->nLTerm-pX->n
11460 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65  Skip >= pY->nLTe
11470 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a  rm-pY->nSkip ){.
11480 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
11490 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73   X is not a subs
114a0 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20  et of Y */.  }. 
114b0 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e   if( pY->nSkip >
114c0 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74   pX->nSkip ) ret
114d0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58 2d  urn 0;.  if( pX-
114e0 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75  >rRun >= pY->rRu
114f0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  n ){.    if( pX-
11500 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e  >rRun > pY->rRun
11510 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11520 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20  /* X costs more 
11530 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66  than Y */.    if
11540 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d  ( pX->nOut > pY-
11550 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30  >nOut ) return 0
11560 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20  ;    /* X costs 
11570 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20  more than Y */. 
11580 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e   }.  for(i=pX->n
11590 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  LTerm-1; i>=0; i
115a0 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  --){.    if( pX-
115b0 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20  >aLTerm[i]==0 ) 
115c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
115d0 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31  r(j=pY->nLTerm-1
115e0 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
115f0 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65      if( pY->aLTe
11600 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72  rm[j]==pX->aLTer
11610 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  m[i] ) break;.  
11620 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
11630 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
11640 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  X not a subset o
11650 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58  f Y since term X
11660 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20  [i] not used by 
11670 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  Y */.  }.  if( (
11680 70 58 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  pX->wsFlags&WHER
11690 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a  E_IDX_ONLY)!=0 .
116a0 20 20 20 26 26 20 28 70 59 2d 3e 77 73 46 6c 61     && (pY->wsFla
116b0 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  gs&WHERE_IDX_ONL
116c0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Y)==0 ){.    ret
116d0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 6e 73 74  urn 0;  /* Const
116e0 72 61 69 6e 74 20 28 35 29 20 2a 2f 0a 20 20 7d  raint (5) */.  }
116f0 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a  .  return 1;  /*
11700 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20   All conditions 
11710 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  meet */.}../*.**
11720 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74   Try to adjust t
11730 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65  he cost of Where
11740 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75  Loop pTemplate u
11750 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61  pwards or downwa
11760 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a  rds so.** that:.
11770 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d  **.**   (1) pTem
11780 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73  plate costs less
11790 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20   than any other 
117a0 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20  WhereLoops that 
117b0 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20  are a proper.** 
117c0 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66 20        subset of 
117d0 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20  pTemplate.**.** 
117e0 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20    (2) pTemplate 
117f0 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
11800 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c  any other WhereL
11810 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20 70  oops for which p
11820 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20  Template.**     
11830 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75    is a proper su
11840 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73  bset..**.** To s
11850 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20  ay "WhereLoop X 
11860 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
11870 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74  et of Y" means t
11880 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72  hat X uses fewer
11890 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
118a0 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e   terms than Y an
118b0 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45  d that every WHE
118c0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75  RE clause term u
118d0 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61  sed by X is.** a
118e0 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a  lso used by Y..*
118f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
11900 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73  ereLoopAdjustCos
11910 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f  t(const WhereLoo
11920 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  p *p, WhereLoop 
11930 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69  *pTemplate){.  i
11940 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  f( (pTemplate->w
11950 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
11960 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74  NDEXED)==0 ) ret
11970 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20  urn;.  for(; p; 
11980 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b  p=p->pNextLoop){
11990 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
119a0 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
119b0 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  b ) continue;.  
119c0 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
119d0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
119e0 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  D)==0 ) continue
119f0 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c  ;.    if( whereL
11a00 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
11a10 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c  Subset(p, pTempl
11a20 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ate) ){.      /*
11a30 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74   Adjust pTemplat
11a40 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20  e cost downward 
11a50 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 68  so that it is ch
11a60 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a  eaper than its .
11a70 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20        ** subset 
11a80 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52  p. */.      WHER
11a90 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75  ETRACE(0x80,("su
11aa0 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74  bset cost adjust
11ab0 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64  ment %d,%d to %d
11ac0 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ,%d\n",.        
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11ae0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20  Template->rRun, 
11af0 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c  pTemplate->nOut,
11b00 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
11b10 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65  t-1));.      pTe
11b20 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70  mplate->rRun = p
11b30 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54  ->rRun;.      pT
11b40 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20  emplate->nOut = 
11b50 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20  p->nOut - 1;.   
11b60 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65   }else if( where
11b70 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
11b80 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74  rSubset(pTemplat
11b90 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f  e, p) ){.      /
11ba0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
11bb0 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73  te cost upward s
11bc0 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73  o that it is cos
11bd0 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e  tlier than p sin
11be0 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d  ce.      ** pTem
11bf0 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65  plate is a prope
11c00 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f  r subset of p */
11c10 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
11c20 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20  E(0x80,("subset 
11c30 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20  cost adjustment 
11c40 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e  %d,%d to %d,%d\n
11c50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
11c60 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c            pTempl
11c70 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70  ate->rRun, pTemp
11c80 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72  late->nOut, p->r
11c90 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29  Run, p->nOut+1))
11ca0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
11cb0 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75  e->rRun = p->rRu
11cc0 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  n;.      pTempla
11cd0 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f  te->nOut = p->nO
11ce0 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ut + 1;.    }.  
11cf0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  }.}../*.** Searc
11d00 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  h the list of Wh
11d10 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50  ereLoops in *ppP
11d20 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  rev looking for 
11d30 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a  one that can be.
11d40 2a 2a 20 72 65 70 6c 61 63 65 64 20 62 79 20 70  ** replaced by p
11d50 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  Template..**.** 
11d60 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 70  Return NULL if p
11d70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f  Template does no
11d80 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20  t belong on the 
11d90 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 2e 0a  WhereLoop list..
11da0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
11db0 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 6f  s if pTemplate o
11dc0 75 67 68 74 20 74 6f 20 62 65 20 64 72 6f 70 70  ught to be dropp
11dd0 65 64 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20  ed from further 
11de0 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2e 0a 2a  consideration..*
11df0 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20  *.** If pX is a 
11e00 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70  WhereLoop that p
11e10 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 72 65 70  Template can rep
11e20 6c 61 63 65 2c 20 74 68 65 6e 20 72 65 74 75 72  lace, then retur
11e30 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68  n the.** link th
11e40 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e  at points to pX.
11e50 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c  .**.** If pTempl
11e60 61 74 65 20 63 61 6e 6e 6f 74 20 72 65 70 6c 61  ate cannot repla
11e70 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ce any existing 
11e80 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c  element of the l
11e90 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a  ist but needs.**
11ea0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
11eb0 74 68 65 20 6c 69 73 74 20 61 73 20 61 20 6e 65  the list as a ne
11ec0 77 20 65 6e 74 72 79 2c 20 74 68 65 6e 20 72 65  w entry, then re
11ed0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
11ee0 6f 20 74 68 65 0a 2a 2a 20 74 61 69 6c 20 6f 66  o the.** tail of
11ef0 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
11f00 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a  atic WhereLoop *
11f10 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65  *whereLoopFindLe
11f20 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  sser(.  WhereLoo
11f30 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f  p **ppPrev,.  co
11f40 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
11f50 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68  Template.){.  Wh
11f60 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f  ereLoop *p;.  fo
11f70 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70  r(p=(*ppPrev); p
11f80 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65  ; ppPrev=&p->pNe
11f90 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65  xtLoop, p=*ppPre
11fa0 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  v){.    if( p->i
11fb0 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Tab!=pTemplate->
11fc0 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74  iTab || p->iSort
11fd0 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Idx!=pTemplate->
11fe0 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20  iSortIdx ){.    
11ff0 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74    /* If either t
12000 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74  he iTab or iSort
12010 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74  Idx values for t
12020 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65  wo WhereLoop are
12030 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20   different.     
12040 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57   ** then those W
12050 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74  hereLoops need t
12060 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  o be considered 
12070 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69  separately.  Nei
12080 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ther is.      **
12090 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
120a0 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65  replace the othe
120b0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  r. */.      cont
120c0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
120d0 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  /* In the curren
120e0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
120f0 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c  , the rSetup val
12100 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72  ue is either zer
12110 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20  o.    ** or the 
12120 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67  cost of building
12130 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
12140 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20  dex (NlogN) and 
12150 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a  the NlogN.    **
12160 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72   is the same for
12170 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72   compatible Wher
12180 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61  eLoops. */.    a
12190 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
121a0 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65  ==0 || pTemplate
121b0 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20  ->rSetup==0 .   
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
121d0 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d   p->rSetup==pTem
121e0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
121f0 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f  ..    /* whereLo
12200 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77  opAddBtree() alw
12210 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e  ays generates an
12220 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75  d inserts the au
12230 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20  tomatic index.  
12240 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e    ** case first.
12250 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62    Hence compatib
12260 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65  le candidate Whe
12270 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61  reLoops never ha
12280 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20  ve a larger.    
12290 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20  ** rSetup. Call 
122a0 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52  this SETUP-INVAR
122b0 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65  IANT */.    asse
122c0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
122d0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
122e0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20   );..    /* Any 
122f0 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70  loop using an ap
12300 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  pliation-defined
12310 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41   index (or PRIMA
12320 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a  RY KEY or.    **
12330 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
12340 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20  nt) with one or 
12350 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  more == constrai
12360 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a 20 20  nts is better.  
12370 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74    ** than an aut
12380 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e  omatic index. Un
12390 6c 65 73 73 20 69 74 20 69 73 20 61 20 73 6b 69  less it is a ski
123a0 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69  p-scan. */.    i
123b0 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
123c0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
123d0 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  X)!=0.     && (p
123e0 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29  Template->nSkip)
123f0 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  ==0.     && (pTe
12400 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
12410 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
12420 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
12430 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
12440 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  & WHERE_COLUMN_E
12450 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  Q)!=0.     && (p
12460 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
12470 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
12480 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
12490 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
124a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
124b0 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20 57  /* If existing W
124c0 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65  hereLoop p is be
124d0 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c  tter than pTempl
124e0 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63  ate, pTemplate c
124f0 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73  an be.    ** dis
12500 63 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f  carded.  WhereLo
12510 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20 69  op p is better i
12520 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20  f:.    **   (1) 
12530 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64   p has no more d
12540 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
12550 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a   pTemplate, and.
12560 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20      **   (2)  p 
12570 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20  has an equal or 
12580 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
12590 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f  pTemplate.    */
125a0 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
125b0 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
125c0 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65  >prereq)==p->pre
125d0 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a  req    /* (1)  *
125e0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65  /.     && p->rSe
125f0 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup<=pTemplate->
12600 72 53 65 74 75 70 20 20 20 20 20 20 20 20 20 20  rSetup          
12610 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20          /* (2a) 
12620 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  */.     && p->rR
12630 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un<=pTemplate->r
12640 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  Run             
12650 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29           /* (2b)
12660 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e   */.     && p->n
12670 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Out<=pTemplate->
12680 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
12690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63            /* (2c
126a0 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
126b0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
126c0 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74  Discard pTemplat
126d0 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e */.    }..    
126e0 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20  /* If pTemplate 
126f0 69 73 20 61 6c 77 61 79 73 20 62 65 74 74 65 72  is always better
12700 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61   than p, then ca
12710 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72  use p to be over
12720 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77  written.    ** w
12730 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20  ith pTemplate.  
12740 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74  pTemplate is bet
12750 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20  ter than p if:. 
12760 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65     **   (1)  pTe
12770 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f  mplate has no mo
12780 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74  re dependences t
12790 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a  han p, and.    *
127a0 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61  *   (2)  pTempla
127b0 74 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20  te has an equal 
127c0 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
127d0 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  an p..    */.   
127e0 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
127f0 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
12800 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
12810 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29  >prereq   /* (1)
12820 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e    */.     && p->
12830 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  rRun>=pTemplate-
12840 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20  >rRun           
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12860 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20    /* (2a) */.   
12870 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54    && p->nOut>=pT
12880 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20  emplate->nOut   
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62            /* (2b
128b0 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
128c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
128d0 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup>=pTemplate->
128e0 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54  rSetup ); /* SET
128f0 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f  UP-INVARIANT abo
12900 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ve */.      brea
12910 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20  k;   /* Cause p 
12920 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  to be overwritte
12930 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a  n by pTemplate *
12940 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  /.    }.  }.  re
12950 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a  turn ppPrev;.}..
12960 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20  /*.** Insert or 
12970 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c  replace a WhereL
12980 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20  oop entry using 
12990 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70  the template sup
129a0 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  plied..**.** An 
129b0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
129c0 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62  op entry might b
129d0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
129e0 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
129f0 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61  e.** is better a
12a00 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70  nd has fewer dep
12a10 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74  endencies.  Or t
12a20 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c  he template will
12a30 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   be ignored.** a
12a40 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c  nd no insert wil
12a50 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78  l occur if an ex
12a60 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
12a70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68   is faster and h
12a80 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65  as.** fewer depe
12a90 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
12aa0 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68  e template.  Oth
12ab0 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65  erwise a new Whe
12ac0 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64  reLoop is.** add
12ad0 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
12ae0 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
12af0 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  If pBuilder->pOr
12b00 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  Set is not NULL 
12b10 74 68 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f  then we care abo
12b20 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70  ut only the.** p
12b30 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64  rerequisites and
12b40 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63   rRun and nOut c
12b50 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65  osts of the N be
12b60 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a  st loops.  That.
12b70 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ** information i
12b80 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68  s gathered in th
12b90 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  e pBuilder->pOrS
12ba0 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
12bb0 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63   special.** proc
12bc0 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  essing mode is u
12bd0 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20  sed only for OR 
12be0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
12bf0 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63  g..**.** When ac
12c00 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69  cumulating multi
12c10 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20  ple loops (when 
12c20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
12c30 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20   is NULL) we.** 
12c40 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72  still might over
12c50 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f  write similar lo
12c60 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77  ops with the new
12c70 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65   template if the
12c80 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  .** new template
12c90 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f   is better.  Loo
12ca0 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72  ps may be overwr
12cb0 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c  itten if the fol
12cc0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69  lowing .** condi
12cd0 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a  tions are met:.*
12ce0 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
12cf0 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
12d00 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20  iTab..**    (2) 
12d10 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
12d20 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a  ame iSortIdx..**
12d30 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d      (3)  The tem
12d40 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f  plate has same o
12d50 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  r fewer dependen
12d60 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75  cies than the cu
12d70 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20  rrent loop.**   
12d80 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (4)  The templa
12d90 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  te has the same 
12da0 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
12db0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
12dc0 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  oop.*/.static in
12dd0 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  t whereLoopInser
12de0 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t(WhereLoopBuild
12df0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68  er *pBuilder, Wh
12e00 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
12e10 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  te){.  WhereLoop
12e20 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20   **ppPrev, *p;. 
12e30 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
12e40 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
12e50 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33  WInfo;.  sqlite3
12e60 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
12e70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
12e80 20 72 63 3b 0a 0a 20 20 2f 2a 20 53 74 6f 70 20   rc;..  /* Stop 
12e90 74 68 65 20 73 65 61 72 63 68 20 6f 6e 63 65 20  the search once 
12ea0 77 65 20 68 69 74 20 74 68 65 20 71 75 65 72 79  we hit the query
12eb0 20 70 6c 61 6e 6e 65 72 20 73 65 61 72 63 68 20   planner search 
12ec0 6c 69 6d 69 74 20 2a 2f 0a 20 20 69 66 28 20 70  limit */.  if( p
12ed0 42 75 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c 69  Builder->iPlanLi
12ee0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 57 48  mit==0 ){.    WH
12ef0 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 66  ERETRACE(0xfffff
12f00 66 66 66 2c 28 22 3d 3d 3d 20 71 75 65 72 79 20  fff,("=== query 
12f10 70 6c 61 6e 6e 65 72 20 73 65 61 72 63 68 20 6c  planner search l
12f20 69 6d 69 74 20 72 65 61 63 68 65 64 20 3d 3d 3d  imit reached ===
12f30 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28 20 70  \n"));.    if( p
12f40 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
12f50 29 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  ) pBuilder->pOrS
12f60 65 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 72  et->n = 0;.    r
12f70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
12f80 45 3b 0a 20 20 7d 0a 20 20 70 42 75 69 6c 64 65  E;.  }.  pBuilde
12f90 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 2d 2d 3b  r->iPlanLimit--;
12fa0 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64  ..  /* If pBuild
12fb0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65  er->pOrSet is de
12fc0 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79  fined, then only
12fd0 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   keep track of t
12fe0 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e  he costs.  ** an
12ff0 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a  d prereqs..  */.
13000 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
13010 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20 20 20  pOrSet!=0 ){.   
13020 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e   if( pTemplate->
13030 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20 57 48  nLTerm ){.#if WH
13040 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
13050 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d 20 70  .      u16 n = p
13060 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d  Builder->pOrSet-
13070 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  >n;.      int x 
13080 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77  =.#endif.      w
13090 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75  hereOrInsert(pBu
130a0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70  ilder->pOrSet, p
130b0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
130c0 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  , pTemplate->rRu
130d0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130f0 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
13100 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45  ->nOut);.#if WHE
13110 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
13120 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
13130 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
13140 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
13150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
13160 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20  bugPrintf(x?"   
13170 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72  or-%d:  ":"   or
13180 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20  -X:  ", n);.    
13190 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
131a0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
131b0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
131c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
131d0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
131e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
131f0 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65  /* Look for an e
13200 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
13210 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74  p to replace wit
13220 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f  h pTemplate.  */
13230 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75  .  whereLoopAdju
13240 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70  stCost(pWInfo->p
13250 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
13260 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68  );.  ppPrev = wh
13270 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
13280 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  r(&pWInfo->pLoop
13290 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a  s, pTemplate);..
132a0 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20    if( ppPrev==0 
132b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
132c0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
132d0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68   WhereLoop on th
132e0 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 62  e list that is b
132f0 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  etter.    ** tha
13300 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20  n pTemplate, so 
13310 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d  just ignore pTem
13320 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45  plate */.#if WHE
13330 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
13340 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66  /* 0x8 */.    if
13350 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
13360 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
13370 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
13380 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70 3a 20  rintf("   skip: 
13390 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  ");.      whereL
133a0 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
133b0 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
133c0 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
133d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
133e0 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65  TE_OK;  .  }else
133f0 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65  {.    p = *ppPre
13400 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  v;.  }..  /* If 
13410 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
13420 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61  int it means tha
13430 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f  t either p[] sho
13440 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74  uld be overwritt
13450 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65  en.  ** with pTe
13460 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20  mplate[] if p[] 
13470 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d  exists, or if p=
13480 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63  =NULL then alloc
13490 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57  ate a new.  ** W
134a0 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73  hereLoop and ins
134b0 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66  ert it..  */.#if
134c0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
134d0 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
134e0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
134f0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
13500 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20     if( p!=0 ){. 
13510 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
13520 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61 63 65  gPrintf("replace
13530 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
13540 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42  eLoopPrint(p, pB
13550 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
13560 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
13570 50 72 69 6e 74 66 28 22 20 20 20 77 69 74 68 3a  Printf("   with:
13580 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ");.    }else{.
13590 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
135a0 75 67 50 72 69 6e 74 66 28 22 20 20 20 20 61 64  ugPrintf("    ad
135b0 64 3a 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  d: ");.    }.   
135c0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
135d0 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
135e0 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23  der->pWC);.  }.#
135f0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30  endif.  if( p==0
13600 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63   ){.    /* Alloc
13610 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ate a new WhereL
13620 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68  oop to add to th
13630 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73  e end of the lis
13640 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76  t */.    *ppPrev
13650 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62   = p = sqlite3Db
13660 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
13670 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
13680 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  ));.    if( p==0
13690 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
136a0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
136b0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
136c0 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c  );.    p->pNextL
136d0 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  oop = 0;.  }else
136e0 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c  {.    /* We will
136f0 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20   be overwriting 
13700 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20  WhereLoop p[].  
13710 42 75 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f  But before we do
13720 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67  , first.    ** g
13730 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65  o through the re
13740 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61  st of the list a
13750 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74  nd delete any ot
13760 68 65 72 20 65 6e 74 72 69 65 73 20 62 65 73 69  her entries besi
13770 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74  des.    ** p[] t
13780 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70  hat are also sup
13790 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c  plated by pTempl
137a0 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ate */.    Where
137b0 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20  Loop **ppTail = 
137c0 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20  &p->pNextLoop;. 
137d0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54     WhereLoop *pT
137e0 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  oDel;.    while(
137f0 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20   *ppTail ){.    
13800 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65    ppTail = where
13810 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70  LoopFindLesser(p
13820 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65  pTail, pTemplate
13830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70 54  );.      if( ppT
13840 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ail==0 ) break;.
13850 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a        pToDel = *
13860 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66  ppTail;.      if
13870 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72  ( pToDel==0 ) br
13880 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61  eak;.      *ppTa
13890 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65  il = pToDel->pNe
138a0 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52  xtLoop;.#if WHER
138b0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
138c0 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69  * 0x8 */.      i
138d0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
138e0 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
138f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
13900 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74  ugPrintf(" delet
13910 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77  e: ");.        w
13920 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
13930 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e  oDel, pBuilder->
13940 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  pWC);.      }.#e
13950 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72 65  ndif.      where
13960 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70  LoopDelete(db, p
13970 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  ToDel);.    }.  
13980 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f  }.  rc = whereLo
13990 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54  opXfer(db, p, pT
139a0 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20  emplate);.  if( 
139b0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
139c0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
139d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65  )==0 ){.    Inde
139e0 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75  x *pIndex = p->u
139f0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
13a00 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
13a10 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30   pIndex->tnum==0
13a20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62   ){.      p->u.b
13a30 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
13a40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13a50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13a60 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72   Adjust the Wher
13a70 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65  eLoop.nOut value
13a80 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63   downward to acc
13a90 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f  ount for terms o
13aa0 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  f the.** WHERE c
13ab0 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72  lause that refer
13ac0 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75  ence the loop bu
13ad0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
13ae0 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e  used by an.** in
13af0 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76  dex..*.** For ev
13b00 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
13b10 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f   term that is no
13b20 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  t used by the in
13b30 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68  dex.** and which
13b40 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72 6f   has a truth pro
13b50 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65  bability assigne
13b60 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  d by one of the 
13b70 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a  likelihood(),.**
13b80 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e   likely(), or un
13b90 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e  likely() SQL fun
13ba0 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74  ctions, reduce t
13bb0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
13bc0 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74  ber.** of output
13bd0 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f   rows by the pro
13be0 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66 69  bability specifi
13bf0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47  ed..**.** TUNING
13c00 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48 45  :  For every WHE
13c10 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
13c20 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  hat is not used 
13c30 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  by the index.** 
13c40 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e  and which does n
13c50 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67  ot have an assig
13c60 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61 62  ned truth probab
13c70 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69 63  ility, heuristic
13c80 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62  s.** described b
13c90 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f  elow are used to
13ca0 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65   try to estimate
13cb0 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61   the truth proba
13cc0 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20  bility..** TODO 
13cd0 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69 73  --> Perhaps this
13ce0 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   is something th
13cf0 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72  at could be impr
13d00 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a  oved by better.*
13d10 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69  * table statisti
13d20 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  cs..**.** Heuris
13d30 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65  tic 1:  Estimate
13d40 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61   the truth proba
13d50 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25  bility as 93.75%
13d60 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a  .  The 93.75%.**
13d70 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e   value correspon
13d80 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45  ds to -1 in LogE
13d90 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20  st notation, so 
13da0 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65  this means decre
13db0 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72  ment.** the Wher
13dc0 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64  eLoop.nOut field
13dd0 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68 20   for every such 
13de0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
13df0 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74  m..**.** Heurist
13e00 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65 20  ic 2:  If there 
13e10 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f  exists one or mo
13e20 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
13e30 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
13e40 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61  form "x==EXPR" a
13e50 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61  nd EXPR is not a
13e60 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31   constant 0 or 1
13e70 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
13e80 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75   the.** final ou
13e90 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74  tput row estimat
13ea0 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20  e is no greater 
13eb0 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20  than 1/4 of the 
13ec0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20  total number.** 
13ed0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
13ee0 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  able.  In other 
13ef0 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68  words, assume th
13f00 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20  at x==EXPR will 
13f10 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74  filter.** out at
13f20 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20   least 3 out of 
13f30 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52  4 rows.  If EXPR
13f40 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31   is -1 or 0 or 1
13f50 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65  , then maybe the
13f60 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69  .** "x" column i
13f70 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73  s boolean or els
13f80 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69  e -1 or 0 or 1 i
13f90 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75  s a common defau
13fa0 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74  lt value.** on t
13fb0 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e  he "x" column an
13fc0 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  d so in that cas
13fd0 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f  e only cap the o
13fe0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
13ff0 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73  te.** at 1/2 ins
14000 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a  tead of 1/4..*/.
14010 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
14020 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
14030 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  t(.  WhereClause
14040 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54   *pWC,      /* T
14050 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
14060 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
14070 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54  pLoop,      /* T
14080 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73  he loop to adjus
14090 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20  t downward */.  
140a0 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20  LogEst nRow     
140b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
140c0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
140d0 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a  entire table */.
140e0 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
140f0 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69  pTerm, *pX;.  Bi
14100 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64  tmask notAllowed
14110 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72   = ~(pLoop->prer
14120 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  eq|pLoop->maskSe
14130 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  lf);.  int i, j,
14140 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65   k;.  LogEst iRe
14150 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20  duce = 0;    /* 
14160 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75  pLoop->nOut shou
14170 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52  ld not exceed nR
14180 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20  ow-iReduce */.. 
14190 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
141a0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
141b0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20  _AUTO_INDEX)==0 
141c0 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  );.  for(i=pWC->
141d0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43  nTerm, pTerm=pWC
141e0 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
141f0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
14200 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
14210 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
14220 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
14230 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
14240 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
14250 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63  maskSelf)==0 ) c
14260 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
14270 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
14280 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29  ll & notAllowed)
14290 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
142a0 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d      for(j=pLoop-
142b0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
142c0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20   j--){.      pX 
142d0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
142e0 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  j];.      if( pX
142f0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
14300 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54        if( pX==pT
14310 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
14320 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65     if( pX->iPare
14330 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e  nt>=0 && (&pWC->
14340 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d  a[pX->iParent])=
14350 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
14360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
14370 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
14380 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
14390 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
143a0 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f 62   If a truth prob
143b0 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63 69  ability is speci
143c0 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c  fied using the l
143d0 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74  ikelihood() hint
143e0 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  s,.        ** th
143f0 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62 61  en use the proba
14400 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20  bility provided 
14410 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
14420 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
14430 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54  Loop->nOut += pT
14440 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
14450 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14460 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61       /* In the a
14470 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63  bsence of explic
14480 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  it truth probabi
14490 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75 72  lities, use heur
144a0 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20  istics to.      
144b0 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61    ** guess a rea
144c0 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72  sonable truth pr
144d0 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20  obability. */.  
144e0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
144f0 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t--;.        if(
14500 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14510 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  r&(WO_EQ|WO_IS) 
14520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
14530 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72  r *pRight = pTer
14540 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
14550 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
14560 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
14570 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
14580 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
14590 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
145a0 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20  ger(pRight, &k) 
145b0 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c  && k>=(-1) && k<
145c0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
145d0 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20    k = 10;.      
145e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
145f0 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20         k = 20;. 
14600 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14610 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63 65       if( iReduce
14620 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b  <k ) iReduce = k
14630 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14640 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
14650 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  if( pLoop->nOut 
14660 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29  > nRow-iReduce )
14670 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
14680 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a  nRow - iReduce;.
14690 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70  }../* .** Term p
146a0 54 65 72 6d 20 69 73 20 61 20 76 65 63 74 6f 72  Term is a vector
146b0 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f   range compariso
146c0 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  n operation. The
146d0 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
146e0 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65 63 74  n.** in the vect
146f0 6f 72 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  or can be optimi
14700 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  zed using column
14710 20 6e 45 71 20 6f 66 20 74 68 65 20 69 6e 64 65   nEq of the inde
14720 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  x. This.** funct
14730 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
14740 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
14750 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20  vector elements 
14760 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
14770 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74  .** as part of t
14780 68 65 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69  he range compari
14790 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  son..**.** For e
147a0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
147b0 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
147c0 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
147d0 20 28 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c   (b, c, d) > (?,
147e0 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64   ?, ?).**.** and
147f0 20 74 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a   the index:.**.*
14800 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
14810 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63   ... ON (a, b, c
14820 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68  , d, e).**.** th
14830 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
14840 20 77 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65   would be invoke
14850 64 20 77 69 74 68 20 6e 45 71 3d 31 2e 20 54 68  d with nEq=1. Th
14860 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
14870 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65   in.** this case
14880 20 69 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   is 3..*/.static
14890 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 56   int whereRangeV
148a0 65 63 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72 73  ectorLen(.  Pars
148b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
148c0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
148d0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ext */.  int iCu
148e0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
148f0 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
14900 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
14910 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f  *pIdx,         /
14920 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
14930 65 20 75 73 65 64 20 66 6f 72 20 61 20 69 6e 65  e used for a ine
14940 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
14950 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c  nt */.  int nEq,
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14970 4e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20  Number of prior 
14980 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
14990 69 6e 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e 64  ints on same ind
149a0 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
149b0 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a 20  m *pTerm     /* 
149c0 54 68 65 20 76 65 63 74 6f 72 20 69 6e 65 71 75  The vector inequ
149d0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
149e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
149f0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  p = sqlite3ExprV
14a00 65 63 74 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d  ectorSize(pTerm-
14a10 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
14a20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70    int i;..  nCmp
14a30 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49   = MIN(nCmp, (pI
14a40 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45  dx->nColumn - nE
14a50 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  q));.  for(i=1; 
14a60 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCmp; i++){.  
14a70 20 20 2f 2a 20 54 65 73 74 20 69 66 20 63 6f 6d    /* Test if com
14a80 70 61 72 69 73 6f 6e 20 69 20 6f 66 20 70 54 65  parison i of pTe
14a90 72 6d 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  rm is compatible
14aa0 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b   with column (i+
14ab0 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20  nEq) .    ** of 
14ac0 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f  the index. If no
14ad0 74 2c 20 65 78 69 74 20 74 68 65 20 6c 6f 6f 70  t, exit the loop
14ae0 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61  .  */.    char a
14af0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
14b00 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
14b10 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a  rison affinity *
14b20 2f 0a 20 20 20 20 63 68 61 72 20 69 64 78 61 66  /.    char idxaf
14b30 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
14b40 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64 20 63      /* Indexed c
14b50 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
14b60 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
14b70 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
14b80 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
14b90 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  on collation seq
14ba0 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78 70  uence */.    Exp
14bb0 72 20 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d  r *pLhs = pTerm-
14bc0 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78  >pExpr->pLeft->x
14bd0 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
14be0 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  pr;.    Expr *pR
14bf0 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  hs = pTerm->pExp
14c00 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69  r->pRight;.    i
14c10 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
14c20 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b   EP_xIsSelect ){
14c30 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52  .      pRhs = pR
14c40 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  hs->x.pSelect->p
14c50 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
14c60 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
14c70 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d      pRhs = pRhs-
14c80 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
14c90 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Expr;.    }..   
14ca0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
14cb0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 63 6f  he LHS of the co
14cc0 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
14cd0 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 74  lumn reference t
14ce0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  o.    ** the rig
14cf0 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ht column of the
14d00 20 72 69 67 68 74 20 73 6f 75 72 63 65 20 74 61   right source ta
14d10 62 6c 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68  ble. And that th
14d20 65 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f 72  e sort.    ** or
14d30 64 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  der of the index
14d40 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 73   column is the s
14d50 61 6d 65 20 61 73 20 74 68 65 20 73 6f 72 74 20  ame as the sort 
14d60 6f 72 64 65 72 20 6f 66 20 74 68 65 0a 20 20 20  order of the.   
14d70 20 2a 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e 64   ** leftmost ind
14d80 65 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20  ex column.  */. 
14d90 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21     if( pLhs->op!
14da0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20  =TK_COLUMN .    
14db0 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65   || pLhs->iTable
14dc0 21 3d 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20  !=iCur .     || 
14dd0 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  pLhs->iColumn!=p
14de0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b  Idx->aiColumn[i+
14df0 6e 45 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70 49  nEq] .     || pI
14e00 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
14e10 2b 6e 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53 6f  +nEq]!=pIdx->aSo
14e20 72 74 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20 20  rtOrder[nEq].   
14e30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
14e40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74  .    }..    test
14e50 63 61 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f 6c  case( pLhs->iCol
14e60 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 3b  umn==XN_ROWID );
14e70 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
14e80 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
14e90 79 28 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45  y(pRhs, sqlite3E
14ea0 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73  xprAffinity(pLhs
14eb0 29 29 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d  ));.    idxaff =
14ec0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
14ed0 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 49 64 78  umnAffinity(pIdx
14ee0 2d 3e 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d 3e  ->pTable, pLhs->
14ef0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66  iColumn);.    if
14f00 28 20 61 66 66 21 3d 69 64 78 61 66 66 20 29 20  ( aff!=idxaff ) 
14f10 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c  break;..    pCol
14f20 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
14f30 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
14f40 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52  pParse, pLhs, pR
14f50 68 73 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  hs);.    if( pCo
14f60 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ll==0 ) break;. 
14f70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
14f80 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
14f90 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
14fa0 5b 69 2b 6e 45 71 5d 29 20 29 20 62 72 65 61 6b  [i+nEq]) ) break
14fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
14fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
14fd0 74 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20  t the cost C by 
14fe0 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63  the costMult fac
14ff0 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c  ter T.  This onl
15000 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63  y occurs if.** c
15010 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53  ompiled with -DS
15020 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
15030 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20  TMULT.*/.#ifdef 
15040 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
15050 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20  STMULT.# define 
15060 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
15070 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54  ier(C,T)  C += T
15080 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15090 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
150a0 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a  ier(C,T).#endif.
150b0 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73  ./*.** We have s
150c0 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42  o far matched pB
150d0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
150e0 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20  btree.nEq terms 
150f0 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78  of the .** index
15100 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20   pIndex. Try to 
15110 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a  match one more..
15120 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
15130 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15140 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  ed, pBuilder->pN
15150 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e  ew->nOut contain
15160 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72  s the .** number
15170 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
15180 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20  d to be visited 
15190 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69  by filtering usi
151a0 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74  ng the nEq .** t
151b0 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74  erms only. If it
151c0 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68   is modified, th
151d0 69 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74  is value is rest
151e0 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  ored before this
151f0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
15200 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  turns..**.** If 
15210 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c  pProbe->tnum==0,
15220 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64   that means pInd
15230 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64  ex is a fake ind
15240 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a  ex used for the.
15250 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
15260 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69  RY KEY..*/.stati
15270 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
15280 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20  ddBtreeIndex(.  
15290 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
152a0 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20   *pBuilder,     
152b0 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
152c0 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74   factory */.  st
152d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
152e0 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a  m *pSrc,      /*
152f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
15300 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  m being analyzed
15310 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
15320 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  obe,            
15330 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
15340 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c  x on pSrc */.  L
15350 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20  ogEst nInMul    
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15370 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20  * log(Number of 
15380 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74  iterations due t
15390 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68  o IN) */.){.  Wh
153a0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
153b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
153c0 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e  fo;  /* WHERE an
153d0 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  alyse context */
153e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
153f0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
15400 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e;        /* Par
15410 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15420 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15430 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
15440 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
15450 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20  nnection malloc 
15460 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
15470 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15490 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
154a0 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  op under constru
154b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ction */.  Where
154c0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
154d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
154e0 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20  WhereTerm under 
154f0 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f  consideration */
15500 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20  .  int opMask;  
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72     /* Valid oper
15530 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72  ators for constr
15540 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  aints */.  Where
15550 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20  Scan scan;      
15560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
15570 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45  erator for WHERE
15580 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
15590 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71  ask saved_prereq
155a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
155b0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
155c0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f   pNew->prereq */
155d0 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54  .  u16 saved_nLT
155e0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
155f0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
15600 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c  alue of pNew->nL
15610 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61  Term */.  u16 sa
15620 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20  ved_nEq;        
15630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
15640 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
15650 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
15660 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
15670 6e 42 74 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nBtm;           
15680 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
15690 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
156a0 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 2a 2f  >u.btree.nBtm */
156b0 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 54 6f  .  u16 saved_nTo
156c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
156d0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
156e0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e  alue of pNew->u.
156f0 62 74 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a 20 20  btree.nTop */.  
15700 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b  u16 saved_nSkip;
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 6e 53 6b 69 70  e of pNew->nSkip
15740 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f   */.  u32 saved_
15750 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wsFlags;        
15760 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
15770 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
15780 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f  >wsFlags */.  Lo
15790 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b  gEst saved_nOut;
157a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
157b0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
157c0 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f  of pNew->nOut */
157d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
157e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
157f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
15800 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53  e */.  LogEst rS
15810 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
15820 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15830 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
15840 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  table */.  LogEs
15850 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20  t rLogSize;     
15860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15870 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65  garithm of table
15880 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65   size */.  Where
15890 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20  Term *pTop = 0, 
158a0 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f  *pBtm = 0; /* To
158b0 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e  p and bottom ran
158c0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ge constraints *
158d0 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  /..  pNew = pBui
158e0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66  lder->pNew;.  if
158f0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
15900 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
15910 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
15920 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
15930 30 2c 20 28 22 42 45 47 49 4e 20 25 73 2e 61 64  0, ("BEGIN %s.ad
15940 64 42 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e  dBtreeIdx(%s), n
15950 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  Eq=%d\n",.      
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15970 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 7a  Probe->pTable->z
15980 4e 61 6d 65 2c 70 50 72 6f 62 65 2d 3e 7a 4e 61  Name,pProbe->zNa
15990 6d 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  me, pNew->u.btre
159a0 65 2e 6e 45 71 29 29 3b 0a 0a 20 20 61 73 73 65  e.nEq));..  asse
159b0 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
159c0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
159d0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
159e0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
159f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15a00 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
15a10 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
15a20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
15a30 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
15a40 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
15a50 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LE;.  }else{.   
15a60 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75   assert( pNew->u
15a70 2e 62 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29  .btree.nBtm==0 )
15a80 3b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  ;.    opMask = W
15a90 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54  O_EQ|WO_IN|WO_GT
15aa0 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
15ab0 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  LE|WO_ISNULL|WO_
15ac0 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  IS;.  }.  if( pP
15ad0 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
15ae0 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57   ) opMask &= ~(W
15af0 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
15b00 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65  |WO_LE);..  asse
15b10 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  rt( pNew->u.btre
15b20 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43  e.nEq<pProbe->nC
15b30 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65  olumn );..  save
15b40 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e  d_nEq = pNew->u.
15b50 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76  btree.nEq;.  sav
15b60 65 64 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e  ed_nBtm = pNew->
15b70 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20  u.btree.nBtm;.  
15b80 73 61 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65  saved_nTop = pNe
15b90 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b  w->u.btree.nTop;
15ba0 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d  .  saved_nSkip =
15bb0 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20   pNew->nSkip;.  
15bc0 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70  saved_nLTerm = p
15bd0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73  New->nLTerm;.  s
15be0 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70  aved_wsFlags = p
15bf0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  New->wsFlags;.  
15c00 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70  saved_prereq = p
15c10 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73  New->prereq;.  s
15c20 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77  aved_nOut = pNew
15c30 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20  ->nOut;.  pTerm 
15c40 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
15c50 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
15c60 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
15c70 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a  sor, saved_nEq,.
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20          opMask, 
15ca0 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d  pProbe);.  pNew-
15cb0 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72  >rSetup = 0;.  r
15cc0 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Size = pProbe->a
15cd0 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20  iRowLogEst[0];. 
15ce0 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
15cf0 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72  og(rSize);.  for
15d00 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
15d10 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54   && pTerm!=0; pT
15d20 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e  erm = whereScanN
15d30 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20  ext(&scan)){.   
15d40 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d   u16 eOp = pTerm
15d50 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f  ->eOperator;   /
15d60 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
15d70 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
15d80 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72   */.    LogEst r
15d90 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67  CostIdx;.    Log
15da0 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74  Est nOutUnadjust
15db0 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f  ed;        /* nO
15dc0 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61  ut before IN() a
15dd0 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d  nd WHERE adjustm
15de0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
15df0 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  nIn = 0;.#ifdef 
15e00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
15e10 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
15e20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
15e30 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
15e40 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20  alid;.#endif.   
15e50 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53   if( (eOp==WO_IS
15e60 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e  NULL || (pTerm->
15e70 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55  wtFlags&TERM_VNU
15e80 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  LL)!=0).     && 
15e90 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75  indexColumnNotNu
15ea0 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64  ll(pProbe, saved
15eb0 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  _nEq).    ){.   
15ec0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
15ed0 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
15ee0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
15ef0 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
15f00 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
15f10 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
15f20 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
15f30 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
15f40 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
15f50 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75   not allow the u
15f60 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20  pper bound of a 
15f70 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
15f80 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  n range constrai
15f90 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78  nt.    ** to mix
15fa0 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61   with a lower ra
15fb0 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73  nge bound from s
15fc0 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65  ome other source
15fd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
15fe0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
15ff0 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65  M_LIKEOPT && pTe
16000 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
16010 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b  O_LT ) continue;
16020 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  ..    /* Do not 
16030 61 6c 6c 6f 77 20 63 6f 6e 73 74 72 61 69 6e 74  allow constraint
16040 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45 52 45  s from the WHERE
16050 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73   clause to be us
16060 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  ed by the.    **
16070 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
16080 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f 6e  a LEFT JOIN.  On
16090 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  ly constraints i
160a0 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  n the ON clause 
160b0 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 77  are.    ** allow
160c0 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70  ed */.    if( (p
160d0 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  Src->fg.jointype
160e0 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20   & JT_LEFT)!=0. 
160f0 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
16100 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
16110 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
16120 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
16130 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
16140 0a 20 20 20 20 69 66 28 20 49 73 55 6e 69 71 75  .    if( IsUniqu
16150 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29 20 26  eIndex(pProbe) &
16160 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72  & saved_nEq==pPr
16170 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 29  obe->nKeyCol-1 )
16180 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  {.      pBuilder
16190 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51  ->bldFlags |= SQ
161a0 4c 49 54 45 5f 42 4c 44 46 5f 55 4e 49 51 55 45  LITE_BLDF_UNIQUE
161b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
161c0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64     pBuilder->bld
161d0 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
161e0 42 4c 44 46 5f 49 4e 44 45 58 45 44 3b 0a 20 20  BLDF_INDEXED;.  
161f0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73    }.    pNew->ws
16200 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
16210 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d  Flags;.    pNew-
16220 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
16230 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
16240 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
16250 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20   = saved_nBtm;. 
16260 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
16270 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54  .nTop = saved_nT
16280 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  op;.    pNew->nL
16290 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
162a0 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65  erm;.    if( whe
162b0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
162c0 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
162d0 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20  erm+1) ) break; 
162e0 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e  /* OOM */.    pN
162f0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
16300 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65  >nLTerm++] = pTe
16310 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  rm;.    pNew->pr
16320 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72  ereq = (saved_pr
16330 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
16340 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
16350 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20  ew->maskSelf;.. 
16360 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75     assert( nInMu
16370 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20  l==0.        || 
16380 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
16390 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
163a0 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LL)!=0 .        
163b0 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
163c0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
163d0 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20  _IN)!=0 .       
163e0 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
163f0 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
16400 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a  CAN)!=0 .    );.
16410 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57  .    if( eOp & W
16420 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
16430 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
16440 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
16450 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
16460 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
16470 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
16480 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45      /* "x IN (SE
16490 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e  LECT ...)":  TUN
164a0 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20  ING: the SELECT 
164b0 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
164c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
164d0 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  ;.        nIn = 
164e0 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  46;  assert( 46=
164f0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
16500 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  5) );..        /
16510 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
16520 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
16530 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 78 2c   of the form (x,
16540 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e   y) IN (SELECT..
16550 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  .)..        ** I
16560 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
16570 65 20 69 73 20 61 20 73 65 70 61 72 61 74 65 20  e is a separate 
16580 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20 6f 66  term for each of
16590 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a 20 20   (x) and (y)..  
165a0 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
165b0 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74 69 70  , the nIn multip
165c0 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  lier should only
165d0 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e 63 65   be applied once
165e0 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20 20 20  , not once.     
165f0 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20 73     ** for each s
16600 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20 66 6f  uch term. The fo
16610 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 68 65  llowing loop che
16620 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d 20 69  cks that pTerm i
16630 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
16640 20 66 69 72 73 74 20 73 75 63 68 20 74 65 72 6d   first such term
16650 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73 65 74   in use, and set
16660 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20 30 20  s nIn back to 0 
16670 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f  if it is not. */
16680 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
16690 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ; i<pNew->nLTerm
166a0 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
166b0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 4c      if( pNew->aL
166c0 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65 77 2d  Term[i] && pNew-
166d0 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70  >aLTerm[i]->pExp
166e0 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e 20 3d  r==pExpr ) nIn =
166f0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
16700 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
16710 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
16720 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
16730 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
16740 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
16750 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
16760 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
16770 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c    nIn = sqlite3L
16780 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70  ogEst(pExpr->x.p
16790 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
167a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 49        assert( nI
167b0 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61  n>0 );  /* RHS a
167c0 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d  lways has 2 or m
167d0 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68  ore terms...  Th
167e0 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20 20  e parser.       
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78     ** changes "x
16810 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78   IN (?)" into "x
16820 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  =?". */.      }.
16830 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62 65        if( pProbe
16840 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a 20 20  ->hasStat1 ){.  
16850 20 20 20 20 20 20 4c 6f 67 45 73 74 20 4d 2c 20        LogEst M, 
16860 6c 6f 67 4b 2c 20 73 61 66 65 74 79 4d 61 72 67  logK, safetyMarg
16870 69 6e 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c  in;.        /* L
16880 65 74 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  et:.        **  
16890 20 4e 20 3d 20 74 68 65 20 74 6f 74 61 6c 20 6e   N = the total n
168a0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
168b0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20   the table.     
168c0 20 20 20 2a 2a 20 20 20 4b 20 3d 20 74 68 65 20     **   K = the 
168d0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
168e0 73 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  s on the RHS of 
168f0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
16900 20 20 20 20 20 20 20 20 2a 2a 20 20 20 4d 20 3d          **   M =
16910 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16920 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
16930 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
16940 73 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20  s to the .      
16950 20 20 2a 2a 20 20 20 20 20 20 20 74 6f 20 74 68    **       to th
16960 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 73 61  e left in the sa
16970 6d 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  me index.  If th
16980 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
16990 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   on.        **  
169a0 20 20 20 20 20 74 68 65 20 6c 65 66 74 2d 6d 6f       the left-mo
169b0 73 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 2c  st index column,
169c0 20 4d 3d 3d 4e 2e 0a 20 20 20 20 20 20 20 20 2a   M==N..        *
169d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 69 76  *.        ** Giv
169e0 65 6e 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  en the definitio
169f0 6e 73 20 61 62 6f 76 65 2c 20 69 74 20 69 73 20  ns above, it is 
16a00 62 65 74 74 65 72 20 74 6f 20 6f 6d 69 74 20 74  better to omit t
16a10 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20  he IN operator. 
16a20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74         ** from t
16a30 68 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  he index lookup 
16a40 61 6e 64 20 69 6e 73 74 65 61 64 20 64 6f 20 61  and instead do a
16a50 20 73 63 61 6e 20 6f 66 20 74 68 65 20 4d 20 65   scan of the M e
16a60 6c 65 6d 65 6e 74 73 2c 0a 20 20 20 20 20 20 20  lements,.       
16a70 20 2a 2a 20 74 65 73 74 69 6e 67 20 65 61 63 68   ** testing each
16a80 20 73 63 61 6e 6e 65 64 20 72 6f 77 20 61 67 61   scanned row aga
16a90 69 6e 73 74 20 74 68 65 20 49 4e 20 6f 70 65 72  inst the IN oper
16aa0 61 74 6f 72 20 73 65 70 61 72 61 74 65 6c 79 2c  ator separately,
16ab0 20 69 66 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a   if:.        **.
16ac0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
16ad0 20 20 4d 2a 6c 6f 67 28 4b 29 20 3c 20 4b 2a 6c    M*log(K) < K*l
16ae0 6f 67 28 4e 29 0a 20 20 20 20 20 20 20 20 2a 2a  og(N).        **
16af0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 75 72 20  .        ** Our 
16b00 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 4d 2c  estimates for M,
16b10 20 4b 2c 20 61 6e 64 20 4e 20 6d 69 67 68 74 20   K, and N might 
16b20 62 65 20 69 6e 61 63 63 75 72 61 74 65 2c 20 73  be inaccurate, s
16b30 6f 20 77 65 20 62 75 69 6c 64 20 69 6e 0a 20 20  o we build in.  
16b40 20 20 20 20 20 20 2a 2a 20 61 20 73 61 66 65 74        ** a safet
16b50 79 20 6d 61 72 67 69 6e 20 6f 66 20 32 20 28 4c  y margin of 2 (L
16b60 6f 67 45 73 74 3a 20 31 30 29 20 74 68 61 74 20  ogEst: 10) that 
16b70 66 61 76 6f 72 73 20 75 73 69 6e 67 20 74 68 65  favors using the
16b80 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20 20   IN operator.   
16b90 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65       ** with the
16ba0 20 69 6e 64 65 78 2c 20 61 73 20 75 73 69 6e 67   index, as using
16bb0 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20 62 65   an index has be
16bc0 74 74 65 72 20 77 6f 72 73 74 2d 63 61 73 65 20  tter worst-case 
16bd0 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 20 20  behavior..      
16be0 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f    ** If we do no
16bf0 74 20 68 61 76 65 20 72 65 61 6c 20 73 71 6c 69  t have real sqli
16c00 74 65 5f 73 74 61 74 31 20 64 61 74 61 2c 20 61  te_stat1 data, a
16c10 6c 77 61 79 73 20 70 72 65 66 65 72 20 74 6f 20  lways prefer to 
16c20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
16c30 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
16c40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 20 3d    */.        M =
16c50 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
16c60 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 3b  gEst[saved_nEq];
16c70 0a 20 20 20 20 20 20 20 20 6c 6f 67 4b 20 3d 20  .        logK = 
16c80 65 73 74 4c 6f 67 28 6e 49 6e 29 3b 0a 20 20 20  estLog(nIn);.   
16c90 20 20 20 20 20 73 61 66 65 74 79 4d 61 72 67 69       safetyMargi
16ca0 6e 20 3d 20 31 30 3b 20 20 2f 2a 20 54 55 4e 49  n = 10;  /* TUNI
16cb0 4e 47 3a 20 65 78 74 72 61 20 77 65 69 67 68 74  NG: extra weight
16cc0 20 66 6f 72 20 69 6e 64 65 78 65 64 20 49 4e 20   for indexed IN 
16cd0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d  */.        if( M
16ce0 20 2b 20 6c 6f 67 4b 20 2b 20 73 61 66 65 74 79   + logK + safety
16cf0 4d 61 72 67 69 6e 20 3c 20 6e 49 6e 20 2b 20 72  Margin < nIn + r
16d00 4c 6f 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  LogSize ){.     
16d10 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
16d20 30 78 34 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0x40,.          
16d30 20 20 28 22 53 63 61 6e 20 70 72 65 66 65 72 72    ("Scan preferr
16d40 65 64 20 6f 76 65 72 20 49 4e 20 6f 70 65 72 61  ed over IN opera
16d50 74 6f 72 20 6f 6e 20 63 6f 6c 75 6d 6e 20 25 64  tor on column %d
16d60 20 6f 66 20 5c 22 25 73 5c 22 20 28 25 64 3c 25   of \"%s\" (%d<%
16d70 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  d)\n",.         
16d80 20 20 20 20 73 61 76 65 64 5f 6e 45 71 2c 20 70      saved_nEq, p
16d90 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 4d 2b  Probe->zName, M+
16da0 6c 6f 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72 4c 6f  logK+10, nIn+rLo
16db0 67 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  gSize));.       
16dc0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
16dd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16de0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
16df0 28 30 78 34 30 2c 0a 20 20 20 20 20 20 20 20 20  (0x40,.         
16e00 20 20 20 28 22 49 4e 20 6f 70 65 72 61 74 6f 72     ("IN operator
16e10 20 70 72 65 66 65 72 72 65 64 20 6f 6e 20 63 6f   preferred on co
16e20 6c 75 6d 6e 20 25 64 20 6f 66 20 5c 22 25 73 5c  lumn %d of \"%s\
16e30 22 20 28 25 64 3e 3d 25 64 29 5c 6e 22 2c 0a 20  " (%d>=%d)\n",. 
16e40 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65              save
16e50 64 5f 6e 45 71 2c 20 70 50 72 6f 62 65 2d 3e 7a  d_nEq, pProbe->z
16e60 4e 61 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31 30 2c  Name, M+logK+10,
16e70 20 6e 49 6e 2b 72 4c 6f 67 53 69 7a 65 29 29 3b   nIn+rLogSize));
16e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16e90 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77   }.      pNew->w
16ea0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
16eb0 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 7d  COLUMN_IN;.    }
16ec0 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28  else if( eOp & (
16ed0 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a  WO_EQ|WO_IS) ){.
16ee0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
16ef0 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
16f00 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20  n[saved_nEq];.  
16f10 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
16f20 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
16f30 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73 73 65  N_EQ;.      asse
16f40 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70  rt( saved_nEq==p
16f50 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
16f60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
16f70 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20  ol==XN_ROWID .  
16f80 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30       || (iCol>=0
16f90 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26   && nInMul==0 &&
16fa0 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f   saved_nEq==pPro
16fb0 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20  be->nKeyCol-1). 
16fc0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16fd0 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57  if( iCol==XN_ROW
16fe0 49 44 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 75 6e  ID || pProbe->un
16ff0 69 71 4e 6f 74 4e 75 6c 6c 20 0a 20 20 20 20 20  iqNotNull .     
17000 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e      || (pProbe->
17010 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 50  nKeyCol==1 && pP
17020 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 20 26 26  robe->onError &&
17030 20 65 4f 70 3d 3d 57 4f 5f 45 51 29 20 0a 20 20   eOp==WO_EQ) .  
17040 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
17050 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
17060 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
17070 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
17080 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
17090 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
170a0 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20  E_UNQ_WANTED;.  
170b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
170c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
170d0 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
170e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
170f0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
17100 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  LUMN_NULL;.    }
17110 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28  else if( eOp & (
17120 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a  WO_GT|WO_GE) ){.
17130 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17140 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20  eOp & WO_GT );. 
17150 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
17160 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  Op & WO_GE );.  
17170 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
17180 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
17190 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54  N_RANGE|WHERE_BT
171a0 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  M_LIMIT;.      p
171b0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
171c0 6d 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56 65  m = whereRangeVe
171d0 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20 20  ctorLen(.       
171e0 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63 2d     pParse, pSrc-
171f0 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62 65  >iCursor, pProbe
17200 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54 65  , saved_nEq, pTe
17210 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  rm.      );.    
17220 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a    pBtm = pTerm;.
17230 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a        pTop = 0;.
17240 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
17250 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
17260 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20  LIKEOPT ){.     
17270 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74     /* Range cont
17280 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65  raints that come
17290 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f   from the LIKE o
172a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a  ptimization are.
172b0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
172c0 73 20 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e  s used in pairs.
172d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70   */.        pTop
172e0 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20   = &pTerm[1];.  
172f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
17300 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d  Top-(pTerm->pWC-
17310 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d  >a))<pTerm->pWC-
17320 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  >nTerm );.      
17330 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e    assert( pTop->
17340 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
17350 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20  IKEOPT );.      
17360 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e    assert( pTop->
17370 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54  eOperator==WO_LT
17380 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
17390 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
173a0 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e  db, pNew, pNew->
173b0 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61  nLTerm+1) ) brea
173c0 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20  k; /* OOM */.   
173d0 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
173e0 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b  m[pNew->nLTerm++
173f0 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20  ] = pTop;.      
17400 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
17410 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  |= WHERE_TOP_LIM
17420 49 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  IT;.        pNew
17430 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
17440 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
17460 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c  ert( eOp & (WO_L
17470 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20  T|WO_LE) );.    
17480 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
17490 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20  & WO_LT );.     
174a0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
174b0 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20   WO_LE );.      
174c0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
174d0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
174e0 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  NGE|WHERE_TOP_LI
174f0 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  MIT;.      pNew-
17500 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20  >u.btree.nTop = 
17510 77 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72  whereRangeVector
17520 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  Len(.          p
17530 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75  Parse, pSrc->iCu
17540 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61  rsor, pProbe, sa
17550 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20  ved_nEq, pTerm. 
17560 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 54       );.      pT
17570 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  op = pTerm;.    
17580 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e    pBtm = (pNew->
17590 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
175a0 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a  BTM_LIMIT)!=0 ?.
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175c0 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
175d0 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32  m[pNew->nLTerm-2
175e0 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  ] : 0;.    }..  
175f0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
17600 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73  nt pNew->nOut is
17610 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
17620 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
17630 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  ted to.    ** be
17640 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
17650 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72  index scan befor
17660 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65  e considering te
17670 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65  rm pTerm, or the
17680 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f  .    ** values o
17690 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c  f nIn and nInMul
176a0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
176b0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
176c0 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49  all .    ** "x I
176d0 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72  N(...)" terms ar
176e0 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20  e replaced with 
176f0 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c  "x = ?". This bl
17700 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20  ock updates.    
17710 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
17720 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63  pNew->nOut to ac
17730 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20  count for pTerm 
17740 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e  (but not nIn/nIn
17750 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  Mul).  */.    as
17760 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74  sert( pNew->nOut
17770 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a  ==saved_nOut );.
17780 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
17790 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
177a0 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
177b0 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
177c0 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73  ut using stat3/s
177d0 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69  tat4 data. Or, i
177e0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
177f0 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20  at3/stat4.      
17800 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73  ** data, using s
17810 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61  ome other estima
17820 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68  te.  */.      wh
17830 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
17840 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
17850 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e  , pBtm, pTop, pN
17860 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ew);.    }else{.
17870 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
17880 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ++pNew->u.btree.
17890 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nEq;.      asser
178a0 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e  t( eOp & (WO_ISN
178b0 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  ULL|WO_EQ|WO_IN|
178c0 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20  WO_IS) );..     
178d0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
178e0 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20  Out==saved_nOut 
178f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
17900 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
17910 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f   && pProbe->aiCo
17920 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3e  lumn[saved_nEq]>
17930 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
17940 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f  sert( (eOp & WO_
17950 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b  IN) || nIn==0 );
17960 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17970 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  e( eOp & WO_IN )
17980 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
17990 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nOut += pTerm->t
179a0 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20  ruthProb;.      
179b0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
179c0 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nIn;.      }else
179d0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
179e0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
179f0 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74 52  STAT4.        tR
17a00 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a  owcnt nOut = 0;.
17a10 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d          if( nInM
17a20 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ul==0 .         
17a30 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  && pProbe->nSamp
17a40 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  le .         && 
17a50 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
17a60 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  q<=pProbe->nSamp
17a70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26  leCol.         &
17a80 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  & ((eOp & WO_IN)
17a90 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50  ==0 || !ExprHasP
17aa0 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
17ab0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
17ac0 63 74 29 29 0a 20 20 20 20 20 20 20 20 20 26 26  ct)).         &&
17ad0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
17ae0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
17af0 53 74 61 74 33 34 29 0a 20 20 20 20 20 20 20 20  Stat34).        
17b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
17b10 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
17b20 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
17b30 20 20 20 69 66 28 20 28 65 4f 70 20 26 20 28 57     if( (eOp & (W
17b40 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_EQ|WO_ISNULL|W
17b50 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20 20 20  O_IS))!=0 ){.   
17b60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
17b70 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29  e( eOp & WO_EQ )
17b80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
17b90 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
17ba0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
17bb0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
17bc0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
17be0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
17bf0 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
17c00 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  der, pExpr->pRig
17c10 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  ht, &nOut);.    
17c20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17c30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
17c40 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61  ereInScanEst(pPa
17c50 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
17c60 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26  Expr->x.pList, &
17c70 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
17c80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
17c90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
17ca0 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49  OUND ) rc = SQLI
17cb0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
17cc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17cd0 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20  OK ) break;     
17ce0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74       /* Jump out
17cf0 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f   of the pTerm lo
17d00 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  op */.          
17d10 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20  if( nOut ){.    
17d20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
17d30 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ut = sqlite3LogE
17d40 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  st(nOut);.      
17d50 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
17d60 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20  nOut>saved_nOut 
17d70 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73  ) pNew->nOut = s
17d80 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20  aved_nOut;.     
17d90 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
17da0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
17db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
17dc0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74          if( nOut
17dd0 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  ==0 ).#endif.   
17de0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
17df0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28   pNew->nOut += (
17e00 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
17e10 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62  Est[nEq] - pProb
17e20 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e  e->aiRowLogEst[n
17e30 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  Eq-1]);.        
17e40 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49    if( eOp & WO_I
17e50 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
17e60 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
17e70 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
17e80 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75  ikelihood() valu
17e90 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61  e, assume that a
17ea0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
17eb0 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65   "col IS NULL" e
17ec0 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65  xpression matche
17ed0 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20  s twice as many 
17ee0 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20 20 20  rows .          
17ef0 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e    ** as (col=?).
17f00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17f10 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30  pNew->nOut += 10
17f20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17f30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17f40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
17f50 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68  t rCostIdx to th
17f60 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69  e cost of visiti
17f70 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73  ng selected rows
17f80 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20   in index. Add. 
17f90 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77     ** it to pNew
17fa0 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73  ->rRun, which is
17fb0 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74   currently set t
17fc0 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  o the cost of th
17fd0 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73  e index.    ** s
17fe0 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20  eek only. Then, 
17ff0 69 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e  if this is a non
18000 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c  -covering index,
18010 20 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66   add the cost of
18020 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67  .    ** visiting
18030 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
18040 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f   main table.  */
18050 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20  .    rCostIdx = 
18060 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b  pNew->nOut + 1 +
18070 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
18080 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61  dxRow)/pSrc->pTa
18090 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
180a0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
180b0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
180c0 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64  LogSize, rCostId
180d0 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65  x);.    if( (pNe
180e0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  w->wsFlags & (WH
180f0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
18100 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20  RE_IPK))==0 ){. 
18110 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
18120 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
18130 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  dd(pNew->rRun, p
18140 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b  New->nOut + 16);
18150 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79  .    }.    Apply
18160 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
18170 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62  New->rRun, pProb
18180 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d  e->pTable->costM
18190 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55  ult);..    nOutU
181a0 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77  nadjusted = pNew
181b0 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77  ->nOut;.    pNew
181c0 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c  ->rRun += nInMul
181d0 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77   + nIn;.    pNew
181e0 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c  ->nOut += nInMul
181f0 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72   + nIn;.    wher
18200 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
18210 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  t(pBuilder->pWC,
18220 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
18230 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
18240 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
18250 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66  , pNew);..    if
18260 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
18270 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
18280 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e  ANGE ){.      pN
18290 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
182a0 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65  _nOut;.    }else
182b0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  {.      pNew->nO
182c0 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73  ut = nOutUnadjus
182d0 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ted;.    }..    
182e0 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
182f0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
18300 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26  IMIT)==0.     &&
18310 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
18320 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
18330 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  mn.    ){.      
18340 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
18350 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
18360 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e   pSrc, pProbe, n
18370 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20  InMul+nIn);.    
18380 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  }.    pNew->nOut
18390 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23   = saved_nOut;.#
183a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
183b0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
183c0 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  T4.    pBuilder-
183d0 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65  >nRecValid = nRe
183e0 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20  cValid;.#endif. 
183f0 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65   }.  pNew->prere
18400 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71  q = saved_prereq
18410 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  ;.  pNew->u.btre
18420 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
18430 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  q;.  pNew->u.btr
18440 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f  ee.nBtm = saved_
18450 6e 42 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  nBtm;.  pNew->u.
18460 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76  btree.nTop = sav
18470 65 64 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65 77 2d  ed_nTop;.  pNew-
18480 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
18490 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73  Skip;.  pNew->ws
184a0 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
184b0 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Flags;.  pNew->n
184c0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
184d0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
184e0 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
184f0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20  ..  /* Consider 
18500 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61  using a skip-sca
18510 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
18520 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
18530 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
18540 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
18550 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
18560 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
18570 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61  and if the avera
18580 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  ge.  ** number o
18590 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65  f repeats in the
185a0 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
185b0 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e   is at least 18.
185c0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
185d0 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20  magic number 18 
185e0 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74  is selected on t
185f0 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73 63  he basis that sc
18600 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20  anning 17 rows. 
18610 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c   ** is almost al
18620 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68 61  ways quicker tha
18630 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20  n an index seek 
18640 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20  (even though if 
18650 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  the index.  ** c
18660 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
18670 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20  an 2^17 rows we 
18680 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65  assume otherwise
18690 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20   in other parts 
186a0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  of.  ** the code
186b0 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20  ). And, even if 
186c0 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68  it is not, it sh
186d0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20  ould not be too 
186e0 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20  much slower. .  
186f0 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
18700 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20  hand, the extra 
18710 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20  seeks could end 
18720 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69  up being signifi
18730 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65  cantly.  ** more
18740 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a   expensive.  */.
18750 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71    assert( 42==sq
18760 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20  lite3LogEst(18) 
18770 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e  );.  if( saved_n
18780 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
18790 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
187a0 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
187b0 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
187c0 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20  noSkipScan==0.  
187d0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
187e0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
187f0 54 45 5f 53 6b 69 70 53 63 61 6e 29 0a 20 20 20  TE_SkipScan).   
18800 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  && pProbe->aiRow
18810 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
18820 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49  +1]>=42  /* TUNI
18830 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20  NG: Minimum for 
18840 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20  skip-scan */.   
18850 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f  && (rc = whereLo
18860 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
18870 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
18880 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  1))==SQLITE_OK. 
18890 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e   ){.    LogEst n
188a0 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Iter;.    pNew->
188b0 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
188c0 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b     pNew->nSkip++
188d0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  ;.    pNew->aLTe
188e0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
188f0 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  +] = 0;.    pNew
18900 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
18910 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20  RE_SKIPSCAN;.   
18920 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d   nIter = pProbe-
18930 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
18940 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65  ed_nEq] - pProbe
18950 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
18960 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20  ved_nEq+1];.    
18970 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
18980 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  ter;.    /* TUNI
18990 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e 63  NG:  Because unc
189a0 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74 68  ertainties in th
189b0 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20  e estimates for 
189c0 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69 65  skip-scan querie
189d0 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61 20  s,.    ** add a 
189e0 31 2e 33 37 35 20 66 75 64 67 65 20 66 61 63 74  1.375 fudge fact
189f0 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d  or to make skip-
18a00 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65  scan slightly le
18a10 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20  ss likely. */.  
18a20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20    nIter += 5;.  
18a30 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
18a40 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
18a50 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
18a60 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29   nIter + nInMul)
18a70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
18a80 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
18a90 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
18aa0 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
18ab0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
18ac0 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b  p = saved_nSkip;
18ad0 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
18ae0 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
18af0 67 73 3b 0a 20 20 7d 0a 0a 20 20 57 48 45 52 45  gs;.  }..  WHERE
18b00 54 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 45  TRACE(0x800, ("E
18b10 4e 44 20 25 73 2e 61 64 64 42 74 72 65 65 49 64  ND %s.addBtreeId
18b20 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 2c 20 72  x(%s), nEq=%d, r
18b30 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18b50 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 7a  Probe->pTable->z
18b60 4e 61 6d 65 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e  Name, pProbe->zN
18b70 61 6d 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20  ame, saved_nEq, 
18b80 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  rc));.  return r
18b90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
18ba0 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73  rn True if it is
18bb0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
18bc0 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75  Index might be u
18bd0 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c  seful in.** impl
18be0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
18bf0 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
18c00 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
18c10 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20  Return False if 
18c20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f  pBuilder does no
18c30 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44  t contain an ORD
18c40 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
18c50 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
18c60 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78  o way for pIndex
18c70 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e   to be useful in
18c80 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
18c90 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  at.** ORDER BY c
18ca0 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
18cb0 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48   int indexMightH
18cc0 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a  elpWithOrderBy(.
18cd0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
18ce0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
18cf0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20  Index *pIndex,. 
18d00 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a   int iCursor.){.
18d10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b    ExprList *pOB;
18d20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f  .  ExprList *aCo
18d30 6c 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 69 2c  lExpr;.  int ii,
18d40 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
18d50 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
18d60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
18d70 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
18d80 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
18d90 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
18da0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
18db0 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
18dc0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
18dd0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
18de0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
18df0 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
18e00 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
18e10 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
18e20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
18e30 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
18e40 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
18e50 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
18e60 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30  ;.      for(jj=0
18e70 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65  ; jj<pIndex->nKe
18e80 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  yCol; jj++){.   
18e90 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
18ea0 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
18eb0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20  >aiColumn[jj] ) 
18ec0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
18ed0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
18ee0 28 61 43 6f 6c 45 78 70 72 20 3d 20 70 49 6e 64  (aColExpr = pInd
18ef0 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21 3d 30  ex->aColExpr)!=0
18f00 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   ){.      for(jj
18f10 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
18f20 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  KeyCol; jj++){. 
18f30 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
18f40 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21  x->aiColumn[jj]!
18f50 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74 69  =XN_EXPR ) conti
18f60 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
18f70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
18f80 61 72 65 53 6b 69 70 28 70 45 78 70 72 2c 61 43  areSkip(pExpr,aC
18f90 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45  olExpr->a[jj].pE
18fa0 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30 20  xpr,iCursor)==0 
18fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
18fc0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
18fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18fe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
18ff0 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  ../* Check to se
19000 65 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69  e if a partial i
19010 6e 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49  ndex with pPartI
19020 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65  ndexWhere can be
19030 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20   used.** in the 
19040 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20  current query.  
19050 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
19060 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c  t can be and fal
19070 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  se if not..*/.st
19080 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73  atic int whereUs
19090 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
190a0 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65  (int iTab, Where
190b0 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
190c0 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e  r *pWhere){.  in
190d0 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  t i;.  WhereTerm
190e0 20 2a 70 54 65 72 6d 3b 0a 20 20 50 61 72 73 65   *pTerm;.  Parse
190f0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
19100 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
19110 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d    while( pWhere-
19120 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
19130 20 20 20 69 66 28 20 21 77 68 65 72 65 55 73 61     if( !whereUsa
19140 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
19150 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72 65 2d  iTab,pWC,pWhere-
19160 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
19170 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   0;.    pWhere =
19180 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 3b   pWhere->pRight;
19190 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
191a0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
191b0 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47  QLITE_EnableQPSG
191c0 20 29 20 70 50 61 72 73 65 20 3d 20 30 3b 0a 20   ) pParse = 0;. 
191d0 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d   for(i=0, pTerm=
191e0 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
191f0 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
19200 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
19210 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
19220 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 21 45  xpr;.    if( (!E
19230 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
19240 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
19250 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69  n) || pExpr->iRi
19260 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54  ghtJoinTable==iT
19270 61 62 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ab).     && sqli
19280 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
19290 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
192a0 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20  , pWhere, iTab) 
192b0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
192c0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
192d0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
192e0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
192f0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
19300 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61   for a single ta
19310 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
19320 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a  where the table.
19330 2a 2a 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  ** is identified
19340 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e   by pBuilder->pN
19350 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
19360 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
19370 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62  eed to be.** a b
19380 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74  -tree table, not
19390 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
193a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74  ..**.** The cost
193b0 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75  s (WhereLoop.rRu
193c0 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  n) of the b-tree
193d0 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20   loops added by 
193e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
193f0 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20   are calculated 
19400 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
19410 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61  * For a full sca
19420 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20  n, assuming the 
19430 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29  table (or index)
19440 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72   contains nRow r
19450 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  ows:.**.**     c
19460 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30  ost = nRow * 3.0
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19480 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c      // full-tabl
19490 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f  e scan.**     co
194a0 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20  st = nRow * K   
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f     // scan of co
194d0 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20  vering index.** 
194e0 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
194f0 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20  * (K+3.0)       
19500 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e           // scan
19510 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67   of non-covering
19520 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65   index.**.** whe
19530 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20  re K is a value 
19540 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20  between 1.1 and 
19550 33 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e  3.0 set based on
19560 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a   the relative .*
19570 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72  * estimated aver
19580 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  age size of the 
19590 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
195a0 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  records..**.** F
195b0 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e  or an index scan
195c0 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69  , where nVisit i
195d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
195e0 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74  index rows visit
195f0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61  ed.** by the sca
19600 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20  n, and nSeek is 
19610 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
19620 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65  ek operations re
19630 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68  quired on .** th
19640 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a  e index b-tree:.
19650 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  **.**     cost =
19660 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52   nSeek * (log(nR
19670 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74  ow) + K * nVisit
19680 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f  )          // co
19690 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20  vering index.** 
196a0 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b      cost = nSeek
196b0 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20   * (log(nRow) + 
196c0 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74  (K+3.0) * nVisit
196d0 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65  )    // non-cove
196e0 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a  ring index.**.**
196f0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b   Normally, nSeek
19700 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c   is 1. nSeek val
19710 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ues greater than
19720 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66   1 come about if
19730 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63   the .** WHERE c
19740 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22  lause includes "
19750 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72  x IN (....)" ter
19760 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  ms used in place
19770 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68   of "x=?". Or wh
19780 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20  en .** implicit 
19790 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20  "x IN (SELECT x 
197a0 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73  FROM tbl)" terms
197b0 20 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73   are added for s
197c0 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a  kip-scans..**.**
197d0 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 76   The estimated v
197e0 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69  alues (nRow, nVi
197f0 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65  sit, nSeek) ofte
19800 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67  n contain a larg
19810 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75  e amount.** of u
19820 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72  ncertainty.  For
19830 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63   this reason, sc
19840 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65  oring is designe
19850 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20  d to pick plans 
19860 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20  that.** "do the 
19870 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66 20 74  least harm" if t
19880 68 65 20 65 73 74 69 6d 61 74 65 73 20 61 72 65  he estimates are
19890 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f   inaccurate.  Fo
198a0 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20  r example, a.** 
198b0 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72  log(nRow) factor
198c0 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
198d0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
198e0 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72  index scan in or
198f0 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74  der to.** bias t
19900 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61  he scoring in fa
19910 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20  vor of using an 
19920 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65  index, since the
19930 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70   worst-case.** p
19940 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73  erformance of us
19950 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20  ing an index is 
19960 66 61 72 20 62 65 74 74 65 72 20 74 68 61 6e 20  far better than 
19970 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70  the worst-case p
19980 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66  erformance.** of
19990 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
199a0 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
199b0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
199c0 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ree(.  WhereLoop
199d0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
199e0 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  r, /* WHERE clau
199f0 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
19a00 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65  /.  Bitmask mPre
19a10 72 65 71 20 20 20 20 20 20 20 20 20 20 20 20 20  req             
19a20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75  /* Extra prerequ
19a30 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67  esites for using
19a40 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
19a50 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
19a60 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
19a70 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
19a80 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  s context */.  I
19a90 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
19aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
19ab0 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
19ac0 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  aluating */.  In
19ad0 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20  dex sPk;        
19ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
19af0 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ake index object
19b00 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
19b10 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74   key */.  LogEst
19b20 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
19b30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52        /* The aiR
19b40 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65  owLogEst[] value
19b50 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
19b60 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f  ex */.  i16 aiCo
19b70 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20  lumnPk = -1;    
19b80 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75      /* The aColu
19b90 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  mn[] value for t
19ba0 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
19bb0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
19bc0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ist;          /*
19bd0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
19be0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
19bf0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
19c00 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
19c10 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20  ause btree term 
19c20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72  to add */.  Wher
19c30 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
19c40 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
19c50 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ate WhereLoop ob
19c60 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
19c70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
19c80 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
19c90 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  code */.  int iS
19ca0 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20  ortIdx = 1;     
19cb0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
19cc0 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62  umber */.  int b
19cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19ce0 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c         /* A bool
19cf0 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c  ean value */.  L
19d00 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20  ogEst rSize;    
19d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75             /* nu
19d20 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
19d30 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c  the table */.  L
19d40 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20  ogEst rLogSize; 
19d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
19d60 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e  garithm of the n
19d70 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
19d80 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
19d90 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
19da0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
19db0 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20  he parsed WHERE 
19dc0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c  clause */.  Tabl
19dd0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
19de0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
19df0 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
19e00 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42  /.  .  pNew = pB
19e10 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
19e20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
19e30 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61  r->pWInfo;.  pTa
19e40 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
19e50 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63  pTabList;.  pSrc
19e60 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b   = pTabList->a +
19e70 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70   pNew->iTab;.  p
19e80 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
19e90 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64  ;.  pWC = pBuild
19ea0 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72  er->pWC;.  asser
19eb0 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53  t( !IsVirtual(pS
19ec0 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20  rc->pTab) );..  
19ed0 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64  if( pSrc->pIBInd
19ee0 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
19ef0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
19f00 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
19f10 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
19f20 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72  o use */.    pPr
19f30 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49  obe = pSrc->pIBI
19f40 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ndex;.  }else if
19f50 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
19f60 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20  ) ){.    pProbe 
19f70 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
19f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19f90 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45  There is no INDE
19fa0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20  XED BY clause.  
19fb0 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e  Create a fake In
19fc0 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f  dex object in lo
19fd0 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  cal.    ** varia
19fe0 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65  ble sPk to repre
19ff0 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70  sent the rowid p
1a000 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
1a010 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20  .  Make this.   
1a020 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74   ** fake index t
1a030 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68  he first in a ch
1a040 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a  ain of Index obj
1a050 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66  ects with all of
1a060 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a   the real.    **
1a070 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c   indices to foll
1a080 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ow */.    Index 
1a090 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
1a0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1a0b0 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63  st of real indic
1a0c0 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  es on the table 
1a0d0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
1a0e0 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e  Pk, 0, sizeof(In
1a0f0 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e  dex));.    sPk.n
1a100 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20  KeyCol = 1;.    
1a110 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
1a120 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
1a130 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
1a140 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f  .    sPk.aiRowLo
1a150 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  gEst = aiRowEstP
1a160 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
1a170 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
1a180 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
1a190 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e  = pTab;.    sPk.
1a1a0 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d  szIdxRow = pTab-
1a1b0 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61  >szTabRow;.    a
1a1c0 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
1a1d0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
1a1e0 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
1a1f0 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72  1] = 0;.    pFir
1a200 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  st = pSrc->pTab-
1a210 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  >pIndex;.    if(
1a220 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64   pSrc->fg.notInd
1a230 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
1a240 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64   /* The real ind
1a250 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
1a260 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  e are only consi
1a270 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20  dered if the.   
1a280 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45     ** NOT INDEXE
1a290 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f  D qualifier is o
1a2a0 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
1a2b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1a2c0 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
1a2d0 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
1a2e0 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
1a2f0 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20  ;.  }.  rSize = 
1a300 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
1a310 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65  ;.  rLogSize = e
1a320 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23  stLog(rSize);..#
1a330 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a340 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
1a350 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69  EX.  /* Automati
1a360 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  c indexes */.  i
1a370 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f  f( !pBuilder->pO
1a380 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74  rSet      /* Not
1a390 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f   part of an OR o
1a3a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  ptimization */. 
1a3b0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
1a3c0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1a3d0 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
1a3e0 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
1a3f0 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  >pParse->db->fla
1a400 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f  gs & SQLITE_Auto
1a410 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20  Index)!=0.   && 
1a420 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d  pSrc->pIBIndex==
1a430 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f  0      /* Has no
1a440 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1a450 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72  se */.   && !pSr
1a460 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  c->fg.notIndexed
1a470 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54     /* Has no NOT
1a480 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20   INDEXED clause 
1a490 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69  */.   && HasRowi
1a4a0 64 28 70 54 61 62 29 20 20 20 20 20 20 20 20 20  d(pTab)         
1a4b0 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54 20 52  /* Not WITHOUT R
1a4c0 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49 58  OWID table. (FIX
1a4d0 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f  ME: Why not?) */
1a4e0 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67  .   && !pSrc->fg
1a4f0 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a  .isCorrelated /*
1a500 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65   Not a correlate
1a510 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  d subquery */.  
1a520 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73   && !pSrc->fg.is
1a530 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f  Recursive  /* No
1a540 74 20 61 20 72 65 63 75 72 73 69 76 65 20 63 6f  t a recursive co
1a550 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65  mmon table expre
1a560 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20  ssion. */.  ){. 
1a570 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
1a580 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c  uto-index WhereL
1a590 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72  oops */.    Wher
1a5a0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
1a5b0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
1a5c0 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
1a5d0 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66  WC->nTerm;.    f
1a5e0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
1a5f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1a600 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  & pTerm<pWCEnd; 
1a610 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
1a620 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
1a630 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
1a640 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
1a650 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  ue;.      if( te
1a660 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
1a670 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20  pTerm, pSrc, 0) 
1a680 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
1a690 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31  >u.btree.nEq = 1
1a6a0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a6b0 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20  nSkip = 0;.     
1a6c0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
1a6d0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
1a6e0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
1a6f0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  m = 1;.        p
1a700 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
1a710 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
1a720 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74  /* TUNING: One-t
1a730 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d  ime cost for com
1a740 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d  puting the autom
1a750 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20  atic index is.  
1a760 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74        ** estimat
1a770 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67  ed to be X*N*log
1a780 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20  2(N) where N is 
1a790 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1a7a0 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ws in.        **
1a7b0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
1a7c0 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65   indexed and whe
1a7d0 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73  re X is 7 (LogEs
1a7e0 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c  t=28) for normal
1a7f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
1a800 65 73 20 6f 72 20 30 2e 35 20 28 4c 6f 67 45 73  es or 0.5 (LogEs
1a810 74 3d 2d 31 30 29 20 66 6f 72 20 76 69 65 77 73  t=-10) for views
1a820 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 2e   and subqueries.
1a830 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20 20    The value.    
1a840 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20 73      ** of X is s
1a850 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77 73  maller for views
1a860 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
1a870 73 6f 20 74 68 61 74 20 74 68 65 20 71 75 65 72  so that the quer
1a880 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20  y planner.      
1a890 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72    ** will be mor
1a8a0 65 20 61 67 67 72 65 73 73 69 76 65 20 61 62 6f  e aggressive abo
1a8b0 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61 75  ut generating au
1a8c0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20  tomatic indexes 
1a8d0 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  for.        ** t
1a8e0 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73 69  hose objects, si
1a8f0 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  nce there is no 
1a900 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 61  opportunity to a
1a910 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20 20  dd schema.      
1a920 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20    ** indexes on 
1a930 73 75 62 71 75 65 72 69 65 73 20 61 6e 64 20 76  subqueries and v
1a940 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iews. */.       
1a950 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1a960 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65  rLogSize + rSize
1a970 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
1a980 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26  ab->pSelect==0 &
1a990 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
1a9a0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
1a9b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1a9c0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b    pNew->rSetup +
1a9d0 3d 20 32 38 3b 0a 20 20 20 20 20 20 20 20 7d 65  = 28;.        }e
1a9e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
1a9f0 4e 65 77 2d 3e 72 53 65 74 75 70 20 2d 3d 20 31  New->rSetup -= 1
1aa00 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1aa10 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75       ApplyCostMu
1aa20 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
1aa30 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73  Setup, pTab->cos
1aa40 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  tMult);.        
1aa50 69 66 28 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  if( pNew->rSetup
1aa60 3c 30 20 29 20 70 4e 65 77 2d 3e 72 53 65 74 75  <0 ) pNew->rSetu
1aa70 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f  p = 0;.        /
1aa80 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69  * TUNING: Each i
1aa90 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c  ndex lookup yiel
1aaa0 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68  ds 20 rows in th
1aab0 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20  e table.  This. 
1aac0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72         ** is mor
1aad0 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c  e than the usual
1aae0 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77   guess of 10 row
1aaf0 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  s, since we have
1ab00 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20   no way.        
1ab10 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f  ** of knowing ho
1ab20 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20  w selective the 
1ab30 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d  index will ultim
1ab40 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f  ately be.  It wo
1ab50 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  uld.        ** n
1ab60 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62  ot be unreasonab
1ab70 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20  le to make this 
1ab80 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65  value much large
1ab90 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  r. */.        pN
1aba0 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20  ew->nOut = 43;  
1abb0 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69  assert( 43==sqli
1abc0 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b  te3LogEst(20) );
1abd0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
1abe0 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
1abf0 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
1ac00 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20  pNew->nOut);.   
1ac10 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
1ac20 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs = WHERE_AUTO_
1ac30 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70  INDEX;.        p
1ac40 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50  New->prereq = mP
1ac50 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70  rereq | pTerm->p
1ac60 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
1ac70 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1ac80 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1ac90 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1aca0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1acb0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1acc0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
1acd0 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  X */..  /* Loop 
1ace0 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73  over all indices
1acf0 2e 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  . If there was a
1ad00 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
1ad10 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 0a  use, then only .
1ad20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 69 6e    ** consider in
1ad30 64 65 78 20 70 50 72 6f 62 65 2e 20 20 2a 2f 0a  dex pProbe.  */.
1ad40 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
1ad50 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b  TE_OK && pProbe;
1ad60 20 0a 20 20 20 20 20 20 70 50 72 6f 62 65 3d 28   .      pProbe=(
1ad70 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 3f  pSrc->pIBIndex ?
1ad80 20 30 20 3a 20 70 50 72 6f 62 65 2d 3e 70 4e 65   0 : pProbe->pNe
1ad90 78 74 29 2c 20 69 53 6f 72 74 49 64 78 2b 2b 0a  xt), iSortIdx++.
1ada0 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72    ){.    if( pPr
1adb0 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
1adc0 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77  re!=0.     && !w
1add0 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
1ade0 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75  lIndex(pSrc->iCu
1adf0 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62  rsor, pWC, pProb
1ae00 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
1ae10 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
1ae20 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21  ase( pNew->iTab!
1ae30 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
1ae40 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74  ;  /* See ticket
1ae50 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f   [98d973b8f5] */
1ae60 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1ae70 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64    /* Partial ind
1ae80 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ex inappropriate
1ae90 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20   for this query 
1aea0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
1aeb0 20 70 50 72 6f 62 65 2d 3e 62 4e 6f 51 75 65 72   pProbe->bNoQuer
1aec0 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
1aed0 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65    rSize = pProbe
1aee0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
1aef0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
1af00 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20  ree.nEq = 0;.   
1af10 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
1af20 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Btm = 0;.    pNe
1af30 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
1af40 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
1af50 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Skip = 0;.    pN
1af60 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
1af70 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
1af80 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
1af90 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
1afa0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
1afb0 20 6d 50 72 65 72 65 71 3b 0a 20 20 20 20 70 4e   mPrereq;.    pN
1afc0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
1afd0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
1afe0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72  ree.pIndex = pPr
1aff0 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64  obe;.    b = ind
1b000 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
1b010 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c  rderBy(pBuilder,
1b020 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69   pProbe, pSrc->i
1b030 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20  Cursor);.    /* 
1b040 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49  The ONEPASS_DESI
1b050 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20  RED flags never 
1b060 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20  occurs together 
1b070 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f  with ORDER BY */
1b080 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57  .    assert( (pW
1b090 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1b0a0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
1b0b0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
1b0c0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
1b0d0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
1b0e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65  ){.      /* Inte
1b0f0 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
1b100 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70  index */.      p
1b110 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1b120 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20  HERE_IPK;..     
1b130 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73   /* Full table s
1b140 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  can */.      pNe
1b150 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
1b160 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
1b170 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
1b180 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61   Cost of full ta
1b190 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33  ble scan is (N*3
1b1a0 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  .0). */.      pN
1b1b0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
1b1c0 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70   + 16;.      App
1b1d0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
1b1e0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61  (pNew->rRun, pTa
1b1f0 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
1b200 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
1b210 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
1b220 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
1b230 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1b240 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
1b250 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  , pNew);.      p
1b260 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
1b270 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  e;.      if( rc 
1b280 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c  ) break;.    }el
1b290 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  se{.      Bitmas
1b2a0 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k m;.      if( p
1b2b0 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e  Probe->isCoverin
1b2c0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  g ){.        pNe
1b2d0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
1b2e0 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
1b2f0 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
1b300 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20       m = 0;.    
1b310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b320 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
1b330 65 64 20 26 20 70 50 72 6f 62 65 2d 3e 63 6f 6c  ed & pProbe->col
1b340 4e 6f 74 49 64 78 65 64 3b 0a 20 20 20 20 20 20  NotIdxed;.      
1b350 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1b360 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
1b370 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
1b380 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
1b390 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
1b3a0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c   }..      /* Ful
1b3b0 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78  l scan via index
1b3c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a   */.      if( b.
1b3d0 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f         || !HasRo
1b3e0 77 69 64 28 70 54 61 62 29 0a 20 20 20 20 20 20  wid(pTab).      
1b3f0 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72   || pProbe->pPar
1b400 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20  tIdxWhere!=0.   
1b410 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20      || ( m==0.  
1b420 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
1b430 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
1b440 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72           && (pPr
1b450 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  obe->szIdxRow<pT
1b460 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20  ab->szTabRow).  
1b470 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
1b480 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1b490 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
1b4a0 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
1b4b0 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
1b4c0 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
1b4d0 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
1b4e0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
1b4f0 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
1b500 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
1b510 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
1b520 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
1b530 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
1b540 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
1b550 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20  rtIdx : 0;..    
1b560 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
1b570 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  of visiting the 
1b580 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a  index rows is N*
1b590 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20  K, where K is.  
1b5a0 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
1b5b0 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65   1.1 and 3.0, de
1b5c0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72  pending on the r
1b5d0 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
1b5e0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1b5f0 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
1b600 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rows. */.       
1b610 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53   pNew->rRun = rS
1b620 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70 50  ize + 1 + (15*pP
1b630 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f  robe->szIdxRow)/
1b640 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
1b650 20 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d 30          if( m!=0
1b660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1b670 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f   If this is a no
1b680 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
1b690 20 73 63 61 6e 2c 20 61 64 64 20 69 6e 20 74 68   scan, add in th
1b6a0 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 20 20  e cost of.      
1b6b0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62      ** doing tab
1b6c0 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 65  le lookups.  The
1b6d0 20 63 6f 73 74 20 77 69 6c 6c 20 62 65 20 33 78   cost will be 3x
1b6e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
1b6f0 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b           ** look
1b700 75 70 73 2e 20 20 54 61 6b 65 20 69 6e 74 6f 20  ups.  Take into 
1b710 61 63 63 6f 75 6e 74 20 57 48 45 52 45 20 63 6c  account WHERE cl
1b720 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
1b730 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20  can be.         
1b740 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73   ** satisfied us
1b750 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64  ing just the ind
1b760 65 78 2c 20 61 6e 64 20 74 68 61 74 20 64 6f 20  ex, and that do 
1b770 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 20 20  not require a.  
1b780 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
1b790 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20   lookup. */.    
1b7a0 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4c 6f        LogEst nLo
1b7b0 6f 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b 20 31  okup = rSize + 1
1b7c0 36 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f 73 74  6;  /* Base cost
1b7d0 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20 20 20  :  N*3 */.      
1b7e0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1b7f0 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
1b800 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 0a   pSrc->iCursor;.
1b810 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
1b820 6c 61 75 73 65 20 2a 70 57 43 32 20 3d 20 26 70  lause *pWC2 = &p
1b830 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 20 20  WInfo->sWC;.    
1b840 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1b850 69 69 3c 70 57 43 32 2d 3e 6e 54 65 72 6d 3b 20  ii<pWC2->nTerm; 
1b860 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
1b870 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
1b880 65 72 6d 20 3d 20 26 70 57 43 32 2d 3e 61 5b 69  erm = &pWC2->a[i
1b890 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
1b8a0 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
1b8b0 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 70  CoveredByIndex(p
1b8c0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75  Term->pExpr, iCu
1b8d0 72 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  r, pProbe) ){.  
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1b8f0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
1b900 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1b910 70 54 65 72 6d 20 63 61 6e 20 62 65 20 65 76 61  pTerm can be eva
1b920 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6a 75 73  luated using jus
1b930 74 20 74 68 65 20 69 6e 64 65 78 2e 20 20 53 6f  t the index.  So
1b940 20 72 65 64 75 63 65 0a 20 20 20 20 20 20 20 20   reduce.        
1b950 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65 63      ** the expec
1b960 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  ted number of ta
1b970 62 6c 65 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f  ble lookups acco
1b980 72 64 69 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20  rdingly */.     
1b990 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1b9a0 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
1b9b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b9c0 6e 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d  nLookup += pTerm
1b9d0 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
1b9e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c                nL
1ba00 6f 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20  ookup--;.       
1ba10 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1ba20 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1ba30 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c  O_EQ|WO_IS) ) nL
1ba40 6f 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20  ookup -= 19;.   
1ba50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ba60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ba70 20 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77   .          pNew
1ba80 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
1ba90 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e  LogEstAdd(pNew->
1baa0 72 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a  rRun, nLookup);.
1bab0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bac0 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
1bad0 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
1bae0 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
1baf0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
1bb00 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
1bb10 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  (pWC, pNew, rSiz
1bb20 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
1bb30 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
1bb40 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
1bb50 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1bb60 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
1bb70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
1bb80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1bb90 20 20 7d 0a 0a 20 20 20 20 70 42 75 69 6c 64 65    }..    pBuilde
1bba0 72 2d 3e 62 6c 64 46 6c 61 67 73 20 3d 20 30 3b  r->bldFlags = 0;
1bbb0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
1bbc0 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
1bbd0 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
1bbe0 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 20 20 20   pProbe, 0);.   
1bbf0 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 62   if( pBuilder->b
1bc00 6c 64 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ldFlags==SQLITE_
1bc10 42 4c 44 46 5f 49 4e 44 45 58 45 44 20 29 7b 0a  BLDF_INDEXED ){.
1bc20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6e 6f        /* If a no
1bc30 6e 2d 75 6e 69 71 75 65 20 69 6e 64 65 78 20 69  n-unique index i
1bc40 73 20 75 73 65 64 2c 20 6f 72 20 69 66 20 61 20  s used, or if a 
1bc50 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6b 65  prefix of the ke
1bc60 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 75  y for.      ** u
1bc70 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73 20 75  nique index is u
1bc80 73 65 64 20 28 6d 61 6b 69 6e 67 20 74 68 65 20  sed (making the 
1bc90 69 6e 64 65 78 20 66 75 6e 63 74 69 6f 6e 61 6c  index functional
1bca0 6c 79 20 6e 6f 6e 2d 75 6e 69 71 75 65 29 0a 20  ly non-unique). 
1bcb0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
1bcc0 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64 61   sqlite_stat1 da
1bcd0 74 61 20 62 65 63 6f 6d 65 73 20 69 6d 70 6f 72  ta becomes impor
1bce0 74 61 6e 74 20 66 6f 72 20 73 63 6f 72 69 6e 67  tant for scoring
1bcf0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c   the.      ** pl
1bd00 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  an */.      pTab
1bd10 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
1bd20 5f 53 74 61 74 73 55 73 65 64 3b 0a 20 20 20 20  _StatsUsed;.    
1bd30 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1bd40 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
1bd50 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65  STAT4.    sqlite
1bd60 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28  3Stat4ProbeFree(
1bd70 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b  pBuilder->pRec);
1bd80 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
1bd90 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  RecValid = 0;.  
1bda0 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
1bdb0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d   = 0;.#endif.  }
1bdc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bdd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bde0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1bdf0 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  E../*.** Argumen
1be00 74 20 70 49 64 78 49 6e 66 6f 20 69 73 20 61 6c  t pIdxInfo is al
1be10 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20  ready populated 
1be20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61  with all constra
1be30 69 6e 74 73 20 74 68 61 74 20 6d 61 79 0a 2a 2a  ints that may.**
1be40 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
1be50 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 64  virtual table id
1be60 65 6e 74 69 66 69 65 64 20 62 79 20 70 42 75 69  entified by pBui
1be70 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
1be80 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
1be90 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75 62 73 65  on marks a subse
1bea0 74 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 73 74  t of those const
1beb0 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2c 20 69  raints usable, i
1bec0 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 78 42  nvokes the.** xB
1bed0 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
1bee0 61 6e 64 20 61 64 64 73 20 74 68 65 20 72 65 74  and adds the ret
1bef0 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f 20 70 42  urned plan to pB
1bf00 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  uilder..**.** A 
1bf10 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6d 61  constraint is ma
1bf20 72 6b 65 64 20 75 73 61 62 6c 65 20 69 66 3a 0a  rked usable if:.
1bf30 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67 75 6d 65  **.**   * Argume
1bf40 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e 64 69 63  nt mUsable indic
1bf50 61 74 65 73 20 74 68 61 74 20 69 74 73 20 70 72  ates that its pr
1bf60 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20  erequisites are 
1bf70 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a  available, and.*
1bf80 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69 73 20 6e  *.**   * It is n
1bf90 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  ot one of the op
1bfa0 65 72 61 74 6f 72 73 20 73 70 65 63 69 66 69 65  erators specifie
1bfb0 64 20 69 6e 20 74 68 65 20 6d 45 78 63 6c 75 64  d in the mExclud
1bfc0 65 20 6d 61 73 6b 20 70 61 73 73 65 64 0a 2a 2a  e mask passed.**
1bfd0 20 20 20 20 20 61 73 20 74 68 65 20 66 6f 75 72       as the four
1bfe0 74 68 20 61 72 67 75 6d 65 6e 74 20 28 77 68 69  th argument (whi
1bff0 63 68 20 69 6e 20 70 72 61 63 74 69 63 65 20 69  ch in practice i
1c000 73 20 65 69 74 68 65 72 20 57 4f 5f 49 4e 20 6f  s either WO_IN o
1c010 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  r 0)..**.** Argu
1c020 6d 65 6e 74 20 6d 50 72 65 72 65 71 20 69 73 20  ment mPrereq is 
1c030 61 20 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  a mask of tables
1c040 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
1c050 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  anned before the
1c060 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
1c070 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 54  e in question. T
1c080 68 65 73 65 20 61 72 65 20 61 64 64 65 64 20 74  hese are added t
1c090 6f 20 74 68 65 20 70 6c 61 6e 73 20 70 72 65 72  o the plans prer
1c0a0 65 71 75 69 73 69 74 65 73 0a 2a 2a 20 62 65 66  equisites.** bef
1c0b0 6f 72 65 20 69 74 20 69 73 20 61 64 64 65 64 20  ore it is added 
1c0c0 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  to pBuilder..**.
1c0d0 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65  ** Output parame
1c0e0 74 65 72 20 2a 70 62 49 6e 20 69 73 20 73 65 74  ter *pbIn is set
1c0f0 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20   to true if the 
1c100 70 6c 61 6e 20 61 64 64 65 64 20 74 6f 20 70 42  plan added to pB
1c110 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65 73 20 6f  uilder.** uses o
1c120 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f 5f 49 4e  ne or more WO_IN
1c130 20 74 65 72 6d 73 2c 20 6f 72 20 66 61 6c 73 65   terms, or false
1c140 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1c150 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1c160 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1c170 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
1c180 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
1c190 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
1c1a0 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q,              
1c1b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62    /* Mask of tab
1c1c0 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1c1d0 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42 69 74 6d   used. */.  Bitm
1c1e0 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20 20 20 20  ask mUsable,    
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1c200 61 73 6b 20 6f 66 20 75 73 61 62 6c 65 20 74 61  ask of usable ta
1c210 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36 20 6d 45  bles */.  u16 mE
1c220 78 63 6c 75 64 65 2c 20 20 20 20 20 20 20 20 20  xclude,         
1c230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63            /* Exc
1c240 6c 75 64 65 20 74 65 72 6d 73 20 75 73 69 6e 67  lude terms using
1c250 20 74 68 65 73 65 20 6f 70 65 72 61 74 6f 72 73   these operators
1c260 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1c270 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
1c280 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  fo,   /* Populat
1c290 65 64 20 6f 62 6a 65 63 74 20 66 6f 72 20 78 42  ed object for xB
1c2a0 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31  estIndex */.  u1
1c2b0 36 20 6d 4e 6f 4f 6d 69 74 2c 20 20 20 20 20 20  6 mNoOmit,      
1c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c2d0 20 44 6f 20 6e 6f 74 20 6f 6d 69 74 20 74 68 65   Do not omit the
1c2e0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
1c2f0 2f 0a 20 20 69 6e 74 20 2a 70 62 49 6e 20 20 20  /.  int *pbIn   
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c310 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65      /* OUT: True
1c320 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20 61 6e   if plan uses an
1c330 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29   IN(...) op */.)
1c340 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
1c350 2a 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d  *pWC = pBuilder-
1c360 3e 70 57 43 3b 0a 20 20 73 74 72 75 63 74 20 73  >pWC;.  struct s
1c370 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
1c380 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
1c390 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
1c3a0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
1c3b0 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
1c3c0 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
1c3d0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
1c3e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1c3f0 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 72 63  mxTerm;.  int rc
1c400 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c410 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 20  WhereLoop *pNew 
1c420 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1c430 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
1c440 65 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  e = pBuilder->pW
1c450 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1c460 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1c470 74 65 6d 20 2a 70 53 72 63 20 3d 20 26 70 42 75  tem *pSrc = &pBu
1c480 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
1c490 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d  TabList->a[pNew-
1c4a0 3e 69 54 61 62 5d 3b 0a 20 20 69 6e 74 20 6e 43  >iTab];.  int nC
1c4b0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
1c4c0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
1c4d0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d  t;..  assert( (m
1c4e0 55 73 61 62 6c 65 20 26 20 6d 50 72 65 72 65 71  Usable & mPrereq
1c4f0 29 3d 3d 6d 50 72 65 72 65 71 20 29 3b 0a 20 20  )==mPrereq );.  
1c500 2a 70 62 49 6e 20 3d 20 30 3b 0a 20 20 70 4e 65  *pbIn = 0;.  pNe
1c510 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65  w->prereq = mPre
1c520 72 65 71 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  req;..  /* Set t
1c530 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 20 6f  he usable flag o
1c540 6e 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20  n the subset of 
1c550 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65 6e  constraints iden
1c560 74 69 66 69 65 64 20 62 79 20 0a 20 20 2a 2a 20  tified by .  ** 
1c570 61 72 67 75 6d 65 6e 74 73 20 6d 55 73 61 62 6c  arguments mUsabl
1c580 65 20 61 6e 64 20 6d 45 78 63 6c 75 64 65 2e 20  e and mExclude. 
1c590 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
1c5a0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
1c5b0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
1c5c0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
1c5d0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
1c5e0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
1c5f0 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
1c600 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  ons++){.    Wher
1c610 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
1c620 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 2d  pWC->a[pIdxCons-
1c630 3e 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b 0a 20  >iTermOffset];. 
1c640 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
1c650 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ble = 0;.    if(
1c660 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
1c670 69 67 68 74 20 26 20 6d 55 73 61 62 6c 65 29 3d  ight & mUsable)=
1c680 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  =pTerm->prereqRi
1c690 67 68 74 20 0a 20 20 20 20 20 26 26 20 28 70 54  ght .     && (pT
1c6a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1c6b0 20 6d 45 78 63 6c 75 64 65 29 3d 3d 30 0a 20 20   mExclude)==0.  
1c6c0 20 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 43    ){.      pIdxC
1c6d0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
1c6e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c6f0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1c700 6f 75 74 70 75 74 20 66 69 65 6c 64 73 20 6f 66  output fields of
1c710 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
1c720 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
1c730 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 55  e */.  memset(pU
1c740 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sage, 0, sizeof(
1c750 70 55 73 61 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73  pUsage[0])*nCons
1c760 74 72 61 69 6e 74 29 3b 0a 20 20 61 73 73 65 72  traint);.  asser
1c770 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  t( pIdxInfo->nee
1c780 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30  dToFreeIdxStr==0
1c790 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   );.  pIdxInfo->
1c7a0 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49  idxStr = 0;.  pI
1c7b0 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
1c7c0 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
1c7d0 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
1c7e0 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
1c7f0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
1c800 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20   SQLITE_BIG_DBL 
1c810 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 70  / (double)2;.  p
1c820 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1c830 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 70  edRows = 25;.  p
1c840 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67  IdxInfo->idxFlag
1c850 73 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  s = 0;.  pIdxInf
1c860 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73 71  o->colUsed = (sq
1c870 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63  lite3_int64)pSrc
1c880 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a  ->colUsed;..  /*
1c890 20 49 6e 76 6f 6b 65 20 74 68 65 20 76 69 72 74   Invoke the virt
1c8a0 75 61 6c 20 74 61 62 6c 65 20 78 42 65 73 74 49  ual table xBestI
1c8b0 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20 2a 2f  ndex() method */
1c8c0 0a 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74  .  rc = vtabBest
1c8d0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 53  Index(pParse, pS
1c8e0 72 63 2d 3e 70 54 61 62 2c 20 70 49 64 78 49 6e  rc->pTab, pIdxIn
1c8f0 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  fo);.  if( rc ){
1c900 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c910 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
1c920 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1c930 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
1c940 68 6f 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  hod returns SQLI
1c950 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74  TE_CONSTRAINT, t
1c960 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 20 20  hat means.      
1c970 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 72 74  ** that the part
1c980 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69  icular combinati
1c990 6f 6e 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73  on of parameters
1c9a0 20 70 72 6f 76 69 64 65 64 20 69 73 20 75 6e 75   provided is unu
1c9b0 73 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  sable..      ** 
1c9c0 4d 61 6b 65 20 6e 6f 20 65 6e 74 72 69 65 73 20  Make no entries 
1c9d0 69 6e 20 74 68 65 20 6c 6f 6f 70 20 74 61 62 6c  in the loop tabl
1c9e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1c9f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ca00 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
1ca10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1ca20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 61  mxTerm = -1;.  a
1ca30 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53  ssert( pNew->nLS
1ca40 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  lot>=nConstraint
1ca50 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1ca60 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
1ca70 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  +) pNew->aLTerm[
1ca80 69 5d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  i] = 0;.  pNew->
1ca90 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
1caa0 3d 20 30 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20  = 0;.  pIdxCons 
1cab0 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
1cac0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1cad0 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
1cae0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
1caf0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1cb00 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
1cb10 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 69 6e  xCons++){.    in
1cb20 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  t iTerm;.    if(
1cb30 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65   (iTerm = pUsage
1cb40 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20  [i].argvIndex - 
1cb50 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  1)>=0 ){.      W
1cb60 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1cb70 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
1cb80 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
1cb90 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
1cba0 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
1cbb0 6e 74 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30  nt.       || j<0
1cbc0 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57  .       || j>=pW
1cbd0 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
1cbe0 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  || pNew->aLTerm[
1cbf0 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20  iTerm]!=0.      
1cc00 20 7c 7c 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73   || pIdxCons->us
1cc10 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20 20 29 7b  able==0.      ){
1cc20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1cc30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1cc40 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d  "%s.xBestIndex m
1cc50 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63  alfunction",pSrc
1cc60 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
1cc70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1cc80 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
1cc90 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 3b 0a  ToFreeIdxStr );.
1cca0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1ccb0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1ccc0 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
1ccd0 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e  ase( iTerm==nCon
1cce0 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20  straint-1 );.   
1ccf0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1cd00 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1cd10 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65  ase( j==pWC->nTe
1cd20 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 54  rm-1 );.      pT
1cd30 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
1cd40 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
1cd50 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
1cd60 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
1cd70 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c    assert( iTerm<
1cd80 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
1cd90 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
1cda0 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
1cdb0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65  m;.      if( iTe
1cdc0 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65  rm>mxTerm ) mxTe
1cdd0 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20  rm = iTerm;.    
1cde0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
1cdf0 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 74  m==15 );.      t
1ce00 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
1ce10 31 36 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  16 );.      if( 
1ce20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61  iTerm<16 && pUsa
1ce30 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65  ge[i].omit ) pNe
1ce40 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1ce50 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a  sk |= 1<<iTerm;.
1ce60 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1ce70 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1ce80 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)!=0 ){.     
1ce90 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
1cea0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
1ceb0 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
1cec0 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
1ced0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
1cee0 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42  sume the ORDER B
1cef0 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65  Y clause because
1cf00 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f   (1) the order o
1cf10 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20  f IN terms.     
1cf20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
1cf30 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
1cf40 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
1cf50 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
1cf60 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29  d.        ** (2)
1cf70 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74   Multiple output
1cf80 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  s from a single 
1cf90 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f  IN value will no
1cfa0 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20  t merge.        
1cfb0 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f  ** together.  */
1cfc0 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
1cfd0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
1cfe0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
1cff0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
1d000 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e  gs &= ~SQLITE_IN
1d010 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b  DEX_SCAN_UNIQUE;
1d020 0a 20 20 20 20 20 20 20 20 2a 70 62 49 6e 20 3d  .        *pbIn =
1d030 20 31 3b 20 61 73 73 65 72 74 28 20 28 6d 45 78   1; assert( (mEx
1d040 63 6c 75 64 65 20 26 20 57 4f 5f 49 4e 29 3d 3d  clude & WO_IN)==
1d050 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1d060 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 75   }.  }.  pNew->u
1d070 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 26  .vtab.omitMask &
1d080 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 70  = ~mNoOmit;..  p
1d090 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78  New->nLTerm = mx
1d0a0 54 65 72 6d 2b 31 3b 0a 20 20 66 6f 72 28 69 3d  Term+1;.  for(i=
1d0b0 30 3b 20 69 3c 3d 6d 78 54 65 72 6d 3b 20 69 2b  0; i<=mxTerm; i+
1d0c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  +){.    if( pNew
1d0d0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29  ->aLTerm[i]==0 )
1d0e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  {.      /* The n
1d0f0 6f 6e 2d 7a 65 72 6f 20 61 72 67 76 49 64 78 20  on-zero argvIdx 
1d100 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 63  values must be c
1d110 6f 6e 74 69 67 75 6f 75 73 2e 20 20 52 61 69 73  ontiguous.  Rais
1d120 65 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72  e an.      ** er
1d130 72 6f 72 20 69 66 20 74 68 65 79 20 61 72 65 20  ror if they are 
1d140 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  not */.      sql
1d150 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1d160 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64  rse,"%s.xBestInd
1d170 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c  ex malfunction",
1d180 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
1d190 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1d1a0 73 65 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  se( pIdxInfo->ne
1d1b0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
1d1c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1d1d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1d1e0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1d1f0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
1d200 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
1d210 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
1d220 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
1d230 3e 69 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d  >idxNum;.  pNew-
1d240 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1d250 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65   = pIdxInfo->nee
1d260 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20  dToFreeIdxStr;. 
1d270 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1d280 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
1d290 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1d2a0 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
1d2b0 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e 65  o->idxStr;.  pNe
1d2c0 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
1d2d0 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49  red = (i8)(pIdxI
1d2e0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
1d2f0 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 70 49 64  umed ?.      pId
1d300 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
1d310 3a 20 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  : 0);.  pNew->rS
1d320 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
1d330 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
1d340 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65  LogEstFromDouble
1d350 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
1d360 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65  atedCost);.  pNe
1d370 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
1d380 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f  3LogEst(pIdxInfo
1d390 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
1d3a0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1d3b0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61  WHERE_ONEROW fla
1d3c0 67 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e  g if the xBestIn
1d3d0 64 65 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64  dex() method ind
1d3e0 69 63 61 74 65 64 0a 20 20 2a 2a 20 74 68 61 74  icated.  ** that
1d3f0 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
1d400 69 73 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65  isit at most one
1d410 20 72 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f   row. Clear it o
1d420 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69  therwise. */.  i
1d430 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  f( pIdxInfo->idx
1d440 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  Flags & SQLITE_I
1d450 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45  NDEX_SCAN_UNIQUE
1d460 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73   ){.    pNew->ws
1d470 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
1d480 4e 45 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NEROW;.  }else{.
1d490 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1d4a0 73 20 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52  s &= ~WHERE_ONER
1d4b0 4f 57 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77  OW;.  }.  rc = w
1d4c0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
1d4d0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
1d4e0 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74    if( pNew->u.vt
1d4f0 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
1d500 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1d510 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
1d520 53 74 72 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Str);.    pNew->
1d530 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1d540 3d 20 30 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45  = 0;.  }.  WHERE
1d550 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
1d560 20 20 62 49 6e 3d 25 64 20 70 72 65 72 65 71 49    bIn=%d prereqI
1d570 6e 3d 25 30 34 6c 6c 78 20 70 72 65 72 65 71 4f  n=%04llx prereqO
1d580 75 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20  ut=%04llx\n",.  
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5a0 20 20 20 20 2a 70 62 49 6e 2c 20 28 73 71 6c 69      *pbIn, (sqli
1d5b0 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 72  te3_uint64)mPrer
1d5c0 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
1d5d0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1d5e0 65 33 5f 75 69 6e 74 36 34 29 28 70 4e 65 77 2d  e3_uint64)(pNew-
1d5f0 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72  >prereq & ~mPrer
1d600 65 71 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  eq)));..  return
1d610 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
1d620 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1d630 73 20 69 6e 76 6f 6b 65 64 20 66 72 6f 6d 20 77  s invoked from w
1d640 69 74 68 69 6e 20 61 6e 20 78 42 65 73 74 49 6e  ithin an xBestIn
1d650 64 65 78 28 29 20 63 61 6c 6c 62 61 63 6b 2c 20  dex() callback, 
1d660 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  it.** returns a 
1d670 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
1d680 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
1d690 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  he name of the c
1d6a0 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
1d6b0 65 6e 63 65 20 61 73 73 6f 63 69 61 74 65 64 20  ence associated 
1d6c0 77 69 74 68 20 65 6c 65 6d 65 6e 74 20 69 43 6f  with element iCo
1d6d0 6e 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ns of the sqlite
1d6e0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e 61 43 6f  3_index_info.aCo
1d6f0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 61 72 72 61  nstraint.** arra
1d700 79 2e 20 4f 72 2c 20 69 66 20 69 43 6f 6e 73 20  y. Or, if iCons 
1d710 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
1d720 6f 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61  or there is no a
1d730 63 74 69 76 65 20 78 42 65 73 74 49 6e 64 65 78  ctive xBestIndex
1d740 0a 2a 2a 20 63 61 6c 6c 2c 20 72 65 74 75 72 6e  .** call, return
1d750 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   NULL..*/.const 
1d760 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 76 74  char *sqlite3_vt
1d770 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 73 71 6c  ab_collation(sql
1d780 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1d790 2a 70 49 64 78 49 6e 66 6f 2c 20 69 6e 74 20 69  *pIdxInfo, int i
1d7a0 43 6f 6e 73 29 7b 0a 20 20 48 69 64 64 65 6e 49  Cons){.  HiddenI
1d7b0 6e 64 65 78 49 6e 66 6f 20 2a 70 48 69 64 64 65  ndexInfo *pHidde
1d7c0 6e 20 3d 20 28 48 69 64 64 65 6e 49 6e 64 65 78  n = (HiddenIndex
1d7d0 49 6e 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f 5b  Info*)&pIdxInfo[
1d7e0 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  1];.  const char
1d7f0 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *zRet = 0;.  if
1d800 28 20 69 43 6f 6e 73 3e 3d 30 20 26 26 20 69 43  ( iCons>=0 && iC
1d810 6f 6e 73 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ons<pIdxInfo->nC
1d820 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
1d830 20 43 6f 6c 6c 53 65 71 20 2a 70 43 20 3d 20 30   CollSeq *pC = 0
1d840 3b 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20  ;.    int iTerm 
1d850 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
1d860 73 74 72 61 69 6e 74 5b 69 43 6f 6e 73 5d 2e 69  straint[iCons].i
1d870 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
1d880 45 78 70 72 20 2a 70 58 20 3d 20 70 48 69 64 64  Expr *pX = pHidd
1d890 65 6e 2d 3e 70 57 43 2d 3e 61 5b 69 54 65 72 6d  en->pWC->a[iTerm
1d8a0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1d8b0 20 70 58 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pX->pLeft ){.  
1d8c0 20 20 20 20 70 43 20 3d 20 73 71 6c 69 74 65 33      pC = sqlite3
1d8d0 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
1d8e0 6c 53 65 71 28 70 48 69 64 64 65 6e 2d 3e 70 50  lSeq(pHidden->pP
1d8f0 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
1d900 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
1d910 20 20 7d 0a 20 20 20 20 7a 52 65 74 20 3d 20 28    }.    zRet = (
1d920 70 43 20 3f 20 70 43 2d 3e 7a 4e 61 6d 65 20 3a  pC ? pC->zName :
1d930 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1d940 59 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Y);.  }.  return
1d950 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
1d960 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
1d970 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
1d980 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
1d990 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  n identified by.
1d9a0 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ** pBuilder->pNe
1d9b0 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
1d9c0 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
1d9d0 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75  ed to be a virtu
1d9e0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
1d9f0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1da00 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1da10 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20  IN joins in the 
1da20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 50 72 65  query, both mPre
1da30 72 65 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73  req and.** mUnus
1da40 61 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20  able are set to 
1da50 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 50  0. Otherwise, mP
1da60 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20  rereq is a mask 
1da70 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  of all FROM clau
1da80 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68  se.** entries th
1da90 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
1daa0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1dab0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
1dac0 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20  ause and are.** 
1dad0 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69  separated from i
1dae0 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e  t by at least on
1daf0 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  e LEFT or CROSS 
1db00 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  JOIN. Similarly,
1db10 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   the.** mUnusabl
1db20 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
1db30 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
1db40 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63  entries that occ
1db50 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20  ur after the.** 
1db60 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e  virtual table an
1db70 64 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  d are separated 
1db80 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65  from it by at le
1db90 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20  ast one LEFT or 
1dba0 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20  .** CROSS JOIN. 
1dbb0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1dbc0 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
1dbd0 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e   were:.**.**   .
1dbe0 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c  .. FROM t1, t2 L
1dbf0 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c  EFT JOIN t3, t4,
1dc00 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74   vt CROSS JOIN t
1dc10 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  5, t6;.**.** the
1dc20 6e 20 6d 50 72 65 72 65 71 20 63 6f 72 72 65 73  n mPrereq corres
1dc30 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32  ponds to (t1, t2
1dc40 29 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20  ) and mUnusable 
1dc50 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a  to (t5, t6)..**.
1dc60 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65  ** All the table
1dc70 73 20 69 6e 20 6d 50 72 65 72 65 71 20 6d 75 73  s in mPrereq mus
1dc80 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66  t be scanned bef
1dc90 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
1dca0 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c  virtual .** tabl
1dcb0 65 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20  e. So any terms 
1dcc0 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72  for which all pr
1dcd0 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20  erequisites are 
1dce0 73 61 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a  satisfied by .**
1dcf0 20 6d 50 72 65 72 65 71 20 6d 61 79 20 62 65 20   mPrereq may be 
1dd00 73 70 65 63 69 66 69 65 64 20 61 73 20 22 75 73  specified as "us
1dd10 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c  able" in all cal
1dd20 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
1dd30 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79  . .** Conversely
1dd40 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  , all tables in 
1dd50 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62  mUnusable must b
1dd60 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
1dd70 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76  the current.** v
1dd80 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f  irtual table, so
1dd90 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77   any terms for w
1dda0 68 69 63 68 20 74 68 65 20 70 72 65 72 65 71 75  hich the prerequ
1ddb0 69 73 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77  isites overlap w
1ddc0 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  ith.** mUnusable
1ddd0 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1dde0 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20  e configured as 
1ddf0 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72  "not-usable" for
1de00 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a   xBestIndex..*/.
1de10 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1de20 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a  LoopAddVirtual(.
1de30 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
1de40 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f  er *pBuilder,  /
1de50 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
1de60 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
1de70 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c  Bitmask mPrereq,
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de90 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  Tables that must
1dea0 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f   be scanned befo
1deb0 72 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  re this one */. 
1dec0 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1ded0 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le            /*
1dee0 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73   Tables that mus
1def0 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74  t be scanned aft
1df00 65 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29  er this one */.)
1df10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1df20 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1df30 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1df40 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
1df50 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
1df60 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
1df70 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
1df80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dfa0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1dfb0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
1dfc0 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
1dfd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1dfe0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1dff0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1e000 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  tem *pSrc;   /* 
1e010 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1e020 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
1e030 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  /.  sqlite3_inde
1e040 78 5f 69 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20  x_info *p;      
1e050 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 61   /* Object to pa
1e060 73 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ss to xBestIndex
1e070 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e  () */.  int nCon
1e080 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
1e090 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e0a0 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  f constraints in
1e0b0 20 70 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b   p */.  int bIn;
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e0e0 70 6c 61 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e  plan uses IN(...
1e0f0 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  ) operator */.  
1e100 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
1e110 0a 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74  .  Bitmask mBest
1e120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e130 2f 2a 20 54 61 62 6c 65 73 20 75 73 65 64 20 62  /* Tables used b
1e140 79 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20  y best possible 
1e150 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20 6d 4e  plan */.  u16 mN
1e160 6f 4f 6d 69 74 3b 0a 0a 20 20 61 73 73 65 72 74  oOmit;..  assert
1e170 28 20 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e  ( (mPrereq & mUn
1e180 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  usable)==0 );.  
1e190 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1e1a0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61  r->pWInfo;.  pPa
1e1b0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1e1c0 61 72 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42  arse;.  pWC = pB
1e1d0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1e1e0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1e1f0 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26  pNew;.  pSrc = &
1e200 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1e210 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
1e220 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
1e230 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
1e240 20 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61   );.  p = alloca
1e250 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
1e260 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62  se, pWC, mUnusab
1e270 6c 65 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  le, pSrc, pBuild
1e280 65 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20  er->pOrderBy, . 
1e290 20 20 20 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a       &mNoOmit);.
1e2a0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1e2b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1e2c0 5f 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72  _BKPT;.  pNew->r
1e2d0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
1e2e0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
1e2f0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
1e300 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
1e310 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
1e320 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1e330 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ;.  nConstraint 
1e340 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  = p->nConstraint
1e350 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
1e360 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
1e370 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
1e380 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71  raint) ){.    sq
1e390 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1e3a0 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20  se->db, p);.    
1e3b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1e3c0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
1e3d0 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 20 78   /* First call x
1e3e0 42 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68  BestIndex() with
1e3f0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
1e400 20 75 73 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48   usable. */.  WH
1e410 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20  ERETRACE(0x800, 
1e420 28 22 42 45 47 49 4e 20 25 73 2e 61 64 64 56 69  ("BEGIN %s.addVi
1e430 72 74 75 61 6c 28 29 5c 6e 22 2c 20 70 53 72 63  rtual()\n", pSrc
1e440 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1e450 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
1e460 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1e470 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 5c 6e  ne: all usable\n
1e480 22 29 29 3b 0a 20 20 72 63 20 3d 20 77 68 65 72  "));.  rc = wher
1e490 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1e4a0 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  ne(pBuilder, mPr
1e4b0 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 30  ereq, ALLBITS, 0
1e4c0 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1e4d0 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  In);..  /* If th
1e4e0 65 20 63 61 6c 6c 20 74 6f 20 78 42 65 73 74 49  e call to xBestI
1e4f0 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20  ndex() with all 
1e500 74 65 72 6d 73 20 65 6e 61 62 6c 65 64 20 70 72  terms enabled pr
1e510 6f 64 75 63 65 64 20 61 20 70 6c 61 6e 0a 20 20  oduced a plan.  
1e520 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
1e530 20 72 65 71 75 69 72 65 20 61 6e 79 20 73 6f 75   require any sou
1e540 72 63 65 20 74 61 62 6c 65 73 20 28 49 4f 57 3a  rce tables (IOW:
1e550 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6d 42 65   a plan with mBe
1e560 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74 68 65  st==0),.  ** the
1e570 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  n there is no po
1e580 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67 20 61 6e  int in making an
1e590 79 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20  y further calls 
1e5a0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1e5b0 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 79  .  ** since they
1e5c0 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74 75 72 6e   will all return
1e5d0 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1e5e0 20 28 69 66 20 74 68 65 20 78 42 65 73 74 49 6e   (if the xBestIn
1e5f0 64 65 78 28 29 0a 20 20 2a 2a 20 69 6d 70 6c 65  dex().  ** imple
1e600 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 73 61 6e  mentation is san
1e610 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  e). */.  if( rc=
1e620 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6d  =SQLITE_OK && (m
1e630 42 65 73 74 20 3d 20 28 70 4e 65 77 2d 3e 70 72  Best = (pNew->pr
1e640 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29  ereq & ~mPrereq)
1e650 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
1e660 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20  seenZero = 0;   
1e670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e680 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69 74 68  e if a plan with
1e690 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65 65 6e   no prereqs seen
1e6a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   */.    int seen
1e6b0 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20  ZeroNoIN = 0;   
1e6c0 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69        /* Plan wi
1e6d0 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 61 6e  th no prereqs an
1e6e0 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65  d no IN(...) see
1e6f0 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  n */.    Bitmask
1e700 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   mPrev = 0;.    
1e710 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49  Bitmask mBestNoI
1e720 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  n = 0;..    /* I
1e730 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f 64 75  f the plan produ
1e740 63 65 64 20 62 79 20 74 68 65 20 65 61 72 6c 69  ced by the earli
1e750 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61 6e 20  er call uses an 
1e760 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61  IN(...) term, ca
1e770 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73 74 49  ll.    ** xBestI
1e780 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68 69 73  ndex again, this
1e790 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e   time with IN(..
1e7a0 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62 6c 65  .) terms disable
1e7b0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49  d. */.    if( bI
1e7c0 6e 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45  n ){.      WHERE
1e7d0 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1e7e0 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1e7f0 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22  usable w/o IN\n"
1e800 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
1e810 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1e820 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20  alOne(.         
1e830 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72   pBuilder, mPrer
1e840 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f  eq, ALLBITS, WO_
1e850 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20  IN, p, mNoOmit, 
1e860 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  &bIn);.      ass
1e870 65 72 74 28 20 62 49 6e 3d 3d 30 20 29 3b 0a 20  ert( bIn==0 );. 
1e880 20 20 20 20 20 6d 42 65 73 74 4e 6f 49 6e 20 3d       mBestNoIn =
1e890 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20   pNew->prereq & 
1e8a0 7e 6d 50 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ~mPrereq;.      
1e8b0 69 66 28 20 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30  if( mBestNoIn==0
1e8c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   ){.        seen
1e8d0 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  Zero = 1;.      
1e8e0 20 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d    seenZeroNoIN =
1e8f0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1e900 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78  }..    /* Call x
1e910 42 65 73 74 49 6e 64 65 78 20 6f 6e 63 65 20 66  BestIndex once f
1e920 6f 72 20 65 61 63 68 20 64 69 73 74 69 6e 63 74  or each distinct
1e930 20 76 61 6c 75 65 20 6f 66 20 28 70 72 65 72 65   value of (prere
1e940 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65  qRight & ~mPrere
1e950 71 29 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  q) .    ** in th
1e960 65 20 73 65 74 20 6f 66 20 74 65 72 6d 73 20 74  e set of terms t
1e970 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74 68 65  hat apply to the
1e980 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
1e990 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
1e9a0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1e9b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
1e9c0 74 20 69 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  t i;.      Bitma
1e9d0 73 6b 20 6d 4e 65 78 74 20 3d 20 41 4c 4c 42 49  sk mNext = ALLBI
1e9e0 54 53 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  TS;.      assert
1e9f0 28 20 6d 4e 65 78 74 3e 30 20 29 3b 0a 20 20 20  ( mNext>0 );.   
1ea00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1ea10 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
1ea20 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
1ea30 20 6d 54 68 69 73 20 3d 20 28 0a 20 20 20 20 20   mThis = (.     
1ea40 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 70 2d         pWC->a[p-
1ea50 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
1ea60 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65  iTermOffset].pre
1ea70 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65  reqRight & ~mPre
1ea80 72 65 71 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  req.        );. 
1ea90 20 20 20 20 20 20 20 69 66 28 20 6d 54 68 69 73         if( mThis
1eaa0 3e 6d 50 72 65 76 20 26 26 20 6d 54 68 69 73 3c  >mPrev && mThis<
1eab0 6d 4e 65 78 74 20 29 20 6d 4e 65 78 74 20 3d 20  mNext ) mNext = 
1eac0 6d 54 68 69 73 3b 0a 20 20 20 20 20 20 7d 0a 20  mThis;.      }. 
1ead0 20 20 20 20 20 6d 50 72 65 76 20 3d 20 6d 4e 65       mPrev = mNe
1eae0 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e  xt;.      if( mN
1eaf0 65 78 74 3d 3d 41 4c 4c 42 49 54 53 20 29 20 62  ext==ALLBITS ) b
1eb00 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
1eb10 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20  mNext==mBest || 
1eb20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e  mNext==mBestNoIn
1eb30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1eb40 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1eb50 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1eb60 6e 65 3a 20 6d 50 72 65 76 3d 25 30 34 6c 6c 78  ne: mPrev=%04llx
1eb70 20 6d 4e 65 78 74 3d 25 30 34 6c 6c 78 5c 6e 22   mNext=%04llx\n"
1eb80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1eb90 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
1eba0 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 76 2c 20  3_uint64)mPrev, 
1ebb0 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1ebc0 6d 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 72  mNext));.      r
1ebd0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1ebe0 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20  VirtualOne(.    
1ebf0 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20        pBuilder, 
1ec00 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78 74 7c 6d  mPrereq, mNext|m
1ec10 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e  Prereq, 0, p, mN
1ec20 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1ec30 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 72      if( pNew->pr
1ec40 65 72 65 71 3d 3d 6d 50 72 65 72 65 71 20 29 7b  ereq==mPrereq ){
1ec50 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1ec60 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  o = 1;.        i
1ec70 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e  f( bIn==0 ) seen
1ec80 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20  ZeroNoIN = 1;.  
1ec90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1eca0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73   /* If the calls
1ecb0 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1ecc0 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 6c 6f   in the above lo
1ecd0 6f 70 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  op did not find 
1ece0 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68  a plan.    ** th
1ecf0 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73  at requires no s
1ed00 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61 74 20  ource tables at 
1ed10 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65 20 67 75  all (i.e. one gu
1ed20 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 20  aranteed to be. 
1ed30 20 20 20 2a 2a 20 75 73 61 62 6c 65 29 2c 20 6d     ** usable), m
1ed40 61 6b 65 20 61 20 63 61 6c 6c 20 68 65 72 65 20  ake a call here 
1ed50 77 69 74 68 20 61 6c 6c 20 73 6f 75 72 63 65 20  with all source 
1ed60 74 61 62 6c 65 73 20 64 69 73 61 62 6c 65 64 20  tables disabled 
1ed70 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1ed80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e  QLITE_OK && seen
1ed90 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Zero==0 ){.     
1eda0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1edb0 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1edc0 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 5c 6e  : all disabled\n
1edd0 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "));.      rc = 
1ede0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1edf0 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20  ualOne(.        
1ee00 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65    pBuilder, mPre
1ee10 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c  req, mPrereq, 0,
1ee20 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49   p, mNoOmit, &bI
1ee30 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  n);.      if( bI
1ee40 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e  n==0 ) seenZeroN
1ee50 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  oIN = 1;.    }..
1ee60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
1ee70 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1ee80 78 28 29 20 68 61 76 65 20 73 6f 20 66 61 72 20  x() have so far 
1ee90 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61  failed to find a
1eea0 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61   plan.    ** tha
1eeb0 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f  t requires no so
1eec0 75 72 63 65 20 74 61 62 6c 65 73 20 61 74 20 61  urce tables at a
1eed0 6c 6c 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ll and does not 
1eee0 75 73 65 20 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20  use an IN(...). 
1eef0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2c 20     ** operator, 
1ef00 6d 61 6b 65 20 61 20 66 69 6e 61 6c 20 63 61 6c  make a final cal
1ef10 6c 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 20  l to obtain one 
1ef20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  here.  */.    if
1ef30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ef40 26 26 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d  && seenZeroNoIN=
1ef50 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52  =0 ){.      WHER
1ef60 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1ef70 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c   VirtualOne: all
1ef80 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 77 2f   disabled and w/
1ef90 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  o IN\n"));.     
1efa0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1efb0 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1efc0 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1efd0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72  , mPrereq, mPrer
1efe0 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e  eq, WO_IN, p, mN
1eff0 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1f000 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1f010 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1f020 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
1f030 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  e(p->idxStr);.  
1f040 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
1f050 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1f060 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
1f070 30 30 2c 20 28 22 45 4e 44 20 25 73 2e 61 64 64  00, ("END %s.add
1f080 56 69 72 74 75 61 6c 28 29 2c 20 72 63 3d 25 64  Virtual(), rc=%d
1f090 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
1f0a0 3e 7a 4e 61 6d 65 2c 20 72 63 29 29 3b 0a 20 20  >zName, rc));.  
1f0b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1f0c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1f0d0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1f0e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68  */../*.** Add Wh
1f0f0 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20  ereLoop entries 
1f100 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72  to handle OR ter
1f110 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ms.  This works 
1f120 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74  for either.** bt
1f130 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20  rees or virtual 
1f140 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
1f150 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1f160 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ddOr(.  WhereLoo
1f170 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1f180 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d  er, .  Bitmask m
1f190 50 72 65 72 65 71 2c 20 0a 20 20 42 69 74 6d 61  Prereq, .  Bitma
1f1a0 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a  sk mUnusable.){.
1f1b0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1f1c0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1f1d0 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43  pWInfo;.  WhereC
1f1e0 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
1f1f0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1f200 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1f210 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e  m, *pWCEnd;.  in
1f220 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f230 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
1f240 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70  WhereClause temp
1f250 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  WC;.  WhereLoopB
1f260 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64  uilder sSubBuild
1f270 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73  ;.  WhereOrSet s
1f280 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72  Sum, sCur;.  str
1f290 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f2a0 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57   *pItem;.  .  pW
1f2b0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
1f2c0 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57  C;.  pWCEnd = pW
1f2d0 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
1f2e0 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  m;.  pNew = pBui
1f2f0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65  lder->pNew;.  me
1f300 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73  mset(&sSum, 0, s
1f310 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20  izeof(sSum));.  
1f320 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
1f330 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
1f340 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72  ew->iTab;.  iCur
1f350 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
1f360 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  r;..  for(pTerm=
1f370 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
1f380 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
1f390 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
1f3a0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
1f3b0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1f3c0 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
1f3d0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1f3e0 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
1f3f0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
1f400 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
1f410 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
1f420 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
1f430 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
1f440 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
1f450 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
1f460 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
1f470 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
1f480 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1f490 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
1f4a0 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
1f4b0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
1f4c0 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
1f4d0 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
1f4e0 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
1f4f0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1f500 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53    sSubBuild.pOrS
1f510 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20  et = &sCur;..   
1f520 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1f530 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f  200, ("Begin pro
1f540 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1f550 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1f560 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ;.      for(pOrT
1f570 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
1f580 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
1f590 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
1f5a0 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
1f5b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1f5c0 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
1f5d0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1f5e0 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
1f5f0 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
1f600 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1f610 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
1f620 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
1f630 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1f640 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
1f650 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
1f660 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
1f670 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
1f680 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
1f690 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
1f6a0 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
1f6b0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1f6c0 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
1f6d0 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
1f6e0 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
1f6f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f700 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1f710 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1f720 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
1f730 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
1f740 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
1f750 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1f760 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25  200, ("OR-term %
1f770 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73  d of %p has %d s
1f780 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20  ubterms:\n", .  
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70   (int)(pOrTerm-p
1f7b0 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c  OrWC->a), pTerm,
1f7c0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e   sSubBuild.pWC->
1f7d0 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20  nTerm));.       
1f7e0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
1f7f0 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  eTrace & 0x400 )
1f800 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1f810 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72  te3WhereClausePr
1f820 69 6e 74 28 73 53 75 62 42 75 69 6c 64 2e 70 57  int(sSubBuild.pW
1f830 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  C);.        }.#e
1f840 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
1f850 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1f860 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66  TABLE.        if
1f870 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
1f880 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
1f890 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1f8a0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26  LoopAddVirtual(&
1f8b0 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72  sSubBuild, mPrer
1f8c0 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1f8d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
1f8e0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
1f8f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1f900 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1f910 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65  &sSubBuild, mPre
1f920 72 65 71 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  req);.        }.
1f930 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1f940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f950 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1f960 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62  eLoopAddOr(&sSub
1f970 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20  Build, mPrereq, 
1f980 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1f990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1f9a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1f9b0 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30  _OK || sCur.n==0
1f9c0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1f9d0 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  sCur.n==0 ){.   
1f9e0 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
1f9f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
1fa00 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1fa10 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20  e if( once ){.  
1fa20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
1fa30 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72  ove(&sSum, &sCur
1fa40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
1fa50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
1fa60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fa70 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76  WhereOrSet sPrev
1fa80 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  ;.          wher
1fa90 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20  eOrMove(&sPrev, 
1faa0 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  &sSum);.        
1fab0 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
1fac0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1fad0 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29   i<sPrev.n; i++)
1fae0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
1faf0 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b  r(j=0; j<sCur.n;
1fb00 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1fb10 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
1fb20 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e  rt(&sSum, sPrev.
1fb30 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43  a[i].prereq | sC
1fb40 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a  ur.a[j].prereq,.
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1fb70 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
1fb80 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43  ev.a[i].rRun, sC
1fb90 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20  ur.a[j].rRun),. 
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1fbc0 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1fbd0 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75  v.a[i].nOut, sCu
1fbe0 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20  r.a[j].nOut));. 
1fbf0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1fc00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fc10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1fc20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1fc30 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  1;.      pNew->a
1fc40 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
1fc50 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
1fc60 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55  Flags = WHERE_MU
1fc70 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e  LTI_OR;.      pN
1fc80 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
1fc90 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
1fca0 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  tIdx = 0;.      
1fcb0 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
1fcc0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
1fcd0 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >u));.      for(
1fce0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1fcf0 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20  OK && i<sSum.n; 
1fd00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
1fd10 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74   TUNING: Current
1fd20 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75  ly sSum.a[i].rRu
1fd30 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
1fd40 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73  sum of the costs
1fd50 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
1fd60 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71  ll sub-scans req
1fd70 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d  uired by the OR-
1fd80 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64  scan. However, d
1fd90 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20  ue to rounding. 
1fda0 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
1fdb0 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74  , it may be that
1fdc0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
1fdd0 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61   OR-scan is equa
1fde0 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20  l to its.       
1fdf0 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69   ** most expensi
1fe00 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64  ve sub-scan. Add
1fe10 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
1fe20 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a  ssible penalty .
1fe30 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69          ** (equi
1fe40 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70  valent to multip
1fe50 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62  lying the cost b
1fe60 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72  y 1.07) to ensur
1fe70 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  e that .        
1fe80 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ** this does not
1fe90 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69   happen. Otherwi
1fea0 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c  se, for WHERE cl
1feb0 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68  auses such as th
1fec0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c  e.        ** fol
1fed0 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65  lowing where the
1fee0 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
1fef0 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a  n "y":.        *
1ff00 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  *.        **    
1ff10 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f   WHERE likelihoo
1ff20 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20  d(x=?, 0.99) OR 
1ff30 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  y=?.        **. 
1ff40 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c         ** the pl
1ff50 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20  anner may elect 
1ff60 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72  to "OR" together
1ff70 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63   a full-table sc
1ff80 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  an and an.      
1ff90 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75    ** index looku
1ffa0 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d  p. And other sim
1ffb0 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c  ilarly odd resul
1ffc0 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ts.  */.        
1ffd0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75  pNew->rRun = sSu
1ffe0 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b  m.a[i].rRun + 1;
1fff0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
20000 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Out = sSum.a[i].
20010 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e  nOut;.        pN
20020 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75  ew->prereq = sSu
20030 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20  m.a[i].prereq;. 
20040 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
20050 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
20060 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
20070 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45     }.      WHERE
20080 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45  TRACE(0x200, ("E
20090 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  nd processing OR
200a0 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
200b0 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Term));.    }.  
200c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
200d0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
200e0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
200f0 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
20100 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
20110 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
20120 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
20130 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
20140 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
20150 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
20160 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  nfo;.  Bitmask m
20170 50 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 42 69  Prereq = 0;.  Bi
20180 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
20190 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
201a0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
201b0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
201c0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
201d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
201e0 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  em;.  struct Src
201f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20  List_item *pEnd 
20200 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
20210 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  WInfo->nLevel];.
20220 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20230 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
20240 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
20250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
20260 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75  eLoop *pNew;.  u
20270 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20  8 priorJointype 
20280 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  = 0;..  /* Loop 
20290 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
202a0 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
202b0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
202c0 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
202d0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
202e0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
202f0 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 69  );.  pBuilder->i
20300 50 6c 61 6e 4c 69 6d 69 74 20 3d 20 53 51 4c 49  PlanLimit = SQLI
20310 54 45 5f 51 55 45 52 59 5f 50 4c 41 4e 4e 45 52  TE_QUERY_PLANNER
20320 5f 4c 49 4d 49 54 3b 0a 20 20 66 6f 72 28 69 54  _LIMIT;.  for(iT
20330 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62  ab=0, pItem=pTab
20340 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70  List->a; pItem<p
20350 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74  End; iTab++, pIt
20360 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61  em++){.    Bitma
20370 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20 30  sk mUnusable = 0
20380 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62  ;.    pNew->iTab
20390 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 42 75   = iTab;.    pBu
203a0 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69  ilder->iPlanLimi
203b0 74 20 2b 3d 20 53 51 4c 49 54 45 5f 51 55 45 52  t += SQLITE_QUER
203c0 59 5f 50 4c 41 4e 4e 45 52 5f 4c 49 4d 49 54 5f  Y_PLANNER_LIMIT_
203d0 49 4e 43 52 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  INCR;.    pNew->
203e0 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74  maskSelf = sqlit
203f0 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
20400 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
20410 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
20420 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74  );.    if( ((pIt
20430 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c  em->fg.jointype|
20440 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26  priorJointype) &
20450 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
20460 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
20470 20 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69   /* This conditi
20480 6f 6e 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  on is true when 
20490 70 49 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f  pItem is the FRO
204a0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e  M clause term on
204b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69   the.      ** ri
204c0 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  ght-hand-side of
204d0 20 61 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53   a LEFT or CROSS
204e0 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20   JOIN.  */.     
204f0 20 6d 50 72 65 72 65 71 20 3d 20 6d 50 72 69 6f   mPrereq = mPrio
20500 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  r;.    }.    pri
20510 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74  orJointype = pIt
20520 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  em->fg.jointype;
20530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20540 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
20550 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  E.    if( IsVirt
20560 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
20570 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
20580 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
20590 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70  ;.      for(p=&p
205a0 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b  Item[1]; p<pEnd;
205b0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   p++){.        i
205c0 66 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20  f( mUnusable || 
205d0 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  (p->fg.jointype 
205e0 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
205f0 4f 53 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20  OSS)) ){.       
20600 20 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20     mUnusable |= 
20610 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
20620 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
20630 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f  skSet, p->iCurso
20640 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
20650 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
20660 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
20670 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d  tual(pBuilder, m
20680 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c  Prereq, mUnusabl
20690 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  e);.    }else.#e
206a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
206b0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
206c0 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
206d0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
206e0 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c  dBtree(pBuilder,
206f0 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20 7d   mPrereq);.    }
20700 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20710 49 54 45 5f 4f 4b 20 26 26 20 70 42 75 69 6c 64  ITE_OK && pBuild
20720 65 72 2d 3e 70 57 43 2d 3e 68 61 73 4f 72 20 29  er->pWC->hasOr )
20730 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
20740 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
20750 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
20760 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d  Unusable);.    }
20770 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
20780 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
20790 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
207a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
207b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
207c0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
207d0 20 20 20 20 20 20 2f 2a 20 57 65 20 68 69 74 20        /* We hit 
207e0 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
207f0 72 20 73 65 61 72 63 68 20 6c 69 6d 69 74 20 73  r search limit s
20800 65 74 20 62 79 20 69 50 6c 61 6e 4c 69 6d 69 74  et by iPlanLimit
20810 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
20820 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
20830 41 52 4e 49 4e 47 2c 20 22 61 62 62 72 65 76 69  ARNING, "abbrevi
20840 61 74 65 64 20 71 75 65 72 79 20 61 6c 67 6f 72  ated query algor
20850 69 74 68 6d 20 73 65 61 72 63 68 22 29 3b 0a 20  ithm search");. 
20860 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20870 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
20880 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  se{.        brea
20890 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
208a0 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c 6f 6f  .  }..  whereLoo
208b0 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29  pClear(db, pNew)
208c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
208d0 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20  ../*.** Examine 
208e0 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74  a WherePath (wit
208f0 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  h the addition o
20900 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72  f the extra Wher
20910 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 36 74 68  eLoop of the 6th
20920 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20  .** parameters) 
20930 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74  to see if it out
20940 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65  puts rows in the
20950 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52   requested ORDER
20960 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50   BY.** (or GROUP
20970 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71   BY) without req
20980 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74  uiring a separat
20990 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e  e sort operation
209a0 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20  .  Return N:.** 
209b0 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74  .**   N>0:   N t
209c0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
209d0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
209e0 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
209f0 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f  ==0:  No terms o
20a00 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
20a10 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
20a20 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20  ied.**   N<0:   
20a30 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20  Unknown yet how 
20a40 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f 52  many terms of OR
20a50 44 45 52 20 42 59 20 6d 69 67 68 74 20 62 65 20  DER BY might be 
20a60 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a  satisfied.   .**
20a70 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72  .** Note that pr
20a80 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45  ocessing for WHE
20a90 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57  RE_GROUPBY and W
20aa0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
20ab0 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72  is not as.** str
20ac0 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50  ict.  With GROUP
20ad0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
20ae0 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72   the only requir
20af0 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a  ement is that.**
20b00 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
20b10 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74   appear immediat
20b20 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20  ely adjacent to 
20b30 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52  one another.  GR
20b40 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49  OUP BY.** and DI
20b50 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65  STINCT do not re
20b60 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70  quire rows to ap
20b70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74  pear in any part
20b80 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20  icular order as 
20b90 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76  long.** as equiv
20ba0 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67  alent rows are g
20bb0 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
20bc0 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50    Thus for GROUP
20bd0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
20be0 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79  .** the pOrderBy
20bf0 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61   terms can be ma
20c00 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64  tched in any ord
20c10 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20  er.  With ORDER 
20c20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64  BY, the .** pOrd
20c30 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20  erBy terms must 
20c40 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74  be matched in st
20c50 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67  rict left-to-rig
20c60 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ht order..*/.sta
20c70 74 69 63 20 69 38 20 77 68 65 72 65 50 61 74 68  tic i8 wherePath
20c80 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
20c90 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
20ca0 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65  WInfo,    /* The
20cb0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
20cc0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
20cd0 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45  derBy,   /* ORDE
20ce0 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
20cf0 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61   or DISTINCT cla
20d00 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  use to check */.
20d10 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61    WherePath *pPa
20d20 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  th,     /* The W
20d30 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63  herePath to chec
20d40 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  k */.  u16 wctrl
20d50 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
20d60 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
20d70 20 5f 44 49 53 54 49 4e 43 54 42 59 20 6f 72 20   _DISTINCTBY or 
20d80 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 2a  _ORDERBY_LIMIT *
20d90 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20  /.  u16 nLoop,  
20da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20db0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
20dc0 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  n pPath->aLoop[]
20dd0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
20de0 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pLast,     /* A
20df0 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  dd this WhereLoo
20e00 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
20e10 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a  pPath->aLoop[] *
20e20 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65  /.  Bitmask *pRe
20e30 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54  vMask     /* OUT
20e40 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c  : Mask of WhereL
20e50 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72  oops to run in r
20e60 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
20e70 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20  ){.  u8 revSet; 
20e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20e90 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f  ue if rev is kno
20ea0 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20  wn */.  u8 rev; 
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ec0 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20   Composite sort 
20ed0 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  order */.  u8 re
20ee0 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  vIdx;           
20ef0 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f   /* Index sort o
20f00 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f  rder */.  u8 isO
20f10 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20  rderDistinct;   
20f20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65  /* All prior Whe
20f30 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65  reLoops are orde
20f40 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  r-distinct */.  
20f50 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  u8 distinctColum
20f60 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ns;   /* True if
20f70 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e   the loop has UN
20f80 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  IQUE NOT NULL co
20f90 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73  lumns */.  u8 is
20fa0 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  Match;          
20fb0 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63   /* iColumn matc
20fc0 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  hes a term of th
20fd0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
20fe0 65 20 2a 2f 0a 20 20 75 31 36 20 65 71 4f 70 4d  e */.  u16 eqOpM
20ff0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ask;         /* 
21000 41 6c 6c 6f 77 65 64 20 65 71 75 61 6c 69 74 79  Allowed equality
21010 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
21020 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  u16 nKeyCol;    
21030 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21040 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  of key columns i
21050 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31  n pIndex */.  u1
21060 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  6 nColumn;      
21070 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
21080 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63  ber of ordered c
21090 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
210a0 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72  dex */.  u16 nOr
210b0 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
210c0 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69  * Number terms i
210d0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
210e0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
210f0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
21100 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65   /* Index of Whe
21110 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20  reLoop in pPath 
21120 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20  being processed 
21130 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
21140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21150 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
21160 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
21170 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
21180 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72   number for curr
21190 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ent WhereLoop */
211a0 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
211b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
211c0 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
211d0 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f  in table iCur */
211e0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
211f0 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72  oop = 0; /* Curr
21200 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65  ent WhereLoop be
21210 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a  ing processed. *
21220 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
21230 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73  Term;     /* A s
21240 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
21250 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
21260 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70  /.  Expr *pOBExp
21270 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  r;        /* An 
21280 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
21290 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
212a0 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  use */.  CollSeq
212b0 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f   *pColl;       /
212c0 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69  * COLLATE functi
212d0 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52  on from an ORDER
212e0 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20   BY clause term 
212f0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
21300 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ex;        /* Th
21310 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  e index associat
21320 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f  ed with pLoop */
21330 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21340 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
21350 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
21360 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
21370 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20    Bitmask obSat 
21380 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  = 0;    /* Mask 
21390 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
213a0 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66  s satisfied so f
213b0 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ar */.  Bitmask 
213c0 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a  obDone;       /*
213d0 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44   Mask of all ORD
213e0 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
213f0 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69   Bitmask orderDi
21400 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20  stinctMask;  /* 
21410 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c  Mask of all well
21420 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a  -ordered loops *
21430 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64  /.  Bitmask read
21440 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
21450 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72  /* Mask of inner
21460 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a   loops */..  /*.
21470 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
21480 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e  WhereLoop is "on
21490 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e  e-row" if it gen
214a0 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74  erates no more t
214b0 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77  han one.  ** row
214c0 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57   of output.  A W
214d0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d  hereLoop is one-
214e0 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  row if all of th
214f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
21500 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20  true:.  **  (a) 
21510 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  All index column
21520 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45  s match with WHE
21530 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20  RE_COLUMN_EQ..  
21540 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65  **  (b) The inde
21550 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a  x is unique.  **
21560 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77   Any WhereLoop w
21570 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c  ith an WHERE_COL
21580 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e  UMN_EQ constrain
21590 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69  t on the rowid i
215a0 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20  s one-row..  ** 
215b0 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
215c0 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76  ereLoop will hav
215d0 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52  e the WHERE_ONER
215e0 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73  OW bit set in ws
215f0 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Flags..  **.  **
21600 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
21610 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d  eLoop is "order-
21620 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65  distinct" if the
21630 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   set of columns 
21640 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57  from.  ** that W
21650 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72  hereLoop that ar
21660 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  e in the ORDER B
21670 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66  Y clause are dif
21680 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
21690 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
216a0 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65   WhereLoop.  Eve
216b0 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
216c0 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69  Loop is automati
216d0 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72  cally.  ** order
216e0 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57  -distinct.   A W
216f0 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61  hereLoop that ha
21700 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s no columns in 
21710 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
21720 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  use.  ** is not 
21730 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
21740 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
21750 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74  inct is not quit
21760 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65  e the same as be
21770 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20  ing.  ** UNIQUE 
21780 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63  since a UNIQUE c
21790 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63  olumn or index c
217a0 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
217b0 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a   rows that .  **
217c0 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55   are NULL and NU
217d0 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71  LL values are eq
217e0 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65  uivalent for the
217f0 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65   purpose of orde
21800 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a  r-distinct..  **
21810 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
21820 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d  tinct, the colum
21830 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55  ns must be UNIQU
21840 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  E and NOT NULL..
21850 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f    **.  ** The ro
21860 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20  wid for a table 
21870 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45  is always UNIQUE
21880 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f   and NOT NULL so
21890 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20   whenever the.  
218a0 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73  ** rowid appears
218b0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
218c0 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72   clause, the cor
218d0 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
218e0 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74  Loop is.  ** aut
218f0 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72  omatically order
21900 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a  -distinct..  */.
21910 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
21920 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  rBy!=0 );.  if( 
21930 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a  nLoop && Optimiz
21940 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
21950 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79  , SQLITE_OrderBy
21960 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  IdxJoin) ) retur
21970 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79  n 0;..  nOrderBy
21980 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
21990 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  pr;.  testcase( 
219a0 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20  nOrderBy==BMS-1 
219b0 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
219c0 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e  y>BMS-1 ) return
219d0 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f   0;  /* Cannot o
219e0 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c  ptimize overly l
219f0 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a  arge ORDER BYs *
21a00 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69  /.  isOrderDisti
21a10 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e  nct = 1;.  obDon
21a20 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64  e = MASKBIT(nOrd
21a30 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72  erBy)-1;.  order
21a40 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30  DistinctMask = 0
21a50 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20  ;.  ready = 0;. 
21a60 20 65 71 4f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45   eqOpMask = WO_E
21a70 51 20 7c 20 57 4f 5f 49 53 20 7c 20 57 4f 5f 49  Q | WO_IS | WO_I
21a80 53 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 77 63 74  SNULL;.  if( wct
21a90 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21aa0 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 20  ORDERBY_LIMIT ) 
21ab0 65 71 4f 70 4d 61 73 6b 20 7c 3d 20 57 4f 5f 49  eqOpMask |= WO_I
21ac0 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  N;.  for(iLoop=0
21ad0 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ; isOrderDistinc
21ae0 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e  t && obSat<obDon
21af0 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f  e && iLoop<=nLoo
21b00 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
21b10 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72   if( iLoop>0 ) r
21b20 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  eady |= pLoop->m
21b30 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28  askSelf;.    if(
21b40 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 29 7b 0a   iLoop<nLoop ){.
21b50 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 50        pLoop = pP
21b60 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  ath->aLoop[iLoop
21b70 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 77 63 74  ];.      if( wct
21b80 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21b90 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 20  ORDERBY_LIMIT ) 
21ba0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65  continue;.    }e
21bb0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  lse{.      pLoop
21bc0 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 7d 0a   = pLast;.    }.
21bd0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
21be0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
21bf0 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
21c00 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
21c10 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
21c20 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e   ) obSat = obDon
21c30 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
21c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21c50 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
21c60 6e 49 64 78 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nIdxCol = 0;.   
21c70 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57   }.    iCur = pW
21c80 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
21c90 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69  a[pLoop->iTab].i
21ca0 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20  Cursor;..    /* 
21cb0 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44  Mark off any ORD
21cc0 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61  ER BY term X tha
21cd0 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
21ce0 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20   the table of.  
21cf0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
21d00 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20   loop for which 
21d10 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e  there is term in
21d20 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a   the WHERE.    *
21d30 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
21d40 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f  form X IS NULL o
21d50 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72  r X=? that refer
21d60 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a  ence only outer.
21d70 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20      ** loops..  
21d80 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
21d90 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
21da0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41  +){.      if( MA
21db0 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
21dc0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21dd0 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
21de0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
21df0 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
21e00 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
21e10 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
21e20 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
21e30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
21e40 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
21e50 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
21e60 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  ue;.      pTerm 
21e70 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  = sqlite3WhereFi
21e80 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e  ndTerm(&pWInfo->
21e90 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78  sWC, iCur, pOBEx
21ea0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 20 20 20 20 7e 72 65 61 64 79 2c 20 65 71 4f 70      ~ready, eqOp
21ed0 4d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  Mask, 0);.      
21ee0 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
21ef0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
21f00 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
21f10 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a 20 20  tor==WO_IN ){.  
21f20 20 20 20 20 20 20 2f 2a 20 49 4e 20 74 65 72 6d        /* IN term
21f30 73 20 61 72 65 20 6f 6e 6c 79 20 76 61 6c 69 64  s are only valid
21f40 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69 6e 20   for sorting in 
21f50 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c 49 4d  the ORDER BY LIM
21f60 49 54 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  IT .        ** o
21f70 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 61 6e 64  ptimization, and
21f80 20 74 68 65 6e 20 6f 6e 6c 79 20 69 66 20 74 68   then only if th
21f90 65 79 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  ey are actually 
21fa0 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
21fb0 62 79 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  by the query pla
21fc0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  n */.        ass
21fd0 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ert( wctrlFlags 
21fe0 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  & WHERE_ORDERBY_
21ff0 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 20 20 20  LIMIT );.       
22000 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f   for(j=0; j<pLoo
22010 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70 54 65  p->nLTerm && pTe
22020 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  rm!=pLoop->aLTer
22030 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  m[j]; j++){}.   
22040 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 4c 6f 6f       if( j>=pLoo
22050 70 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f 6e 74  p->nLTerm ) cont
22060 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
22070 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
22080 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51  eOperator&(WO_EQ
22090 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20 70  |WO_IS))!=0 && p
220a0 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e  OBExpr->iColumn>
220b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
220c0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  ( sqlite3ExprCol
220d0 6c 53 65 71 4d 61 74 63 68 28 70 57 49 6e 66 6f  lSeqMatch(pWInfo
220e0 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  ->pParse, .     
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
22100 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
22110 72 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29  r, pTerm->pExpr)
22120 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22130 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
22150 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
22160 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
22170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22180 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
22190 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (i);.    }..    
221a0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
221b0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
221c0 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OW)==0 ){.      
221d0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
221e0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29  gs & WHERE_IPK )
221f0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
22200 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b   = 0;.        nK
22210 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  eyCol = 0;.     
22220 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a     nColumn = 1;.
22230 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
22240 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  (pIndex = pLoop-
22250 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
22260 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62  ==0 || pIndex->b
22270 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  Unordered ){.   
22280 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
22290 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
222a0 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49      nKeyCol = pI
222b0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  ndex->nKeyCol;. 
222c0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
222d0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
222e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
222f0 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43  ( nColumn==nKeyC
22300 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69  ol+1 || !HasRowi
22310 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  d(pIndex->pTable
22320 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
22330 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43  ert( pIndex->aiC
22340 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d  olumn[nColumn-1]
22350 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20  ==XN_ROWID.     
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22370 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69       || !HasRowi
22380 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  d(pIndex->pTable
22390 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72  ));.        isOr
223a0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73  derDistinct = Is
223b0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
223c0 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
223d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
223e0 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
223f0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
22400 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
22410 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
22420 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
22430 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
22440 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
22450 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
22460 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
22470 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
22480 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
22490 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
224a0 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 20         u8 bOnce 
224b0 3d 20 31 3b 20 2f 2a 20 54 72 75 65 20 74 6f 20  = 1; /* True to 
224c0 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  run the ORDER BY
224d0 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a   search loop */.
224e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
224f0 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   j>=pLoop->u.btr
22500 65 65 2e 6e 45 71 20 0a 20 20 20 20 20 20 20 20  ee.nEq .        
22510 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61      || (pLoop->a
22520 4c 54 65 72 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a  LTerm[j]==0)==(j
22530 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20  <pLoop->nSkip). 
22540 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
22550 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75    if( j<pLoop->u
22560 2e 62 74 72 65 65 2e 6e 45 71 20 26 26 20 6a 3e  .btree.nEq && j>
22570 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b  =pLoop->nSkip ){
22580 0a 20 20 20 20 20 20 20 20 20 20 75 31 36 20 65  .          u16 e
22590 4f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Op = pLoop->aLTe
225a0 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72  rm[j]->eOperator
225b0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
225c0 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64  Skip over == and
225d0 20 49 53 20 61 6e 64 20 49 53 4e 55 4c 4c 20 74   IS and ISNULL t
225e0 65 72 6d 73 2e 20 20 28 41 6c 73 6f 20 73 6b 69  erms.  (Also ski
225f0 70 20 49 4e 20 74 65 72 6d 73 20 77 68 65 6e 0a  p IN terms when.
22600 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 69            ** doi
22610 6e 67 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ng WHERE_ORDERBY
22620 5f 4c 49 4d 49 54 20 70 72 6f 63 65 73 73 69 6e  _LIMIT processin
22630 67 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  g). .          *
22640 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
22650 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  f the current te
22660 72 6d 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6f  rm is a column o
22670 66 20 61 6e 20 28 28 3f 2c 3f 29 20 49 4e 20 28  f an ((?,?) IN (
22680 53 45 4c 45 43 54 2e 2e 2e 29 29 20 0a 20 20 20  SELECT...)) .   
22690 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
226a0 73 69 6f 6e 20 66 6f 72 20 77 68 69 63 68 20 74  sion for which t
226b0 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
226c0 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
226d0 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  column,.        
226e0 20 20 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20    ** check that 
226f0 69 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63  it is the only c
22700 6f 6c 75 6d 6e 20 75 73 65 64 20 62 79 20 74 68  olumn used by th
22710 69 73 20 6c 6f 6f 70 2e 20 4f 74 68 65 72 77 69  is loop. Otherwi
22720 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  se,.          **
22730 20 69 66 20 69 74 20 69 73 20 6f 6e 65 20 6f 66   if it is one of
22740 20 74 77 6f 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f   two or more, no
22750 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ne of the column
22760 73 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20  s can be.       
22770 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
22780 20 74 6f 20 6d 61 74 63 68 20 61 6e 20 4f 52 44   to match an ORD
22790 45 52 20 42 59 20 74 65 72 6d 2e 20 20 2a 2f 0a  ER BY term.  */.
227a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65            if( (e
227b0 4f 70 20 26 20 65 71 4f 70 4d 61 73 6b 29 21 3d  Op & eqOpMask)!=
227c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
227d0 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
227e0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
227f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22800 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
22810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
22820 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
22830 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22840 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22850 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
22860 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
22870 41 4c 57 41 59 53 28 65 4f 70 20 26 20 57 4f 5f  ALWAYS(eOp & WO_
22880 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IN) ){.         
22890 20 20 20 2f 2a 20 41 4c 57 41 59 53 28 29 20 6a     /* ALWAYS() j
228a0 75 73 74 69 66 69 63 61 74 69 6f 6e 3a 20 65 4f  ustification: eO
228b0 70 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79  p is an equality
228c0 20 6f 70 65 72 61 74 6f 72 20 64 75 65 20 74 6f   operator due to
228d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
228e0 20 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62   ** j<pLoop->u.b
228f0 74 72 65 65 2e 6e 45 71 20 63 6f 6e 73 74 72 61  tree.nEq constra
22900 69 6e 74 20 61 62 6f 76 65 2e 20 20 41 6e 79 20  int above.  Any 
22910 65 71 75 61 6c 69 74 79 20 6f 74 68 65 72 0a 20  equality other. 
22920 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
22930 61 6e 20 57 4f 5f 49 4e 20 69 73 20 63 61 70 74  an WO_IN is capt
22940 75 72 65 64 20 62 79 20 74 68 65 20 70 72 65 76  ured by the prev
22950 69 6f 75 73 20 22 69 66 22 2e 20 20 53 6f 20 74  ious "if".  So t
22960 68 69 73 20 6f 6e 65 0a 20 20 20 20 20 20 20 20  his one.        
22970 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 68 61      ** always ha
22980 73 20 74 6f 20 62 65 20 57 4f 5f 49 4e 2e 20 2a  s to be WO_IN. *
22990 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
229a0 70 72 20 2a 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e  pr *pX = pLoop->
229b0 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72  aLTerm[j]->pExpr
229c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
229d0 72 28 69 3d 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70  r(i=j+1; i<pLoop
229e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 69  ->u.btree.nEq; i
229f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
22a00 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c     if( pLoop->aL
22a10 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d  Term[i]->pExpr==
22a20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
22a30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
22a40 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d  Loop->aLTerm[i]-
22a50 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
22a60 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IN) );.         
22a70 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 30         bOnce = 0
22a80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22a90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22ac0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
22ad0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65        /* Get the
22ae0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
22af0 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f  n the table (iCo
22b00 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f  lumn) and sort o
22b10 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rder.        ** 
22b20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65  (revIdx) for the
22b30 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   j-th column of 
22b40 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
22b50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
22b60 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
22b70 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
22b80 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
22b90 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [j];.          r
22ba0 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e  evIdx = pIndex->
22bb0 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
22bc0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
22bd0 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54  lumn==pIndex->pT
22be0 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43  able->iPKey ) iC
22bf0 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44  olumn = XN_ROWID
22c00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22c10 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
22c20 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  mn = XN_ROWID;. 
22c30 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
22c40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
22c50 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e          /* An un
22c60 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75  constrained colu
22c70 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  mn that might be
22c80 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   NULL means that
22c90 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
22ca0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f   WhereLoop is no
22cb0 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20  t well-ordered. 
22cc0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22cd0 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
22ce0 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26  tinct.         &
22cf0 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  & iColumn>=0.   
22d00 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f        && j>=pLoo
22d10 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
22d20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65          && pInde
22d30 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
22d40 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
22d50 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
22d60 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
22d70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
22d80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
22d90 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44   /* Find the ORD
22da0 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20  ER BY term that 
22db0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
22dc0 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20  he j-th column. 
22dd0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
22de0 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20   index and mark 
22df0 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65  that ORDER BY te
22e00 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20  rm off .        
22e10 2a 2f 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  */.        isMat
22e20 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
22e30 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
22e40 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
22e50 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
22e60 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
22e70 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
22e80 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
22e90 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
22ea0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
22eb0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
22ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
22ed0 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
22ee0 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
22ef0 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Y );.          t
22f00 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
22f10 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
22f20 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20  INCTBY );.      
22f30 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
22f40 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f  ags & (WHERE_GRO
22f50 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49  UPBY|WHERE_DISTI
22f60 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e  NCTBY))==0 ) bOn
22f70 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
22f80 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 58    if( iColumn>=X
22f90 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  N_ROWID ){.     
22fa0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
22fb0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
22fc0 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
22fd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
22fe0 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
22ff0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
23000 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23010 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
23020 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  !=iColumn ) cont
23030 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
23040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23050 20 20 20 45 78 70 72 20 2a 70 49 64 78 45 78 70     Expr *pIdxExp
23060 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  r = pIndex->aCol
23070 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  Expr->a[j].pExpr
23080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23090 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
230a0 70 61 72 65 53 6b 69 70 28 70 4f 42 45 78 70 72  pareSkip(pOBExpr
230b0 2c 20 70 49 64 78 45 78 70 72 2c 20 69 43 75 72  , pIdxExpr, iCur
230c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
230d0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
230e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
230f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23100 20 69 66 28 20 69 43 6f 6c 75 6d 6e 21 3d 58 4e   if( iColumn!=XN
23110 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
23120 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
23130 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
23140 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
23150 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
23160 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
23170 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
23180 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
23190 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61  zName, pIndex->a
231a0 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
231b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
231c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
231d0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 49  Loop->u.btree.nI
231e0 64 78 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20 20  dxCol = j+1;.   
231f0 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
23200 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
23210 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
23220 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
23230 63 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  ch && (wctrlFlag
23240 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
23250 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
23260 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
23270 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69  the sort order i
23280 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20  s compatible in 
23290 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
232a0 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  se..          **
232b0 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69   Sort order is i
232c0 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20  rrelevant for a 
232d0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
232e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
232f0 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20  ( revSet ){.    
23300 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76          if( (rev
23310 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64   ^ revIdx)!=pOrd
23320 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
23330 72 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d  rder ) isMatch =
23340 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
23350 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
23360 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20   rev = revIdx ^ 
23370 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
23380 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
23390 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20        if( rev ) 
233a0 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53  *pRevMask |= MAS
233b0 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20  KBIT(iLoop);.   
233c0 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20           revSet 
233d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
233e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
233f0 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29     if( isMatch )
23400 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
23410 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
23420 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
23430 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
23440 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
23450 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
23460 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
23470 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23480 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
23490 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
234a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
234b0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63        /* No matc
234c0 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  h found */.     
234d0 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c       if( j==0 ||
234e0 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20   j<nKeyCol ){.  
234f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
23500 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
23510 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct!=0 );.      
23520 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
23530 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
23540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23550 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23560 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64  }.      } /* end
23570 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
23580 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ndex columns */.
23590 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e        if( distin
235a0 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20  ctColumns ){.   
235b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
235c0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d  sOrderDistinct==
235d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  0 );.        isO
235e0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
235f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
23600 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
23610 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
23620 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
23630 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
23640 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
23650 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
23660 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
23670 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
23680 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
23690 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
236a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
236b0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
236c0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
236d0 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  *p;.        Bitm
236e0 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20  ask mTerm;.     
236f0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
23700 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
23710 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
23720 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
23730 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
23740 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  mTerm = sqlite3W
23750 68 65 72 65 45 78 70 72 55 73 61 67 65 28 26 70  hereExprUsage(&p
23760 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
23770 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
23780 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c  mTerm==0 && !sql
23790 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
237a0 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65  nt(p) ) continue
237b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  ;.        if( (m
237c0 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69  Term&~orderDisti
237d0 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  nctMask)==0 ){. 
237e0 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
237f0 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
23800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23810 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
23820 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61   the loop over a
23830 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72  ll WhereLoops fr
23840 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f  om outer-most do
23850 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74  wn to inner-most
23860 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d   */.  if( obSat=
23870 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  =obDone ) return
23880 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20   (i8)nOrderBy;. 
23890 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73   if( !isOrderDis
238a0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72  tinct ){.    for
238b0 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69  (i=nOrderBy-1; i
238c0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
238d0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b  Bitmask m = MASK
238e0 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20  BIT(i) - 1;.    
238f0 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d    if( (obSat&m)=
23900 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =m ) return i;. 
23910 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
23920 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
23930 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  -1;.}.../*.** If
23940 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
23950 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
23960 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65  n the mask passe
23970 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
23980 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65  eBegin(),.** the
23990 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73   planner assumes
239a0 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66   that the specif
239b0 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73  ied pOrderBy lis
239c0 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  t is actually a 
239d0 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75  GROUP.** BY clau
239e0 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20  se - and so any 
239f0 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70  order that group
23a00 73 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72  s rows as requir
23a10 65 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65  ed satisfies the
23a20 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  .** request..**.
23a30 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20  ** Normally, in 
23a40 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
23a50 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
23a60 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64   the caller to d
23a70 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
23a80 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72  her or not the r
23a90 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62  ows are really b
23aa0 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69  eing delivered i
23ab0 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
23ac0 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f  or.** just in so
23ad0 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74  me other order t
23ae0 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65  hat provides the
23af0 20 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69   required groupi
23b00 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
23b10 69 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52  if the WHERE_SOR
23b20 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73  TBYGROUP flag is
23b30 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20   also passed to 
23b40 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
23b50 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  n(), then.** thi
23b60 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
23b70 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  e called on the 
23b80 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e  returned WhereIn
23b90 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65  fo object. It re
23ba0 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66  turns.** true if
23bb0 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79   the rows really
23bc0 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20   will be sorted 
23bd0 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  in the specified
23be0 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65   order, or false
23bf0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
23c00 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
23c10 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a  , assuming:.**.*
23c20 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
23c30 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b   i1 ON t1(x, Y);
23c40 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a  .**.** then.**.*
23c50 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
23c60 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c  M t1 GROUP BY x,
23c70 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20  y ORDER BY x,y; 
23c80 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
23c90 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  =1.**   SELECT *
23ca0 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
23cb0 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79  Y y,x ORDER BY y
23cc0 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,x;   -- IsSorte
23cd0 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71  d()==0.*/.int sq
23ce0 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
23cf0 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ed(WhereInfo *pW
23d00 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28  Info){.  assert(
23d10 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
23d20 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
23d30 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PBY );.  assert(
23d40 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
23d50 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
23d60 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74  BYGROUP );.  ret
23d70 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  urn pWInfo->sort
23d80 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  ed;.}..#ifdef WH
23d90 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
23da0 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e  ./* For debuggin
23db0 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73  g use only: */.s
23dc0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
23dd0 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28   *wherePathName(
23de0 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
23df0 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65  , int nLoop, Whe
23e00 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a  reLoop *pLast){.
23e10 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e    static char zN
23e20 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69  ame[65];.  int i
23e30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
23e40 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d  Loop; i++){ zNam
23e50 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c  e[i] = pPath->aL
23e60 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20  oop[i]->cId; }. 
23e70 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61   if( pLast ) zNa
23e80 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d  me[i++] = pLast-
23e90 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d  >cId;.  zName[i]
23ea0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
23eb0 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
23ec0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
23ed0 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
23ee0 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75   nRow rows, assu
23ef0 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65  ming that the ke
23f00 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64  ys have .** nOrd
23f10 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  erby columns and
23f20 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
23f30 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20  nSorted columns 
23f40 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a  are already in.*
23f50 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  * order..*/.stat
23f60 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53  ic LogEst whereS
23f70 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68  ortingCost(.  Wh
23f80 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
23f90 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a  .  LogEst nRow,.
23fa0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a    int nOrderBy,.
23fb0 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b    int nSorted.){
23fc0 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73  .  /* TUNING: Es
23fd0 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20  timated cost of 
23fe0 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20  a full external 
23ff0 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73  sort, where N is
24000 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65   .  ** the numbe
24010 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72  r of rows to sor
24020 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t is:.  **.  ** 
24030 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
24040 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a  N * log(N))..  *
24050 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74  * .  ** Or, if t
24060 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75  he order-by clau
24070 73 65 20 68 61 73 20 58 20 74 65 72 6d 73 20 62  se has X terms b
24080 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74  ut only the last
24090 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61   Y .  ** terms a
240a0 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c  re out of order,
240b0 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74   then block-sort
240c0 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20  ing will reduce 
240d0 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e  the .  ** sortin
240e0 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a  g cost to:.  **.
240f0 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
24100 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
24110 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20   * (Y/X).  **.  
24120 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65 72  ** The (Y/X) ter
24130 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  m is implemented
24140 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72   using stack var
24150 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a  iable rScale.  *
24160 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c  * below.  */.  L
24170 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53  ogEst rScale, rS
24180 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72  ortCost;.  asser
24190 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26  t( nOrderBy>0 &&
241a0 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
241b0 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63  st(100) );.  rSc
241c0 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ale = sqlite3Log
241d0 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53  Est((nOrderBy-nS
241e0 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65  orted)*100/nOrde
241f0 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f  rBy) - 66;.  rSo
24200 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20  rtCost = nRow + 
24210 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20  rScale + 16;..  
24220 2f 2a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 6c  /* Multiple by l
24230 6f 67 28 4d 29 20 77 68 65 72 65 20 4d 20 69 73  og(M) where M is
24240 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
24250 75 74 70 75 74 20 72 6f 77 73 2e 0a 20 20 2a 2a  utput rows..  **
24260 20 55 73 65 20 74 68 65 20 4c 49 4d 49 54 20 66   Use the LIMIT f
24270 6f 72 20 4d 20 69 66 20 69 74 20 69 73 20 73 6d  or M if it is sm
24280 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 28  aller */.  if( (
24290 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
242a0 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c  gs & WHERE_USE_L
242b0 49 4d 49 54 29 21 3d 30 20 26 26 20 70 57 49 6e  IMIT)!=0 && pWIn
242c0 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f 77 20  fo->iLimit<nRow 
242d0 29 7b 0a 20 20 20 20 6e 52 6f 77 20 3d 20 70 57  ){.    nRow = pW
242e0 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  Info->iLimit;.  
242f0 7d 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d  }.  rSortCost +=
24300 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20   estLog(nRow);. 
24310 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73   return rSortCos
24320 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  t;.}../*.** Give
24330 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  n the list of Wh
24340 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
24350 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  at pWInfo->pLoop
24360 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  s, this routine.
24370 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ** attempts to f
24380 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
24390 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69  ost path that vi
243a0 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c  sits each WhereL
243b0 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68  oop.** once.  Th
243c0 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20  is path is then 
243d0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
243e0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f  pWInfo->a[].pWLo
243f0 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a  op fields..**.**
24400 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   Assume that the
24410 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
24420 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61   output rows tha
24430 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  t will need to b
24440 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c  e sorted.** will
24450 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20   be nRowEst (in 
24460 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72  the 10*log2 repr
24470 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72  esentation).  Or
24480 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67  , ignore sorting
24490 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f  .** costs if nRo
244a0 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52  wEst==0..**.** R
244b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
244c0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51  on success or SQ
244d0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20  LITE_NOMEM of a 
244e0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
244f0 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  n.** error occur
24500 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
24510 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
24520 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
24530 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45  fo, LogEst nRowE
24540 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f  st){.  int mxCho
24550 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ice;            
24560 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
24570 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f  er of simultaneo
24580 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64  us paths tracked
24590 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b   */.  int nLoop;
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
245c0 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a  ms in the join *
245d0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
245e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
245f0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
24600 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
24610 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
24620 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
24630 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
24640 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
24650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
24660 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74  p counter over t
24670 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
24680 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  join */.  int ii
24690 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20  , jj;           
246a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
246b0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ters */.  int mx
246c0 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  I = 0;          
246d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
246e0 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65  next entry to re
246f0 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  place */.  int n
24700 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
24710 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24720 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  f ORDER BY claus
24730 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67  e terms */.  Log
24740 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20  Est mxCost = 0; 
24750 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
24760 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20  m cost of a set 
24770 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f  of paths */.  Lo
24780 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20  gEst mxUnsorted 
24790 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d  = 0;    /* Maxim
247a0 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74  um unsorted cost
247b0 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74   of a set of pat
247c0 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20  h */.  int nTo, 
247d0 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  nFrom;          
247e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
247f0 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
24800 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d  To[] and aFrom[]
24810 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
24820 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *aFrom;         
24830 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74  /* All nFrom pat
24840 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f  hs at the previo
24850 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  us level */.  Wh
24860 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20  erePath *aTo;   
24870 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
24880 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74  To best paths at
24890 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76   the current lev
248a0 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
248b0 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *pFrom;       
248c0 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
248d0 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20  of aFrom[] that 
248e0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
248f0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  n */.  WherePath
24900 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *pTo;          
24910 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
24920 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20  f aTo[] that we 
24930 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
24940 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
24950 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  WLoop;        /*
24960 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72   One of the Wher
24970 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
24980 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
24990 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  X;           /* 
249a0 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20  Used to divy up 
249b0 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72  the pSpace memor
249c0 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61  y */.  LogEst *a
249d0 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20  SortCost = 0;   
249e0 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20   /* Sorting and 
249f0 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20  partial sorting 
24a00 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  costs */.  char 
24a10 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
24a20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
24a30 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  y memory used by
24a40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
24a50 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20  .  int nSpace;  
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a70 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  Bytes of space a
24a80 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70 61  llocated at pSpa
24a90 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ce */..  pParse 
24aa0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
24ab0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
24ac0 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70  >db;.  nLoop = p
24ad0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
24ae0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20   /* TUNING: For 
24af0 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20  simple queries, 
24b00 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61  only the best pa
24b10 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20  th is tracked.. 
24b20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f   ** For 2-way jo
24b30 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20  ins, the 5 best 
24b40 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77  paths are follow
24b50 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69  ed..  ** For joi
24b60 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20  ns of 3 or more 
24b70 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68  tables, track th
24b80 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20  e 10 best paths 
24b90 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20  */.  mxChoice = 
24ba0 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a  (nLoop<=1) ? 1 :
24bb0 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a   (nLoop==2 ? 5 :
24bc0 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20   10);.  assert( 
24bd0 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70  nLoop<=pWInfo->p
24be0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
24bf0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
24c00 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69  002, ("---- begi
24c10 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77  n solver.  (nRow
24c20 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77  Est=%d)\n", nRow
24c30 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Est));..  /* If 
24c40 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20  nRowEst is zero 
24c50 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20  and there is an 
24c60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
24c70 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74   ignore it. In t
24c80 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68  his.  ** case th
24c90 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  e purpose of thi
24ca0 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74  s call is to est
24cb0 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
24cc0 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65   of rows returne
24cd0 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76  d.  ** by the ov
24ce0 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63  erall query. Onc
24cf0 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 20  e this estimate 
24d00 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  has been obtaine
24d10 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20  d, the caller.  
24d20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74  ** will invoke t
24d30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73  his function a s
24d40 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73  econd time, pass
24d50 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74 65  ing the estimate
24d60 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f   as the.  ** nRo
24d70 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20  wEst parameter. 
24d80 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
24d90 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
24da0 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20   nRowEst==0 ){. 
24db0 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b     nOrderBy = 0;
24dc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
24dd0 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d  rderBy = pWInfo-
24de0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
24df0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.  }..  /* Allo
24e00 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
24e10 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54  ize space for aT
24e20 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f  o, aFrom and aSo
24e30 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53  rtCost[] */.  nS
24e40 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57  pace = (sizeof(W
24e50 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66  herePath)+sizeof
24e60 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f  (WhereLoop*)*nLo
24e70 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a  op)*mxChoice*2;.
24e80 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65    nSpace += size
24e90 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72  of(LogEst) * nOr
24ea0 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20  derBy;.  pSpace 
24eb0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
24ec0 63 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70 61 63  cRawNN(db, nSpac
24ed0 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65  e);.  if( pSpace
24ee0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
24ef0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
24f00 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61    aTo = (WherePa
24f10 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46  th*)pSpace;.  aF
24f20 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69  rom = aTo+mxChoi
24f30 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72  ce;.  memset(aFr
24f40 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46  om, 0, sizeof(aF
24f50 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d  rom[0]));.  pX =
24f60 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61   (WhereLoop**)(a
24f70 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a  From+mxChoice);.
24f80 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63    for(ii=mxChoic
24f90 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20  e*2, pFrom=aTo; 
24fa0 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f  ii>0; ii--, pFro
24fb0 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70  m++, pX += nLoop
24fc0 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c  ){.    pFrom->aL
24fd0 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20  oop = pX;.  }.  
24fe0 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
24ff0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
25000 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
25010 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20  lause and it is 
25020 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65  not being ignore
25030 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a  d, set up.    **
25040 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
25050 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79  SortCost[] array
25060 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f  . Each element o
25070 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20  f the aSortCost 
25080 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20  array.    ** is 
25090 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65  either zero - me
250a0 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74  aning it has not
250b0 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61   yet been initia
250c0 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20  lized - or the. 
250d0 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f     ** cost of so
250e0 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f  rting nRowEst ro
250f0 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65  ws of data where
25100 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72   the first X ter
25110 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ms of.    ** the
25120 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
25130 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
25140 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69  order, where X i
25150 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20  s the array .   
25160 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20   ** index.  */. 
25170 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28     aSortCost = (
25180 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20  LogEst*)pX;.    
25190 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74  memset(aSortCost
251a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45  , 0, sizeof(LogE
251b0 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b  st) * nOrderBy);
251c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61  .  }.  assert( a
251d0 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26  SortCost==0 || &
251e0 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
251f0 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73  (char*)&aSortCos
25200 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20  t[nOrderBy] );. 
25210 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
25220 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st!=0 || &pSpace
25230 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
25240 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65  )pX );..  /* See
25250 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
25260 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
25270 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
25280 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
25290 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
252a0 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
252b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
252c0 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
252d0 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  28.  If the cost
252e0 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
252f0 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
25300 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
25310 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
25320 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20  e first 28.  ** 
25330 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
25340 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
25350 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
25360 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
25370 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
25380 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73  ryLoop, 48);  as
25390 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65  sert( 48==sqlite
253a0 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20  3LogEst(28) );. 
253b0 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73   nFrom = 1;.  as
253c0 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69  sert( aFrom[0].i
253d0 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20  sOrdered==0 );. 
253e0 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
253f0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70  .    /* If nLoop
25400 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
25410 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d  here are no FROM
25420 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75   terms in the qu
25430 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  ery. Since.    *
25440 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74  * in this case t
25450 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74  he query may ret
25460 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  urn a maximum of
25470 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65   one row, the re
25480 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65  sults.    ** are
25490 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
254a0 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e  requested order.
254b0 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   Set isOrdered t
254c0 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20  o nOrderBy to.  
254d0 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68    ** indicate th
254e0 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70  is. Or, if nLoop
254f0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
25500 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64   zero, set isOrd
25510 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d  ered to.    ** -
25520 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
25530 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  at the result se
25540 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  t may or may not
25550 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20   be ordered, .  
25560 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f    ** depending o
25570 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65  n the loops adde
25580 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  d to the current
25590 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61   plan.  */.    a
255a0 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
255b0 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31  d = nLoop>0 ? -1
255c0 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d   : nOrderBy;.  }
255d0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
255e0 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
255f0 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
25600 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
25610 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
25620 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
25630 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
25640 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
25650 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
25660 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
25670 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
25680 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
25690 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
256a0 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
256b0 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
256c0 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
256d0 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
256e0 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
256f0 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
25700 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
25710 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
25720 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
25730 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
25740 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20  LogEst nOut;    
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65    /* Rows visite
25770 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  d by (pFrom+pWLo
25780 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  op) */.        L
25790 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20  ogEst rCost;    
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257b0 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68   /* Cost of path
257c0 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
257d0 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
257e0 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20  t rUnsorted;    
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25800 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66  Unsorted cost of
25810 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
25820 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73  */.        i8 is
25830 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d  Ordered = pFrom-
25840 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20  >isOrdered;  /* 
25850 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70  isOrdered for (p
25860 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
25870 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
25880 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20  maskNew;        
25890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
258a0 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64  k of src visited
258b0 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20   by (..) */.    
258c0 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
258d0 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ask = 0;        
258e0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
258f0 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73   rev-order loops
25900 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20   for (..) */..  
25910 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
25920 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72  p->prereq & ~pFr
25930 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
25940 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25950 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
25960 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72  ->maskSelf & pFr
25970 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
25980 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25990 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
259a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
259b0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
259c0 20 26 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c   && pFrom->nRow<
259d0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  3 ){.          /
259e0 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 6e 20  * Do not use an 
259f0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
25a00 69 66 20 74 68 65 20 74 68 69 73 20 6c 6f 6f 70  if the this loop
25a10 20 69 73 20 65 78 70 65 63 74 65 64 0a 20 20 20   is expected.   
25a20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e         ** to run
25a30 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 32 35 20   less than 1.25 
25a40 74 69 6d 65 73 2e 20 20 49 74 20 69 73 20 74 65  times.  It is te
25a50 6d 70 74 69 6e 67 20 74 6f 20 61 6c 73 6f 20 65  mpting to also e
25a60 78 63 6c 75 64 65 0a 20 20 20 20 20 20 20 20 20  xclude.         
25a70 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   ** automatic in
25a80 64 65 78 20 75 73 61 67 65 20 6f 6e 20 61 6e 20  dex usage on an 
25a90 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 62 75 74 20  outer loop, but 
25aa0 73 6f 6d 65 74 69 6d 65 73 20 61 6e 20 61 75 74  sometimes an aut
25ab0 6f 6d 61 74 69 63 0a 20 20 20 20 20 20 20 20 20  omatic.         
25ac0 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 75 73 65   ** index is use
25ad0 66 75 6c 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ful in the outer
25ae0 20 6c 6f 6f 70 20 6f 66 20 61 20 63 6f 72 72 65   loop of a corre
25af0 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 2e 20  lated subquery. 
25b00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
25b10 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
25b20 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
25b30 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
25b40 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
25b50 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
25b60 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20  oint, pWLoop is 
25b70 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
25b80 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e  e the next loop.
25b90 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d   .        ** Com
25ba0 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f  pute its cost */
25bb0 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
25bc0 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
25bd0 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53  stAdd(pWLoop->rS
25be0 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75  etup,pWLoop->rRu
25bf0 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29  n + pFrom->nRow)
25c00 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72  ;.        rUnsor
25c10 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ted = sqlite3Log
25c20 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
25c30 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74  , pFrom->rUnsort
25c40 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  ed);.        nOu
25c50 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20  t = pFrom->nRow 
25c60 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a  + pWLoop->nOut;.
25c70 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
25c80 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
25c90 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
25ca0 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
25cb0 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b  ( isOrdered<0 ){
25cc0 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
25cd0 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68  ered = wherePath
25ce0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
25cf0 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  (pWInfo,.       
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d10 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
25d20 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d  , pFrom, pWInfo-
25d30 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20  >wctrlFlags,.   
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f      iLoop, pWLoo
25d60 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20  p, &revMask);.  
25d70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25d80 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d         revMask =
25d90 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
25da0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25db0 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
25dc0 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64  >=0 && isOrdered
25dd0 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  <nOrderBy ){.   
25de0 20 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74         if( aSort
25df0 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d  Cost[isOrdered]=
25e00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25e10 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
25e20 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f  dered] = whereSo
25e30 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20  rtingCost(.     
25e40 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
25e50 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64  o, nRowEst, nOrd
25e60 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a  erBy, isOrdered.
25e70 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
25e80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25e90 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
25ea0 20 41 64 64 20 61 20 73 6d 61 6c 6c 20 65 78 74   Add a small ext
25eb0 72 61 20 70 65 6e 61 6c 74 79 20 28 35 29 20 74  ra penalty (5) t
25ec0 6f 20 73 6f 72 74 69 6e 67 20 61 73 20 61 6e 0a  o sorting as an.
25ed0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 74            ** ext
25ee0 72 61 20 65 6e 63 6f 75 72 61 67 6d 65 6e 74 20  ra encouragment 
25ef0 74 6f 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  to the query pla
25f00 6e 6e 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61  nner to select a
25f10 20 70 6c 61 6e 0a 20 20 20 20 20 20 20 20 20 20   plan.          
25f20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 72 6f 77  ** where the row
25f30 73 20 65 6d 65 72 67 65 20 69 6e 20 74 68 65 20  s emerge in the 
25f40 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 77 69  correct order wi
25f50 74 68 6f 75 74 20 61 6e 79 20 73 6f 72 74 69 6e  thout any sortin
25f60 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  g.          ** r
25f70 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
25f80 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71        rCost = sq
25f90 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
25fa0 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43  Unsorted, aSortC
25fb0 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 20  ost[isOrdered]) 
25fc0 2b 20 35 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  + 5;..          
25fd0 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
25fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25ff0 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74  ("---- sort cost
26000 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e  =%-3d (%d/%d) in
26010 63 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64  creases cost %3d
26020 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20   to %-3d\n",.   
26030 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72              aSor
26040 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
26050 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72  , (nOrderBy-isOr
26060 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79  dered), nOrderBy
26070 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
26080 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f    rUnsorted, rCo
26090 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  st));.        }e
260a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
260b0 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64  Cost = rUnsorted
260c0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 55 6e 73  ;.          rUns
260d0 6f 72 74 65 64 20 2d 3d 20 32 3b 20 20 2f 2a 20  orted -= 2;  /* 
260e0 54 55 4e 49 4e 47 3a 20 20 53 6c 69 67 68 74 20  TUNING:  Slight 
260f0 62 69 61 73 20 69 6e 20 66 61 76 6f 72 20 6f 66  bias in favor of
26100 20 6e 6f 2d 73 6f 72 74 20 70 6c 61 6e 73 20 2a   no-sort plans *
26110 2f 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  /.        }..   
26120 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
26130 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73   see if pWLoop s
26140 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74  hould be added t
26150 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20  o the set of.   
26160 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65       ** mxChoice
26170 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
26180 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  hs..        **. 
26190 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20         ** First 
261a0 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73  look for an exis
261b0 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20  ting path among 
261c0 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
261d0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
261e0 74 20 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d  t covers the sam
261f0 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61  e set of loops a
26200 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
26210 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20  isOrdered.      
26220 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20    ** setting as 
26230 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 74 68  the current path
26240 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20   candidate..    
26250 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
26260 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28 70 54  * The term "((pT
26270 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
26280 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
26290 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a  " is equivalent.
262a0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70          ** to (p
262b0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28  To->isOrdered==(
262c0 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64  -1))==(isOrdered
262d0 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65  ==(-1))" for the
262e0 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a   range.        *
262f0 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65  * of legal value
26300 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c  s for isOrdered,
26310 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20   -1..64..       
26320 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
26330 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a  jj=0, pTo=aTo; j
26340 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  j<nTo; jj++, pTo
26350 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
26360 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70  f( pTo->maskLoop
26370 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20  ==maskNew.      
26380 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69       && ((pTo->i
26390 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72  sOrdered^isOrder
263a0 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20  ed)&0x80)==0.   
263b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
263c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
263d0 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20  jj==nTo-1 );.   
263e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
263f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
26410 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20  ( jj>=nTo ){.   
26420 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f         /* None o
26430 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 62  f the existing b
26440 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
26450 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64 69   match the candi
26460 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  date. */.       
26470 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
26480 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  oice.           
26490 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74  && (rCost>mxCost
264a0 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f   || (rCost==mxCo
264b0 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e  st && rUnsorted>
264c0 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20  =mxUnsorted)).  
264d0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
264e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
264f0 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20  rrent candidate 
26500 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61  is no better tha
26510 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43  n any of the mxC
26520 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20  hoice.          
26530 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65    ** paths curre
26540 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74  ntly in the best
26550 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20  -so-far buffer. 
26560 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20   So discard.    
26570 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
26580 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74  candidate as not
26590 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64   viable. */.#ifd
265a0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
265b0 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
265c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
265d0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
265e0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
265f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
26600 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20  bugPrintf("Skip 
26610 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
26620 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
26630 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
26640 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
26650 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
26660 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
26670 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65  , nOut, rUnsorte
26680 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
26690 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
266a0 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
266b0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
266c0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
266d0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
266e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
266f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
26700 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
26710 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74  oints it means t
26720 68 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64  hat the new cand
26730 69 64 61 74 65 20 70 61 74 68 0a 20 20 20 20 20  idate path.     
26740 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f       ** needs to
26750 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
26760 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d   set of best-so-
26770 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20  far paths. */.  
26780 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c          if( nTo<
26790 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
267a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
267b0 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
267c0 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f  the aTo set by o
267d0 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
267e0 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20    jj = nTo++;.  
267f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
26810 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20  w path replaces 
26820 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20  the prior worst 
26830 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65  to keep count be
26840 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a  low mxChoice */.
26850 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
26860 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20   mxI;.          
26870 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
26880 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
26890 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
268a0 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
268b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
268c0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
268d0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
268e0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
268f0 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73  rintf("New    %s
26900 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25   cost=%-3d,%3d,%
26910 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26930 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
26940 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
26950 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
26960 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20  , rUnsorted,.   
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
26980 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
26990 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
269a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
269b0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c  ndif.        }el
269c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
269d0 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73   Control reaches
269e0 20 68 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f   here if best-so
269f0 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54  -far path pTo=aT
26a00 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65  o[jj] covers the
26a10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
26a20 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20  me set of loops 
26a30 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
26a40 20 69 73 4f 72 64 65 72 65 64 20 73 65 74 74 69   isOrdered setti
26a50 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ng as the.      
26a60 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65      ** candidate
26a70 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f   path.  Check to
26a80 20 73 65 65 20 69 66 20 74 68 65 20 63 61 6e 64   see if the cand
26a90 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70  idate should rep
26aa0 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a  lace.          *
26ab0 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20  * pTo or if the 
26ac0 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
26ad0 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   be skipped..   
26ae0 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
26af0 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 6e 64       ** The cond
26b00 69 74 69 6f 6e 61 6c 20 69 73 20 61 6e 20 65 78  itional is an ex
26b10 70 61 6e 64 65 64 20 76 65 63 74 6f 72 20 63 6f  panded vector co
26b20 6d 70 61 72 69 73 6f 6e 20 65 71 75 69 76 61 6c  mparison equival
26b30 65 6e 74 20 74 6f 3a 0a 20 20 20 20 20 20 20 20  ent to:.        
26b40 20 20 2a 2a 20 20 20 28 70 54 6f 2d 3e 72 43 6f    **   (pTo->rCo
26b50 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77 2c 70 54 6f  st,pTo->nRow,pTo
26b60 2d 3e 72 55 6e 73 6f 72 74 65 64 29 20 3c 3d 20  ->rUnsorted) <= 
26b70 28 72 43 6f 73 74 2c 6e 4f 75 74 2c 72 55 6e 73  (rCost,nOut,rUns
26b80 6f 72 74 65 64 29 0a 20 20 20 20 20 20 20 20 20  orted).         
26b90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
26ba0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f  ( pTo->rCost<rCo
26bb0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  st .           |
26bc0 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  | (pTo->rCost==r
26bd0 43 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  Cost.           
26be0 20 20 20 20 26 26 20 28 70 54 6f 2d 3e 6e 52 6f      && (pTo->nRo
26bf0 77 3c 6e 4f 75 74 0a 20 20 20 20 20 20 20 20 20  w<nOut.         
26c00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
26c10 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75 74 20 26 26  o->nRow==nOut &&
26c20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3c   pTo->rUnsorted<
26c30 3d 72 55 6e 73 6f 72 74 65 64 29 0a 20 20 20 20  =rUnsorted).    
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
26c60 20 20 20 20 20 20 20 20 20 20 29 7b 0a 23 69 66            ){.#if
26c70 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
26c80 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
26c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26ca0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26cb0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
26cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
26cd0 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
26cf0 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
26d00 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
26d10 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
26d20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
26d30 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
26d40 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
26d50 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72  st, nOut, rUnsor
26d60 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
26d70 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
26d80 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
26d90 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
26da0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26db0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
26dc0 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64   vs %s cost=%-3d
26dd0 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  ,%3d,%3d order=%
26de0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
26df0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
26e00 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
26e10 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
26e20 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e40 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 2c   pTo->rUnsorted,
26e50 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
26e60 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
26e70 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
26e80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
26e90 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
26ea0 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
26eb0 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 66  candidate path f
26ec0 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73  rom further cons
26ed0 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  ideration */.   
26ee0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
26ef0 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
26f00 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Cost );.        
26f10 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26f20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26f30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
26f40 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b  o->rCost==rCost+
26f50 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 );.          /
26f60 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65  * Control reache
26f70 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63 61  s here if the ca
26f80 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73 20  ndidate path is 
26f90 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a  better than the.
26fa0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f            ** pTo
26fb0 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20   path.  Replace 
26fc0 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e  pTo with the can
26fd0 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65  didate. */.#ifde
26fe0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26ff0 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
27000 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
27010 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
27020 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
27030 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27040 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
27050 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73        "Update %s
27060 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25   cost=%-3d,%3d,%
27070 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
27080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
27090 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
270a0 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
270b0 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20  ), rCost, nOut, 
270c0 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20  rUnsorted,.     
270d0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
270e0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
270f0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
27100 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27110 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
27120 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d    was %s cost=%-
27130 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
27140 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
27150 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
27160 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
27170 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
27180 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
271a0 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 2c 20 70  To->rUnsorted, p
271b0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
271c0 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
271d0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
271e0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
271f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27200 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20     /* pWLoop is 
27210 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69  a winner.  Add i
27220 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  t to the set of 
27230 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
27240 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b         pTo->mask
27250 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  Loop = pFrom->ma
27260 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
27270 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
27280 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20     pTo->revLoop 
27290 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
272a0 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e     pTo->nRow = n
272b0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  Out;.        pTo
272c0 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
272d0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55  .        pTo->rU
272e0 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72  nsorted = rUnsor
272f0 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ted;.        pTo
27300 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73  ->isOrdered = is
27310 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
27320 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f   memcpy(pTo->aLo
27330 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  op, pFrom->aLoop
27340 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
27350 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20  op*)*iLoop);.   
27360 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b       pTo->aLoop[
27370 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b  iLoop] = pWLoop;
27380 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f  .        if( nTo
27390 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  >=mxChoice ){.  
273a0 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b          mxI = 0;
273b0 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73  .          mxCos
273c0 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74  t = aTo[0].rCost
273d0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e  ;.          mxUn
273e0 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e  sorted = aTo[0].
273f0 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
27400 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
27410 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
27420 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
27430 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
27440 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
27450 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ost .           
27460 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74    || (pTo->rCost
27470 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d  ==mxCost && pTo-
27480 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73  >rUnsorted>mxUns
27490 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20 20 20  orted) .        
274a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
274b0 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54       mxCost = pT
274c0 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  o->rCost;.      
274d0 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
274e0 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  ed = pTo->rUnsor
274f0 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ted;.           
27500 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20     mxI = jj;.   
27510 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
27540 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
27550 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d  E_ENABLED  /* >=
27560 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  2 */.    if( sql
27570 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
27580 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73   0x02 ){.      s
27590 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
275a0 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f  f("---- after ro
275b0 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20  und %d ----\n", 
275c0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f  iLoop);.      fo
275d0 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(ii=0, pTo=aTo;
275e0 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70   ii<nTo; ii++, p
275f0 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  To++){.        s
27600 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
27610 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  f(" %s cost=%-3d
27620 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72   nrow=%-3d order
27630 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
27640 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
27650 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
27660 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
27670 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
27680 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
27690 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  d>=0 ? (pTo->isO
276a0 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f  rdered+'0') : '?
276b0 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
276c0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30  pTo->isOrdered>0
276d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
276e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
276f0 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  (" rev=0x%llx\n"
27700 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b  , pTo->revLoop);
27710 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
27720 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27730 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
27740 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
27750 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
27760 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20  if..    /* Swap 
27770 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72  the roles of aFr
27780 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74  om and aTo for t
27790 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69  he next generati
277a0 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20  on */.    pFrom 
277b0 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d  = aTo;.    aTo =
277c0 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f   aFrom;.    aFro
277d0 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e  m = pFrom;.    n
277e0 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a  From = nTo;.  }.
277f0 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20  .  if( nFrom==0 
27800 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
27810 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27820 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f  no query solutio
27830 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
27840 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53 70  DbFreeNN(db, pSp
27850 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ace);.    return
27860 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
27870 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20   }.  .  /* Find 
27880 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
27890 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c  path.  pFrom wil
278a0 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
278b0 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20  ng to that path 
278c0 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72  */.  pFrom = aFr
278d0 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20  om;.  for(ii=1; 
278e0 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
278f0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
27900 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
27910 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
27920 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
27930 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
27940 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
27950 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
27960 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
27970 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
27980 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
27990 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
279a0 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
279b0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
279c0 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
279d0 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
279e0 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
279f0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
27a00 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
27a10 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
27a20 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->iTab;.    pLev
27a30 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57  el->iTabCur = pW
27a40 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
27a50 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
27a60 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20  .iCursor;.  }.  
27a70 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
27a80 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
27a90 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
27aa0 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
27ab0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
27ac0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d  ERE_DISTINCTBY)=
27ad0 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  =0.   && pWInfo-
27ae0 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
27af0 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a  E_DISTINCT_NOOP.
27b00 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20     && nRowEst.  
27b10 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  ){.    Bitmask n
27b20 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20  otUsed;.    int 
27b30 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
27b40 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
27b50 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
27b60 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d  ResultSet, pFrom
27b70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27b80 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43     WHERE_DISTINC
27b90 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  TBY, nLoop-1, pF
27ba0 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
27bb0 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  -1], &notUsed);.
27bc0 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e      if( rc==pWIn
27bd0 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e  fo->pResultSet->
27be0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  nExpr ){.      p
27bf0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
27c00 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
27c10 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d  T_ORDERED;.    }
27c20 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 62  .  }.  pWInfo->b
27c30 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
27c40 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 49 6e   = 0;.  if( pWIn
27c50 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
27c60 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
27c70 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27c80 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
27c90 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
27ca0 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49  ->isOrdered==pWI
27cb0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
27cc0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
27cd0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
27ce0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
27cf0 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
27d00 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
27d10 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42       pWInfo->nOB
27d20 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  Sat = pFrom->isO
27d30 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 70 57  rdered;.      pW
27d40 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
27d50 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
27d60 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
27d70 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29 7b 0a 20  ->nOBSat<=0 ){. 
27d80 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e         pWInfo->n
27d90 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20  OBSat = 0;.     
27da0 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e 30 20 29     if( nLoop>0 )
27db0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
27dc0 77 73 46 6c 61 67 73 20 3d 20 70 46 72 6f 6d 2d  wsFlags = pFrom-
27dd0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d  >aLoop[nLoop-1]-
27de0 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  >wsFlags;.      
27df0 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
27e00 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
27e10 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
27e20 26 26 20 28 77 73 46 6c 61 67 73 26 28 57 48 45  && (wsFlags&(WHE
27e30 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c  RE_IPK|WHERE_COL
27e40 55 4d 4e 5f 49 4e 29 29 21 3d 28 57 48 45 52 45  UMN_IN))!=(WHERE
27e50 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  _IPK|WHERE_COLUM
27e60 4e 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20  N_IN).          
27e70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
27e80 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20  itmask m = 0;.  
27e90 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 63            int rc
27ea0 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
27eb0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
27ec0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
27ed0 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 0a 20 20  derBy, pFrom,.  
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ef0 20 20 20 20 57 48 45 52 45 5f 4f 52 44 45 52 42      WHERE_ORDERB
27f00 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f 70 2d 31  Y_LIMIT, nLoop-1
27f10 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
27f20 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b 0a 20 20  Loop-1], &m);.  
27f30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
27f40 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48  se( wsFlags & WH
27f50 45 52 45 5f 49 50 4b 20 29 3b 0a 20 20 20 20 20  ERE_IPK );.     
27f60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27f70 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
27f80 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20  _COLUMN_IN );.  
27f90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27fa0 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
27fb0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
27fc0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
27fd0 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  o->bOrderedInner
27fe0 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  Loop = 1;.      
27ff0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
28000 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20 20  revMask = m;.   
28010 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
28030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28040 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
28050 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
28060 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
28070 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
28080 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
28090 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
280a0 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20  pr && nLoop>0.  
280b0 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61    ){.      Bitma
280c0 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
280d0 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
280e0 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
280f0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
28100 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
28110 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
28120 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f    pFrom, 0, nLoo
28130 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
28140 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76  p[nLoop-1], &rev
28150 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20  Mask.      );.  
28160 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
28170 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b  fo->sorted==0 );
28180 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65  .      if( nOrde
28190 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r==pWInfo->pOrde
281a0 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
281b0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f        pWInfo->so
281c0 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rted = 1;.      
281d0 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
281e0 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  k = revMask;.   
281f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
28200 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
28210 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
28220 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
28230 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
28240 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
28250 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
28260 72 65 65 4e 4e 28 64 62 2c 20 70 53 70 61 63 65  reeNN(db, pSpace
28270 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
28280 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
28290 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65  Most queries use
282a0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
282b0 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e  able (they are n
282c0 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61  ot joins) and ha
282d0 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20  ve.** simple == 
282e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69  constraints agai
282f0 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c  nst indexed fiel
28300 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ds.  This routin
28310 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  e attempts.** to
28320 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70   plan those simp
28330 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d  le cases using m
28340 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e  uch less ceremon
28350 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65  y than the.** ge
28360 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
28370 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64  ery planner, and
28380 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66   thereby yield f
28390 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72  aster sqlite3_pr
283a0 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73  epare().** times
283b0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
283c0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  case..**.** Retu
283d0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73  rn non-zero on s
283e0 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20  uccess, if this 
283f0 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e  query can be han
28400 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  dled by this.** 
28410 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20  no-frills query 
28420 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e  planner.  Return
28430 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75   zero if this qu
28440 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a  ery needs the .*
28450 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
28460 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
28470 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
28480 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65  hereShortCut(Whe
28490 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
284a0 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
284b0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
284c0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
284d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
284e0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
284f0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
28500 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  erm;.  WhereLoop
28510 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69   *pLoop;.  int i
28520 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Cur;.  int j;.  
28530 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
28540 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 70  ndex *pIdx;..  p
28550 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
28560 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20  ->pWInfo;.  if( 
28570 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
28580 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
28590 42 43 4c 41 55 53 45 20 29 20 72 65 74 75 72 6e  BCLAUSE ) return
285a0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   0;.  assert( pW
285b0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
285c0 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74  nSrc>=1 );.  pIt
285d0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
285e0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62  bList->a;.  pTab
285f0 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
28600 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
28610 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
28620 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66  ;.  if( pItem->f
28630 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20  g.isIndexedBy ) 
28640 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
28650 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
28660 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
28670 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
28680 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
28690 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
286a0 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70  ags = 0;.  pLoop
286b0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70  ->nSkip = 0;.  p
286c0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
286d0 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
286e0 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
286f0 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20  _EQ|WO_IS, 0);. 
28700 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
28710 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
28720 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
28730 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  O_IS );.    pLoo
28740 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
28750 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
28760 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
28770 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
28780 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
28790 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
287a0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
287b0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
287c0 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
287d0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
287e0 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
287f0 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
28800 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
28810 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
28820 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  (10) */.  }else{
28830 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
28840 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
28850 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
28860 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  xt){.      int o
28870 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73  pMask;.      ass
28880 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ert( pLoop->aLTe
28890 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e  rmSpace==pLoop->
288a0 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  aLTerm );.      
288b0 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64  if( !IsUniqueInd
288c0 65 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20  ex(pIdx).       
288d0 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  || pIdx->pPartId
288e0 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20  xWhere!=0 .     
288f0 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43    || pIdx->nKeyC
28900 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  ol>ArraySize(pLo
28910 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
28920 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e   .      ) contin
28930 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b  ue;.      opMask
28940 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74   = pIdx->uniqNot
28950 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f  Null ? (WO_EQ|WO
28960 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20  _IS) : WO_EQ;.  
28970 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
28980 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  Idx->nKeyCol; j+
28990 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
289a0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
289b0 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
289c0 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b  ur, j, 0, opMask
289d0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
289e0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
289f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74  break;.        t
28a00 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
28a10 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
28a20 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  S );.        pLo
28a30 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20  op->aLTerm[j] = 
28a40 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
28a50 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78       if( j!=pIdx
28a60 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
28a70 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  inue;.      pLoo
28a80 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
28a90 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
28aa0 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f  RE_ONEROW|WHERE_
28ab0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69  INDEXED;.      i
28ac0 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72  f( pIdx->isCover
28ad0 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63  ing || (pItem->c
28ae0 6f 6c 55 73 65 64 20 26 20 70 49 64 78 2d 3e 63  olUsed & pIdx->c
28af0 6f 6c 4e 6f 74 49 64 78 65 64 29 3d 3d 30 20 29  olNotIdxed)==0 )
28b00 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
28b10 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28b20 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
28b30 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d    }.      pLoop-
28b40 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20  >nLTerm = j;.   
28b50 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
28b60 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20  e.nEq = j;.     
28b70 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
28b80 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
28b90 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
28ba0 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65  Cost of a unique
28bb0 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73   index lookup is
28bc0 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f   15 */.      pLo
28bd0 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20  op->rRun = 39;  
28be0 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 39==sqlite3Lo
28bf0 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20  gEst(15) */.    
28c00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28c10 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
28c20 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70  wsFlags ){.    p
28c30 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
28c40 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e  gEst)1;.    pWIn
28c50 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20  fo->a[0].pWLoop 
28c60 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 61 73 73  = pLoop;.    ass
28c70 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 4d 61  ert( pWInfo->sMa
28c80 73 6b 53 65 74 2e 6e 3d 3d 31 20 26 26 20 69 43  skSet.n==1 && iC
28c90 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  ur==pWInfo->sMas
28ca0 6b 53 65 74 2e 69 78 5b 30 5d 20 29 3b 0a 20 20  kSet.ix[0] );.  
28cb0 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c    pLoop->maskSel
28cc0 66 20 3d 20 31 3b 20 2f 2a 20 73 71 6c 69 74 65  f = 1; /* sqlite
28cd0 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
28ce0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
28cf0 20 69 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 70   iCur); */.    p
28d00 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62  WInfo->a[0].iTab
28d10 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  Cur = iCur;.    
28d20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
28d30 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49  = 1;.    if( pWI
28d40 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  nfo->pOrderBy ) 
28d50 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
28d60 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
28d70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
28d80 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
28d90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
28da0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
28db0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
28dc0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
28dd0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
28de0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
28df0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c  ITE_DEBUG.    pL
28e00 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a  oop->cId = '0';.
28e10 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
28e20 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
28e30 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  n 0;.}../*.** He
28e40 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
28e50 72 20 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e  r exprIsDetermin
28e60 69 73 74 69 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  istic()..*/.stat
28e70 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
28e80 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28 57  sDeterministic(W
28e90 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
28ea0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
28eb0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
28ec0 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 45 78  K_FUNCTION && Ex
28ed0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
28ee0 78 70 72 2c 20 45 50 5f 43 6f 6e 73 74 46 75 6e  xpr, EP_ConstFun
28ef0 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 57 61  c)==0 ){.    pWa
28f00 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
28f10 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
28f20 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Abort;.  }.  ret
28f30 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
28f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28f50 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 65 78  n true if the ex
28f60 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
28f70 73 20 6e 6f 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  s no non-determi
28f80 6e 69 73 74 69 63 20 53 51 4c 20 0a 2a 2a 20 66  nistic SQL .** f
28f90 75 6e 63 74 69 6f 6e 73 2e 20 44 6f 20 6e 6f 74  unctions. Do not
28fa0 20 63 6f 6e 73 69 64 65 72 20 6e 6f 6e 2d 64 65   consider non-de
28fb0 74 65 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20  terministic SQL 
28fc0 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
28fd0 72 65 20 0a 2a 2a 20 70 61 72 74 20 6f 66 20 73  re .** part of s
28fe0 75 62 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ub-select statem
28ff0 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
29000 69 6e 74 20 65 78 70 72 49 73 44 65 74 65 72 6d  int exprIsDeterm
29010 69 6e 69 73 74 69 63 28 45 78 70 72 20 2a 70 29  inistic(Expr *p)
29020 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
29030 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
29040 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43  zeof(w));.  w.eC
29050 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78  ode = 1;.  w.xEx
29060 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
29070 72 4e 6f 64 65 49 73 44 65 74 65 72 6d 69 6e 69  rNodeIsDetermini
29080 73 74 69 63 3b 0a 20 20 77 2e 78 53 65 6c 65 63  stic;.  w.xSelec
29090 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
290a0 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
290b0 6c 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  l;.  sqlite3Walk
290c0 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
290d0 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
290e0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
290f0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
29100 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20  f the loop used 
29110 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
29120 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20   processing..** 
29130 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
29140 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
29150 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63   an opaque struc
29160 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69  ture that contai
29170 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ns.** informatio
29180 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d  n needed to term
29190 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
291a0 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c   Later, the call
291b0 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  ing routine.** s
291c0 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
291d0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77  ite3WhereEnd() w
291e0 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76  ith the return v
291f0 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
29200 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65  ction.** in orde
29210 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
29220 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
29230 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
29240 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
29250 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  urs, this routin
29260 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  e returns NULL..
29270 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20  **.** The basic 
29280 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20  idea is to do a 
29290 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65  nested loop, one
292a0 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74   loop for each t
292b0 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  able in.** the F
292c0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
292d0 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54  select.  (INSERT
292e0 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74   and UPDATE stat
292f0 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a  ements are the.*
29300 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45  * same as a SELE
29310 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73  CT with only a s
29320 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
29330 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29  he FROM clause.)
29340 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65    For.** example
29350 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20  , if the SQL is 
29360 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
29370 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
29380 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
29390 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...;.**.** Then
293a0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
293b0 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61  ted is conceptua
293c0 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c  lly like the fol
293d0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
293e0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
293f0 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c  in t1 do       \
29400 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
29410 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72  ed.**        for
29420 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
29430 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73  do      |-- by s
29440 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
29450 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ().**          f
29460 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74  oreach row3 in t
29470 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20  3 do   /.**     
29480 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
29490 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
294b0 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
294c0 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64  ed.**        end
294d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294e0 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73          |-- by s
294f0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
29500 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20  .**      end    
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29520 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74       /.**.** Not
29530 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73  e that the loops
29540 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65   might not be ne
29550 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  sted in the orde
29560 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a  r in which they.
29570 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ** appear in the
29580 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20   FROM clause if 
29590 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
295a0 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65  r is better able
295b0 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20   to make.** use 
295c0 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  of indices.  Not
295d0 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e  e also that when
295e0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
295f0 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74   appears in.** t
29600 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
29610 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74   it might result
29620 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   in additional n
29630 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a  ested loops for.
29640 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  ** scanning thro
29650 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ugh all values o
29660 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
29670 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e   side of the IN.
29680 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
29690 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61   Btree cursors a
296a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
296b0 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75  ach table.  t1 u
296c0 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  ses cursor.** nu
296d0 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  mber pTabList->a
296e0 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32  [0].iCursor.  t2
296f0 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72   uses the cursor
29700 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e   pTabList->a[1].
29710 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20  iCursor..** And 
29720 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20  so forth.  This 
29730 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
29740 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  s code to open t
29750 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72  hose VDBE cursor
29760 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  s.** and sqlite3
29770 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72  WhereEnd() gener
29780 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
29790 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a   close them..**.
297a0 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
297b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
297c0 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c  in() generates l
297d0 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
297e0 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54  s named.** in pT
297f0 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  abList pointing 
29800 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72  at their appropr
29810 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54  iate entries.  T
29820 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a  he [...] code.**
29830 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75   can use OP_Colu
29840 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20  mn and OP_Rowid 
29850 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65  opcodes on these
29860 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72   cursors to extr
29870 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d  act.** data from
29880 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62   the various tab
29890 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  les of the loop.
298a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
298b0 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d  ERE clause is em
298c0 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68  pty, the foreach
298d0 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68   loops must each
298e0 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65   scan their.** e
298f0 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54  ntire tables.  T
29900 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20  hus a three-way 
29910 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33  join is an O(N^3
29920 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  ) operation.  Bu
29930 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  t if.** the tabl
29940 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20  es have indices 
29950 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65  and there are te
29960 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
29970 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20   clause that.** 
29980 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69  refer to those i
29990 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65  ndices, a comple
299a0 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61  te table scan ca
299b0 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64  n be avoided and
299c0 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c   the.** code wil
299d0 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65  l run much faste
299e0 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  r.  Most of the 
299f0 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75  work of this rou
29a00 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67  tine is checking
29a10 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68  .** to see if th
29a20 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20  ere are indices 
29a30 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
29a40 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65   to speed up the
29a50 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72   loop..**.** Ter
29a60 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
29a70 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20  clause are also 
29a80 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68  used to limit wh
29a90 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c  ich rows actuall
29aa0 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20  y.** make it to 
29ab0 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65  the "..." in the
29ac0 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c   middle of the l
29ad0 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68  oop.  After each
29ae0 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74   "foreach",.** t
29af0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
29b00 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73  E clause that us
29b10 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20  e only terms in 
29b20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75  that loop and ou
29b30 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65  ter.** loops are
29b40 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
29b50 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69  f false a jump i
29b60 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c  s made around al
29b70 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
29b80 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20  inner loops (or 
29b90 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22  around the "..."
29ba0 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63   if the test occ
29bb0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69  urs within the i
29bc0 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f  nner-.** most lo
29bd0 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20  op).**.** OUTER 
29be0 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f  JOINS.**.** An o
29bf0 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62  uter join of tab
29c00 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73  les t1 and t2 is
29c10 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64   conceptally cod
29c20 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
29c30 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20  *.**    foreach 
29c40 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a  row1 in t1 do.**
29c50 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a        flag = 0.*
29c60 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
29c70 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20  ow2 in t2 do.** 
29c80 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a         start:.**
29c90 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
29ca0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
29cb0 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a   1.**      end.*
29cc0 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d  *      if flag==
29cd0 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  0 then.**       
29ce0 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63   move the row2 c
29cf0 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20  ursor to a null 
29d00 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f  row.**        go
29d10 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20  to start.**     
29d20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a   fi.**    end.**
29d30 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41  .** ORDER BY CLA
29d40 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a  USE PROCESSING.*
29d50 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
29d60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29d70 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
29d80 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20  e (or the GROUP 
29d90 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20  BY clause.** if 
29da0 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
29db0 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
29dc0 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20   wctrlFlags) of 
29dd0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
29de0 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  nt.** if there i
29df0 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
29e00 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
29e10 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
29e20 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
29e30 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
29e40 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
29e50 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
29e60 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
29e70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78  ..**.** The iIdx
29e80 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  Cur parameter is
29e90 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
29ea0 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20  er of an index. 
29eb0 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 52   If .** WHERE_OR
29ec0 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65  _SUBCLAUSE is se
29ed0 74 2c 20 69 49 64 78 43 75 72 20 69 73 20 74 68  t, iIdxCur is th
29ee0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
29ef0 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74  of an index.** t
29f00 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61  o use for OR cla
29f10 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  use processing. 
29f20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
29f30 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69  e should use thi
29f40 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75  s.** specific cu
29f50 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f  rsor.  If WHERE_
29f60 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
29f70 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64  is set, then iId
29f80 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66  xCur is.** the f
29f90 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61  irst cursor in a
29fa0 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f  n array of curso
29fb0 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63  rs for all indic
29fc0 65 73 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f  es.  iIdxCur sho
29fd0 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  uld.** be used t
29fe0 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70  o compute the ap
29ff0 70 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72  propriate cursor
2a000 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
2a010 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20  ich index is.** 
2a020 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e  used..*/.WhereIn
2a030 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  fo *sqlite3Where
2a040 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a  Begin(.  Parse *
2a050 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2a060 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2a070 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
2a080 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
2a090 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
2a0a0 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
2a0b0 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
2a0c0 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
2a0d0 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
2a0e0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2a0f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2a100 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2a110 20 20 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52       /* An ORDER
2a120 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
2a130 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  ) clause, or NUL
2a140 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
2a150 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 20 20 2f  *pResultSet,   /
2a160 2a 20 51 75 65 72 79 20 72 65 73 75 6c 74 20 73  * Query result s
2a170 65 74 2e 20 20 52 65 71 27 64 20 66 6f 72 20 44  et.  Req'd for D
2a180 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 75 31 36  ISTINCT */.  u16
2a190 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
2a1a0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2a1b0 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
2a1c0 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
2a1d0 20 2a 2f 0a 20 20 69 6e 74 20 69 41 75 78 41 72   */.  int iAuxAr
2a1e0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g             /*
2a1f0 20 49 66 20 57 48 45 52 45 5f 4f 52 5f 53 55 42   If WHERE_OR_SUB
2a200 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69  CLAUSE is set, i
2a210 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
2a220 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
2a230 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2a240 49 66 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  If WHERE_USE_LIM
2a250 49 54 2c 20 74 68 65 6e 20 74 68 65 20 6c 69 6d  IT, then the lim
2a260 69 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a  it amount */.){.
2a270 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
2a280 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a290 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
2a2a0 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
2a2b0 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69  fo struct */.  i
2a2c0 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20  nt nTabList;    
2a2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2a2e0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
2a2f0 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  in pTabList */. 
2a300 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2a310 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
2a320 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
2a330 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
2a340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
2a350 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2a360 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
2a370 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
2a380 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
2a390 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
2a3a0 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
2a3b0 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
2a3c0 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
2a3d0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
2a3e0 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20  pBuilder sWLB;  
2a3f0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
2a400 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20  oop builder */. 
2a410 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
2a420 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
2a430 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
2a440 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
2a450 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
2a460 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
2a470 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e  le level in pWIn
2a480 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65  fo->a[] */.  Whe
2a490 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
2a4a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2a4b0 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57  er to a single W
2a4c0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
2a4d0 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2a500 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2a510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a520 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
2a530 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
2a540 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2a550 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2a560 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 62 46   code */.  u8 bF
2a570 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b 20 20 20  ordelete = 0;   
2a580 20 20 20 20 20 20 2f 2a 20 4f 50 46 4c 41 47 5f        /* OPFLAG_
2a590 46 4f 52 44 45 4c 45 54 45 20 6f 72 20 7a 65 72  FORDELETE or zer
2a5a0 6f 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  o, as appropriat
2a5b0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2a5c0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2a5d0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
2a5e0 49 52 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20  IROW)==0 || (.  
2a5f0 20 20 20 20 20 20 28 77 63 74 72 6c 46 6c 61 67        (wctrlFlag
2a600 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2a610 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20  S_DESIRED)!=0 . 
2a620 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
2a630 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
2a640 42 43 4c 41 55 53 45 29 3d 3d 30 20 0a 20 20 29  BCLAUSE)==0 .  )
2a650 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  );..  /* Only on
2a660 65 20 6f 66 20 57 48 45 52 45 5f 4f 52 5f 53 55  e of WHERE_OR_SU
2a670 42 43 4c 41 55 53 45 20 6f 72 20 57 48 45 52 45  BCLAUSE or WHERE
2a680 5f 55 53 45 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20  _USE_LIMIT */.  
2a690 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
2a6a0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
2a6b0 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20  UBCLAUSE)==0.   
2a6c0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74           || (wct
2a6d0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2a6e0 55 53 45 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  USE_LIMIT)==0 );
2a6f0 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20  ..  /* Variable 
2a700 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
2a710 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
2a720 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  >db;.  memset(&s
2a730 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  WLB, 0, sizeof(s
2a740 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20  WLB));..  /* An 
2a750 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63  ORDER/GROUP BY c
2a760 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68  lause of more th
2a770 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e  an 63 terms cann
2a780 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  ot be optimized 
2a790 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
2a7a0 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
2a7b0 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d  rBy->nExpr==BMS-
2a7c0 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  1 );.  if( pOrde
2a7d0 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
2a7e0 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f  >nExpr>=BMS ) pO
2a7f0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57  rderBy = 0;.  sW
2a800 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  LB.pOrderBy = pO
2a810 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69  rderBy;..  /* Di
2a820 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e  sable the DISTIN
2a830 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  CT optimization 
2a840 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  if SQLITE_Distin
2a850 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61  ctOpt is set via
2a860 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  .  ** sqlite3_te
2a870 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54  st_ctrl(SQLITE_T
2a880 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
2a890 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20  TIONS,...) */.  
2a8a0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
2a8b0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
2a8c0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29  ITE_DistinctOpt)
2a8d0 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   ){.    wctrlFla
2a8e0 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e  gs &= ~WHERE_WAN
2a8f0 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a  T_DISTINCT;.  }.
2a900 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
2a910 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
2a920 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2a930 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
2a940 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
2a950 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
2a960 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
2a970 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
2a980 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
2a990 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
2a9a0 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
2a9b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2a9c0 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
2a9d0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
2a9e0 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
2a9f0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
2aa00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
2aa10 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
2aa20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
2aa30 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
2aa40 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
2aa50 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
2aa60 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66  E_OR_SUBCLAUSE f
2aa70 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
2aa80 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
2aa90 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
2aaa0 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
2aab0 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
2aac0 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
2aad0 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
2aae0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
2aaf0 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
2ab00 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
2ab10 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
2ab20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
2ab30 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2ab40 52 5f 53 55 42 43 4c 41 55 53 45 29 20 3f 20 31  R_SUBCLAUSE) ? 1
2ab50 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   : pTabList->nSr
2ab60 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  c;..  /* Allocat
2ab70 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2ab80 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
2ab90 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
2aba0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20  ll become the.  
2abb0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ** return value.
2abc0 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   A single alloca
2abd0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2abe0 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49  store the WhereI
2abf0 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c  nfo.  ** struct,
2ac00 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2ac10 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20   WhereInfo.a[], 
2ac20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
2ac30 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
2ac40 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b  nd the WhereMask
2ac50 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53  Set structure. S
2ac60 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65  ince WhereClause
2ac70 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62   contains an 8-b
2ac80 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28  yte.  ** field (
2ac90 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74  type Bitmask) it
2aca0 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64   must be aligned
2acb0 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   on an 8-byte bo
2acc0 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73  undary on.  ** s
2acd0 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ome architecture
2ace0 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55  s. Hence the ROU
2acf0 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a  ND8() below..  *
2ad00 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d  /.  nByteWInfo =
2ad10 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57   ROUND8(sizeof(W
2ad20 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c  hereInfo)+(nTabL
2ad30 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  ist-1)*sizeof(Wh
2ad40 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57  ereLevel));.  pW
2ad50 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
2ad60 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
2ad70 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a  nByteWInfo + siz
2ad80 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
2ad90 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2ada0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
2adb0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2adc0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
2add0 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
2ade0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2adf0 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
2ae00 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
2ae10 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
2ae20 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
2ae30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
2ae40 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
2ae50 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 68 65 72  .  pWInfo->pWher
2ae60 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 57  e = pWhere;.  pW
2ae70 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
2ae80 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
2ae90 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
2aea0 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66  ePass[0] = pWInf
2aeb0 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
2aec0 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66  1] = -1;.  pWInf
2aed0 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
2aee0 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2aef0 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d  iBreak = pWInfo-
2af00 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  >iContinue = sql
2af10 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2af20 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
2af30 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
2af40 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
2af50 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78  o->iLimit = iAux
2af60 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  Arg;.  pWInfo->s
2af70 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
2af80 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
2af90 6f 6f 70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  oop;.  memset(&p
2afa0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30  WInfo->nOBSat, 0
2afb0 2c 20 0a 20 20 20 20 20 20 20 20 20 6f 66 66 73  , .         offs
2afc0 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 73  etof(WhereInfo,s
2afd0 57 43 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 57  WC) - offsetof(W
2afe0 68 65 72 65 49 6e 66 6f 2c 6e 4f 42 53 61 74 29  hereInfo,nOBSat)
2aff0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49  );.  memset(&pWI
2b000 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  nfo->a[0], 0, si
2b010 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 2b  zeof(WhereLoop)+
2b020 6e 54 61 62 4c 69 73 74 2a 73 69 7a 65 6f 66 28  nTabList*sizeof(
2b030 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
2b040 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2b050 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
2b060 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45  S_OFF );  /* ONE
2b070 50 41 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f  PASS defaults to
2b080 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53   OFF */.  pMaskS
2b090 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d  et = &pWInfo->sM
2b0a0 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70  askSet;.  sWLB.p
2b0b0 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
2b0c0 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57    sWLB.pWC = &pW
2b0d0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c  Info->sWC;.  sWL
2b0e0 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c  B.pNew = (WhereL
2b0f0 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57  oop*)(((char*)pW
2b100 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f  Info)+nByteWInfo
2b110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2b120 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2b130 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a  T(sWLB.pNew) );.
2b140 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
2b150 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64  sWLB.pNew);.#ifd
2b160 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2b170 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64    sWLB.pNew->cId
2b180 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a   = '*';.#endif..
2b190 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
2b1a0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
2b1b0 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
2b1c0 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
2b1d0 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
2b1e0 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
2b1f0 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
2b200 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
2b210 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
2b220 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  Set);.  sqlite3W
2b230 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
2b240 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49  pWInfo->sWC, pWI
2b250 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  nfo);.  sqlite3W
2b260 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66  hereSplit(&pWInf
2b270 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20  o->sWC, pWhere, 
2b280 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
2b290 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
2b2a0 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a   No FROM clause.
2b2b0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c    */.  if( nTabL
2b2c0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ist==0 ){.    if
2b2d0 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ( pOrderBy ) pWI
2b2e0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f  nfo->nOBSat = pO
2b2f0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
2b300 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
2b310 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
2b320 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
2b330 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2b340 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
2b350 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
2b360 7d 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65  }.    ExplainQue
2b370 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
2b380 30 2c 20 22 53 43 41 4e 20 43 4f 4e 53 54 41 4e  0, "SCAN CONSTAN
2b390 54 20 52 4f 57 22 29 29 3b 0a 20 20 7d 65 6c 73  T ROW"));.  }els
2b3a0 65 7b 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e  e{.    /* Assign
2b3b0 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
2b3c0 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
2b3d0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2b3e0 4d 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a  M clause..    **
2b3f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68  .    ** The N-th
2b400 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
2b410 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73 73 69  M clause is assi
2b420 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20 6f  gned a bitmask o
2b430 66 20 31 3c 3c 4e 2e 0a 20 20 20 20 2a 2a 0a 20  f 1<<N..    **. 
2b440 20 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f     ** The rule o
2b450 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
2b460 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73 20  entence ensures 
2b470 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68 65  thta if X is the
2b480 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20 20   bitmask for.   
2b490 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74   ** a table T, t
2b4a0 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62  hen X-1 is the b
2b4b0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f  itmask for all o
2b4c0 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74  ther tables to t
2b4d0 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20  he left of T..  
2b4e0 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65    ** Knowing the
2b4f0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2b500 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2b510 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
2b520 69 6e 20 69 73 0a 20 20 20 20 2a 2a 20 69 6d 70  in is.    ** imp
2b530 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
2b540 23 33 30 31 35 2e 0a 20 20 20 20 2a 2a 0a 20 20  #3015..    **.  
2b550 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
2b560 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
2b570 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
2b580 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
2b590 73 20 69 6e 0a 20 20 20 20 2a 2a 20 70 54 61 62  s in.    ** pTab
2b5a0 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74  List, not just t
2b5b0 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73  he first nTabLis
2b5c0 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c  t tables.  nTabL
2b5d0 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ist is normally.
2b5e0 20 20 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20      ** equal to 
2b5f0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62  pTabList->nSrc b
2b600 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  ut might be shor
2b610 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68  tened to 1 if th
2b620 65 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 5f 4f  e.    ** WHERE_O
2b630 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67  R_SUBCLAUSE flag
2b640 20 69 73 20 73 65 74 2e 0a 20 20 20 20 2a 2f 0a   is set..    */.
2b650 20 20 20 20 69 69 20 3d 20 30 3b 0a 20 20 20 20      ii = 0;.    
2b660 64 6f 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65  do{.      create
2b670 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2b680 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
2b690 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 73  Cursor);.      s
2b6a0 71 6c 69 74 65 33 57 68 65 72 65 54 61 62 46 75  qlite3WhereTabFu
2b6b0 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c 20 26  ncArgs(pParse, &
2b6c0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c  pTabList->a[ii],
2b6d0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
2b6e0 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 69      }while( (++i
2b6f0 69 29 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  i)<pTabList->nSr
2b700 63 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51  c );.  #ifdef SQ
2b710 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b  LITE_DEBUG.    {
2b720 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2b730 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  x = 0;.      for
2b740 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
2b750 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
2b760 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
2b770 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72   m = sqlite3Wher
2b780 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eGetMask(pMaskSe
2b790 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
2b7a0 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2b7b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 3e 3d       assert( m>=
2b7c0 6d 78 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 78  mx );.        mx
2b7d0 20 3d 20 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = m;.      }.  
2b7e0 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d    }.  #endif.  }
2b7f0 0a 20 20 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  .  .  /* Analyze
2b800 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
2b810 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20  xpressions. */. 
2b820 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2b830 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
2b840 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  t, &pWInfo->sWC)
2b850 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
2b860 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2b870 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2b880 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
2b890 61 73 65 3a 20 57 48 45 52 45 20 74 65 72 6d 73  ase: WHERE terms
2b8a0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 66   that do not ref
2b8b0 65 72 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 73  er to any tables
2b8c0 20 69 6e 20 74 68 65 20 6a 6f 69 6e 0a 20 20 2a   in the join.  *
2b8d0 2a 20 28 63 6f 6e 73 74 61 6e 74 20 65 78 70 72  * (constant expr
2b8e0 65 73 73 69 6f 6e 73 29 2e 20 45 76 61 6c 75 61  essions). Evalua
2b8f0 74 65 20 65 61 63 68 20 73 75 63 68 20 74 65 72  te each such ter
2b900 6d 2c 20 61 6e 64 20 6a 75 6d 70 20 6f 76 65 72  m, and jump over
2b910 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 67 65   all the.  ** ge
2b920 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69 66 20  nerated code if 
2b930 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
2b940 74 20 74 72 75 65 2e 20 20 0a 20 20 2a 2a 0a 20  t true.  .  **. 
2b950 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   ** Do not do th
2b960 69 73 20 69 66 20 74 68 65 20 65 78 70 72 65 73  is if the expres
2b970 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  sion contains no
2b980 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
2b990 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 74  functions.  ** t
2b9a0 68 61 74 20 61 72 65 20 6e 6f 74 20 77 69 74 68  hat are not with
2b9b0 69 6e 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  in a sub-select.
2b9c0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 73 74 72   This is not str
2b9d0 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 2c 20  ictly required, 
2b9e0 62 75 74 0a 20 20 2a 2a 20 70 72 65 73 65 72 76  but.  ** preserv
2b9f0 65 73 20 53 51 4c 69 74 65 27 73 20 6c 65 67 61  es SQLite's lega
2ba00 63 79 20 62 65 68 61 76 69 6f 75 72 20 69 6e 20  cy behaviour in 
2ba10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
2ba20 6f 20 63 61 73 65 73 3a 0a 20 20 2a 2a 0a 20 20  o cases:.  **.  
2ba30 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48  **   FROM ... WH
2ba40 45 52 45 20 72 61 6e 64 6f 6d 28 29 3e 30 3b 20  ERE random()>0; 
2ba50 20 20 20 20 20 20 20 20 20 20 2d 2d 20 65 76 61            -- eva
2ba60 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20  l random() once 
2ba70 70 65 72 20 72 6f 77 0a 20 20 2a 2a 20 20 20 46  per row.  **   F
2ba80 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 28 53  ROM ... WHERE (S
2ba90 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29 29 3e  ELECT random())>
2baa0 30 3b 20 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64  0;  -- eval rand
2bab0 6f 6d 28 29 20 6f 6e 63 65 20 6f 76 65 72 61 6c  om() once overal
2bac0 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  l.  */.  for(ii=
2bad0 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  0; ii<sWLB.pWC->
2bae0 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
2baf0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 20    WhereTerm *pT 
2bb00 3d 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  = &sWLB.pWC->a[i
2bb10 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 2d 3e  i];.    if( pT->
2bb20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
2bb30 49 52 54 55 41 4c 20 29 20 63 6f 6e 74 69 6e 75  IRTUAL ) continu
2bb40 65 3b 0a 20 20 20 20 69 66 28 20 70 54 2d 3e 70  e;.    if( pT->p
2bb50 72 65 72 65 71 41 6c 6c 3d 3d 30 20 26 26 20 28  rereqAll==0 && (
2bb60 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 65  nTabList==0 || e
2bb70 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74  xprIsDeterminist
2bb80 69 63 28 70 54 2d 3e 70 45 78 70 72 29 29 20 29  ic(pT->pExpr)) )
2bb90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2bba0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2bbb0 65 2c 20 70 54 2d 3e 70 45 78 70 72 2c 20 70 57  e, pT->pExpr, pW
2bbc0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51  Info->iBreak, SQ
2bbd0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2bbe0 3b 0a 20 20 20 20 20 20 70 54 2d 3e 77 74 46 6c  ;.      pT->wtFl
2bbf0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
2bc00 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
2bc10 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
2bc20 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2bc30 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
2bc40 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
2bc50 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
2bc60 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
2bc70 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20  WC, pResultSet) 
2bc80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2bc90 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67  DISTINCT marking
2bca0 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20   is pointless.  
2bcb0 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20  Ignore it. */.  
2bcc0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2bcd0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2bce0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
2bcf0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
2bd00 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
2bd10 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45    /* Try to ORDE
2bd20 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20  R BY the result 
2bd30 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74  set to make dist
2bd40 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20  inct processing 
2bd50 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20  easier */.      
2bd60 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2bd70 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54  gs |= WHERE_DIST
2bd80 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57  INCTBY;.      pW
2bd90 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
2bda0 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
2bdb0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
2bdc0 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65  struct the Where
2bdd0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
2bde0 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52  #if defined(WHER
2bdf0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
2be00 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2be10 72 65 54 72 61 63 65 20 26 20 30 78 66 66 66 66  reTrace & 0xffff
2be20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2be30 65 62 75 67 50 72 69 6e 74 66 28 22 2a 2a 2a 20  ebugPrintf("*** 
2be40 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
2be50 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67 73 3a  *** (wctrlFlags:
2be60 20 30 78 25 78 22 2c 77 63 74 72 6c 46 6c 61 67   0x%x",wctrlFlag
2be70 73 29 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72  s);.    if( wctr
2be80 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  lFlags & WHERE_U
2be90 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  SE_LIMIT ){.    
2bea0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2beb0 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74 3a 20 25  intf(", limit: %
2bec0 64 22 2c 20 69 41 75 78 41 72 67 29 3b 0a 20 20  d", iAuxArg);.  
2bed0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
2bee0 65 62 75 67 50 72 69 6e 74 66 28 22 29 5c 6e 22  ebugPrintf(")\n"
2bef0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
2bf00 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
2bf10 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73   0x100 ){ /* Dis
2bf20 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f  play all terms o
2bf30 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2bf40 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  se */.    sqlite
2bf50 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e  3WhereClausePrin
2bf60 74 28 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 7d  t(sWLB.pWC);.  }
2bf70 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
2bf80 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68  TabList!=1 || wh
2bf90 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c  ereShortCut(&sWL
2bfa0 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  B)==0 ){.    rc 
2bfb0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  = whereLoopAddAl
2bfc0 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66  l(&sWLB);.    if
2bfd0 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
2bfe0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a  eBeginError;.  .
2bff0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2c000 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
2c010 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2c020 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44 69 73  ace ){    /* Dis
2c030 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20  play all of the 
2c040 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2c050 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72 65  s */.      Where
2c060 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69  Loop *p;.      i
2c070 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74  nt i;.      stat
2c080 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c  ic const char zL
2c090 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35  abel[] = "012345
2c0a0 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c  6789abcdefghijkl
2c0b0 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a  mnopqrstuvwyxz".
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42               "AB
2c0f0 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
2c100 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20  STUVWYXZ";.     
2c110 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70   for(p=pWInfo->p
2c120 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70  Loops, i=0; p; p
2c130 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69  =p->pNextLoop, i
2c140 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
2c150 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 28  cId = zLabel[i%(
2c160 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2d 31  sizeof(zLabel)-1
2c170 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  )];.        wher
2c180 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57  eLoopPrint(p, sW
2c190 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d  LB.pWC);.      }
2c1a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2c1b0 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f  .    wherePathSo
2c1c0 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b  lver(pWInfo, 0);
2c1d0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2c1e0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2c1f0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2c200 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2c210 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
2c220 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f       wherePathSo
2c230 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49  lver(pWInfo, pWI
2c240 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b  nfo->nRowOut+1);
2c250 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  .       if( db->
2c260 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2c270 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2c280 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
2c290 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
2c2a0 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d  derBy==0 && (db-
2c2b0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2c2c0 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30  ReverseOrder)!=0
2c2d0 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d   ){.     pWInfo-
2c2e0 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c 4c 42 49  >revMask = ALLBI
2c2f0 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  TS;.  }.  if( pP
2c300 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45  arse->nErr || NE
2c310 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  VER(db->mallocFa
2c320 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  iled) ){.    got
2c330 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2c340 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48  r;.  }.#ifdef WH
2c350 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2c360 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
2c370 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
2c380 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2c390 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
2c3a0 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
2c3b0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
2c3c0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
2c3d0 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  BSat>0 ){.      
2c3e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2c3f0 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c  tf(" ORDERBY=%d,
2c400 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d  0x%llx", pWInfo-
2c410 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d  >nOBSat, pWInfo-
2c420 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  >revMask);.    }
2c430 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49  .    switch( pWI
2c440 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29  nfo->eDistinct )
2c450 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
2c460 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
2c470 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
2c480 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2c490 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69  ("  DISTINCT=uni
2c4a0 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62  que");.        b
2c4b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2c4c0 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
2c4d0 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
2c4e0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2c4f0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
2c500 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65   DISTINCT=ordere
2c510 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
2c520 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2c530 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
2c540 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a  TINCT_UNORDERED:
2c550 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2c560 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
2c570 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65   DISTINCT=unorde
2c580 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
2c590 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2c5a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
2c5b0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
2c5c0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2c5d0 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  ii<pWInfo->nLeve
2c5e0 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
2c5f0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
2c600 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c  WInfo->a[ii].pWL
2c610 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  oop, sWLB.pWC);.
2c620 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2c630 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  ..  /* Attempt t
2c640 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72  o omit tables fr
2c650 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74  om the join that
2c660 20 64 6f 20 6e 6f 74 20 61 66 66 65 63 74 20 74   do not affect t
2c670 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2a 20  he result..  ** 
2c680 46 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 20 6e  For a table to n
2c690 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 72 65  ot affect the re
2c6a0 73 75 6c 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  sult, the follow
2c6b0 69 6e 67 20 6d 75 73 74 20 62 65 20 74 72 75 65  ing must be true
2c6c0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29  :.  **.  **   1)
2c6d0 20 54 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   The query must 
2c6e0 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
2c6f0 61 74 65 2e 0a 20 20 2a 2a 20 20 20 32 29 20 54  ate..  **   2) T
2c700 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
2c710 20 74 68 65 20 52 48 53 20 6f 66 20 61 20 4c 45   the RHS of a LE
2c720 46 54 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 20 20 20  FT JOIN..  **   
2c730 33 29 20 45 69 74 68 65 72 20 74 68 65 20 71 75  3) Either the qu
2c740 65 72 79 20 6d 75 73 74 20 62 65 20 44 49 53 54  ery must be DIST
2c750 49 4e 43 54 2c 20 6f 72 20 65 6c 73 65 20 74 68  INCT, or else th
2c760 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2c770 61 75 73 65 0a 20 20 2a 2a 20 20 20 20 20 20 6d  ause.  **      m
2c780 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f  ust contain a co
2c790 6e 73 74 72 61 69 6e 74 20 74 68 61 74 20 6c 69  nstraint that li
2c7a0 6d 69 74 73 20 74 68 65 20 73 63 61 6e 20 6f 66  mits the scan of
2c7b0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 0a 20   the table to . 
2c7c0 20 2a 2a 20 20 20 20 20 20 61 74 20 6d 6f 73 74   **      at most
2c7d0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20   a single row.. 
2c7e0 20 2a 2a 20 20 20 34 29 20 54 68 65 20 74 61 62   **   4) The tab
2c7f0 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 72  le must not be r
2c800 65 66 65 72 65 6e 63 65 64 20 62 79 20 61 6e 79  eferenced by any
2c810 20 70 61 72 74 20 6f 66 20 74 68 65 20 71 75 65   part of the que
2c820 72 79 20 61 70 61 72 74 0a 20 20 2a 2a 20 20 20  ry apart.  **   
2c830 20 20 20 66 72 6f 6d 20 69 74 73 20 6f 77 6e 20     from its own 
2c840 55 53 49 4e 47 20 6f 72 20 4f 4e 20 63 6c 61 75  USING or ON clau
2c850 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  se..  **.  ** Fo
2c860 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e  r example, given
2c870 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2c880 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2c890 69 70 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ipk INTEGER PRIM
2c8a0 41 52 59 20 4b 45 59 2c 20 76 31 29 3b 0a 20 20  ARY KEY, v1);.  
2c8b0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
2c8c0 42 4c 45 20 74 32 28 69 70 6b 20 49 4e 54 45 47  BLE t2(ipk INTEG
2c8d0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
2c8e0 76 32 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  v2);.  **     CR
2c8f0 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 69 70  EATE TABLE t3(ip
2c900 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
2c910 59 20 4b 45 59 2c 20 76 33 29 3b 0a 20 20 2a 2a  Y KEY, v3);.  **
2c920 0a 20 20 2a 2a 20 74 68 65 6e 20 74 61 62 6c 65  .  ** then table
2c930 20 74 32 20 63 61 6e 20 62 65 20 6f 6d 69 74 74   t2 can be omitt
2c940 65 64 20 66 72 6f 6d 20 74 68 65 20 66 6f 6c 6c  ed from the foll
2c950 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
2c960 20 20 20 20 20 53 45 4c 45 43 54 20 76 31 2c 20       SELECT v1, 
2c970 76 33 20 46 52 4f 4d 20 74 31 20 0a 20 20 2a 2a  v3 FROM t1 .  **
2c980 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e         LEFT JOIN
2c990 20 74 32 20 55 53 49 4e 47 20 28 74 31 2e 69 70   t2 USING (t1.ip
2c9a0 6b 3d 74 32 2e 69 70 6b 29 0a 20 20 2a 2a 20 20  k=t2.ipk).  **  
2c9b0 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74       LEFT JOIN t
2c9c0 33 20 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d  3 USING (t1.ipk=
2c9d0 74 33 2e 69 70 6b 29 0a 20 20 2a 2a 0a 20 20 2a  t3.ipk).  **.  *
2c9e0 2a 20 6f 72 20 66 72 6f 6d 3a 0a 20 20 2a 2a 0a  * or from:.  **.
2c9f0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2ca00 44 49 53 54 49 4e 43 54 20 76 31 2c 20 76 33 20  DISTINCT v1, v3 
2ca10 46 52 4f 4d 20 74 31 20 0a 20 20 2a 2a 20 20 20  FROM t1 .  **   
2ca20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32      LEFT JOIN t2
2ca30 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54  .  **       LEFT
2ca40 20 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47 20 28   JOIN t3 USING (
2ca50 74 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20  t1.ipk=t3.ipk). 
2ca60 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
2ca70 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
2ca80 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
2ca90 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73  el>=2.   && pRes
2caa0 75 6c 74 53 65 74 21 3d 30 20 20 20 20 20 20 20  ultSet!=0       
2cab0 20 20 20 20 20 20 20 20 2f 2a 20 67 75 61 72 61          /* guara
2cac0 6e 74 65 65 73 20 63 6f 6e 64 69 74 69 6f 6e 20  ntees condition 
2cad0 28 31 29 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  (1) above */.   
2cae0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2caf0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2cb00 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a  E_OmitNoopJoin).
2cb10 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    ){.    int i;.
2cb20 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55      Bitmask tabU
2cb30 73 65 64 20 3d 20 73 71 6c 69 74 65 33 57 68 65  sed = sqlite3Whe
2cb40 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
2cb50 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c  pMaskSet, pResul
2cb60 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tSet);.    if( s
2cb70 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  WLB.pOrderBy ){.
2cb80 20 20 20 20 20 20 74 61 62 55 73 65 64 20 7c 3d        tabUsed |=
2cb90 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2cba0 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b  rListUsage(pMask
2cbb0 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72  Set, sWLB.pOrder
2cbc0 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  By);.    }.    f
2cbd0 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65  or(i=pWInfo->nLe
2cbe0 76 65 6c 2d 31 3b 20 69 3e 3d 31 3b 20 69 2d 2d  vel-1; i>=1; i--
2cbf0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
2cc00 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64  rm *pTerm, *pEnd
2cc10 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
2cc20 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2cc30 65 6d 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20  em;.      pLoop 
2cc40 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  = pWInfo->a[i].p
2cc50 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 70 49 74  WLoop;.      pIt
2cc60 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  em = &pWInfo->pT
2cc70 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
2cc80 3e 69 54 61 62 5d 3b 0a 20 20 20 20 20 20 69 66  >iTab];.      if
2cc90 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69  ( (pItem->fg.joi
2cca0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
2ccb0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2ccc0 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
2ccd0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2cce0 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a  NT_DISTINCT)==0.
2ccf0 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
2cd00 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2cd10 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20  E_ONEROW)==0.   
2cd20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f     ){.        co
2cd30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2cd40 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55 73        if( (tabUs
2cd50 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ed & pLoop->mask
2cd60 53 65 6c 66 29 21 3d 30 20 29 20 63 6f 6e 74 69  Self)!=0 ) conti
2cd70 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  nue;.      pEnd 
2cd80 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20  = sWLB.pWC->a + 
2cd90 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
2cda0 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
2cdb0 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
2cdc0 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
2cdd0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2cde0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
2cdf0 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
2ce00 65 6c 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  elf)!=0 ){.     
2ce10 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
2ce20 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
2ce30 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
2ce40 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  oin).           
2ce50 7c 7c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  || pTerm->pExpr-
2ce60 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
2ce70 21 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  !=pItem->iCursor
2ce80 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
2ce90 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2cea0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ceb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2cec0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70       if( pTerm<p
2ced0 45 6e 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  End ) continue;.
2cee0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
2cef0 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72  (0xffff, ("-> dr
2cf00 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75  op loop %c not u
2cf10 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63  sed\n", pLoop->c
2cf20 49 64 29 29 3b 0a 20 20 20 20 20 20 6e 6f 74 52  Id));.      notR
2cf30 65 61 64 79 20 26 3d 20 7e 70 4c 6f 6f 70 2d 3e  eady &= ~pLoop->
2cf40 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
2cf50 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
2cf60 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
2cf70 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
2cf80 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2cf90 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
2cfa0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
2cfb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
2cfc0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
2cfd0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
2cfe0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2cff0 20 20 20 20 69 66 28 20 69 21 3d 70 57 49 6e 66      if( i!=pWInf
2d000 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20  o->nLevel-1 ){. 
2d010 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
2d020 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   = (pWInfo->nLev
2d030 65 6c 2d 31 2d 69 29 20 2a 20 73 69 7a 65 6f 66  el-1-i) * sizeof
2d040 28 57 68 65 72 65 4c 65 76 65 6c 29 3b 0a 20 20  (WhereLevel);.  
2d050 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70        memmove(&p
2d060 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2c 20 26 70 57  WInfo->a[i], &pW
2d070 49 6e 66 6f 2d 3e 61 5b 69 2b 31 5d 2c 20 6e 42  Info->a[i+1], nB
2d080 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  yte);.      }.  
2d090 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76      pWInfo->nLev
2d0a0 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62  el--;.      nTab
2d0b0 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  List--;.    }.  
2d0c0 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  }.  WHERETRACE(0
2d0d0 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69  xffff,("*** Opti
2d0e0 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a  mizer Finished *
2d0f0 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66  **\n"));.  pWInf
2d100 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  o->pParse->nQuer
2d110 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d  yLoop += pWInfo-
2d120 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20  >nRowOut;..  /* 
2d130 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
2d140 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
2d150 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
2d160 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
2d170 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
2d180 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
2d190 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
2d1a0 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
2d1b0 69 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  iate..  **.  ** 
2d1c0 41 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f  A one-pass appro
2d1d0 61 63 68 20 63 61 6e 20 62 65 20 75 73 65 64 20  ach can be used 
2d1e0 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  if the caller ha
2d1f0 73 20 72 65 71 75 65 73 74 65 64 20 6f 6e 65 0a  s requested one.
2d200 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20    ** and either 
2d210 28 61 29 20 74 68 65 20 73 63 61 6e 20 76 69 73  (a) the scan vis
2d220 69 74 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  its at most one 
2d230 72 6f 77 20 6f 72 20 28 62 29 20 65 61 63 68 0a  row or (b) each.
2d240 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c    ** of the foll
2d250 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
2d260 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 74 68    **.  **   * th
2d270 65 20 63 61 6c 6c 65 72 20 68 61 73 20 69 6e 64  e caller has ind
2d280 69 63 61 74 65 64 20 74 68 61 74 20 61 20 6f 6e  icated that a on
2d290 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  e-pass approach 
2d2a0 63 61 6e 20 62 65 20 75 73 65 64 0a 20 20 2a 2a  can be used.  **
2d2b0 20 20 20 20 20 77 69 74 68 20 6d 75 6c 74 69 70       with multip
2d2c0 6c 65 20 72 6f 77 73 20 28 62 79 20 73 65 74 74  le rows (by sett
2d2d0 69 6e 67 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  ing WHERE_ONEPAS
2d2e0 53 5f 4d 55 4c 54 49 52 4f 57 29 2c 20 61 6e 64  S_MULTIROW), and
2d2f0 0a 20 20 2a 2a 20 20 20 2a 20 74 68 65 20 74 61  .  **   * the ta
2d300 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 72  ble is not a vir
2d310 74 75 61 6c 20 74 61 62 6c 65 2c 20 61 6e 64 0a  tual table, and.
2d320 20 20 2a 2a 20 20 20 2a 20 65 69 74 68 65 72 20    **   * either 
2d330 74 68 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f  the scan does no
2d340 74 20 75 73 65 20 74 68 65 20 4f 52 20 6f 70 74  t use the OR opt
2d350 69 6d 69 7a 61 74 69 6f 6e 20 6f 72 20 74 68 65  imization or the
2d360 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 20 20 20   caller.  **    
2d370 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f 70 65   is a DELETE ope
2d380 72 61 74 69 6f 6e 20 28 57 48 45 52 45 5f 44 55  ration (WHERE_DU
2d390 50 4c 49 43 41 54 45 53 5f 4f 4b 20 69 73 20 6f  PLICATES_OK is o
2d3a0 6e 6c 79 20 73 70 65 63 69 66 69 65 64 0a 20 20  nly specified.  
2d3b0 2a 2a 20 20 20 20 20 66 6f 72 20 44 45 4c 45 54  **     for DELET
2d3c0 45 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  E)..  **.  ** Th
2d3d0 65 20 6c 61 73 74 20 71 75 61 6c 69 66 69 63 61  e last qualifica
2d3e0 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20  tion is because 
2d3f0 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
2d400 65 6e 74 20 75 73 65 73 0a 20 20 2a 2a 20 57 68  ent uses.  ** Wh
2d410 65 72 65 49 6e 66 6f 2e 61 69 43 75 72 4f 6e 65  ereInfo.aiCurOne
2d420 50 61 73 73 5b 31 5d 20 74 6f 20 64 65 74 65 72  Pass[1] to deter
2d430 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
2d440 6e 6f 74 20 69 74 20 72 65 61 6c 6c 79 20 63 61  not it really ca
2d450 6e 0a 20 20 2a 2a 20 75 73 65 20 61 20 6f 6e 65  n.  ** use a one
2d460 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 2c 20  -pass approach, 
2d470 61 6e 64 20 74 68 69 73 20 69 73 20 6e 6f 74 20  and this is not 
2d480 73 65 74 20 61 63 63 75 72 61 74 65 6c 79 20 66  set accurately f
2d490 6f 72 20 73 63 61 6e 73 0a 20 20 2a 2a 20 74 68  or scans.  ** th
2d4a0 61 74 20 75 73 65 20 74 68 65 20 4f 52 20 6f 70  at use the OR op
2d4b0 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  timization..  */
2d4c0 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
2d4d0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2d4e0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2d4f0 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =0 || pWInfo->nL
2d500 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28  evel==1 );.  if(
2d510 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2d520 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2d530 49 52 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  IRED)!=0 ){.    
2d540 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 70 57  int wsFlags = pW
2d550 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
2d560 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
2d570 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d 20 28 77  int bOnerow = (w
2d580 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2d590 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20 20 20 69  NEROW)!=0;.    i
2d5a0 66 28 20 62 4f 6e 65 72 6f 77 20 7c 7c 20 28 0a  f( bOnerow || (.
2d5b0 20 20 20 20 20 20 20 20 30 21 3d 28 77 63 74 72          0!=(wctr
2d5c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2d5d0 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29  NEPASS_MULTIROW)
2d5e0 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 77 73 46  .     && 0==(wsF
2d5f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2d600 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
2d610 26 26 20 28 30 3d 3d 28 77 73 46 6c 61 67 73 20  && (0==(wsFlags 
2d620 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
2d630 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73  ) || (wctrlFlags
2d640 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
2d650 54 45 53 5f 4f 4b 29 29 0a 20 20 20 20 29 29 7b  TES_OK)).    )){
2d660 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
2d670 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f  OnePass = bOnero
2d680 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47  w ? ONEPASS_SING
2d690 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c  LE : ONEPASS_MUL
2d6a0 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61  TI;.      if( Ha
2d6b0 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d  sRowid(pTabList-
2d6c0 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20 28  >a[0].pTab) && (
2d6d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2d6e0 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
2d6f0 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c       if( wctrlFl
2d700 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2d710 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a  ASS_MULTIROW ){.
2d720 20 20 20 20 20 20 20 20 20 20 62 46 6f 72 64 65            bForde
2d730 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f  lete = OPFLAG_FO
2d740 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  RDELETE;.       
2d750 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66   }.        pWInf
2d760 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
2d770 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61  wsFlags = (wsFla
2d780 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58 5f  gs & ~WHERE_IDX_
2d790 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ONLY);.      }. 
2d7a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f     }.  }..  /* O
2d7b0 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
2d7c0 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
2d7d0 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
2d7e0 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
2d7f0 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
2d800 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
2d810 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
2d820 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
2d830 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
2d840 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
2d850 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
2d860 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
2d870 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
2d880 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2d890 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
2d8a0 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
2d8b0 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
2d8c0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2d8d0 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
2d8e0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
2d8f0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2d900 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
2d910 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
2d920 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
2d930 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
2d940 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
2d950 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
2d960 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
2d970 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
2d980 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
2d990 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
2d9a0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
2d9b0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
2d9c0 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
2d9d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d9e0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2d9f0 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
2da00 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2da10 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
2da20 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
2da30 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
2da40 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
2da50 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
2da60 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
2da70 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
2da80 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2da90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2daa0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
2dab0 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
2dac0 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
2dad0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
2dae0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
2daf0 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
2db00 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
2db10 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
2db20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2db30 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
2db40 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
2db50 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2db60 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
2db70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
2db80 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   = OP_OpenRead;.
2db90 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2dba0 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ->eOnePass!=ONEP
2dbb0 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
2dbc0 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
2dbd0 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
2dbe0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
2dbf0 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d  ss[0] = pTabItem
2dc00 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2dc10 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   };.      sqlite
2dc20 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2dc30 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
2dc40 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
2dc50 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65   op);.      asse
2dc60 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  rt( pTabItem->iC
2dc70 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69  ursor==pLevel->i
2dc80 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20  TabCur );.      
2dc90 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
2dca0 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2dcb0 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
2dcc0 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
2dcd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2dce0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2dcf0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
2dd00 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
2dd10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
2dd20 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
2dd30 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
2dd40 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26  Tab->nCol<BMS &&
2dd50 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
2dd60 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
2dd70 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
2dd80 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
2dd90 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
2dda0 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
2ddb0 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
2ddc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ddd0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
2dde0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
2ddf0 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  R(n), P4_INT32);
2de00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2de10 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   n<=pTab->nCol )
2de20 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
2de30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2de40 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
2de50 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62    if( pLoop->u.b
2de60 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
2de70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2de80 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2de90 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 7c 62   OPFLAG_SEEKEQ|b
2dea0 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20  Fordelete);.    
2deb0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2dec0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73       {.        s
2ded0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2dee0 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65 74 65  P5(v, bFordelete
2def0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
2df00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2df10 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
2df20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2df30 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
2df40 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
2df50 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2df60 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
2df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df80 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38 2a 29       (const u8*)
2df90 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73  &pTabItem->colUs
2dfa0 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  ed, P4_INT64);.#
2dfb0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2dfc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
2dfd0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
2dfe0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
2dff0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
2e000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e010 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2e020 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
2e030 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
2e040 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Ix = pLoop->u.bt
2e050 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
2e060 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b    int iIndexCur;
2e070 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
2e080 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
2e090 20 20 20 2f 2a 20 69 41 75 78 41 72 67 20 69 73     /* iAuxArg is
2e0a0 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 61   always set to a
2e0b0 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
2e0c0 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f  if ONEPASS is po
2e0d0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  ssible */.      
2e0e0 61 73 73 65 72 74 28 20 69 41 75 78 41 72 67 21  assert( iAuxArg!
2e0f0 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77  =0 || (pWInfo->w
2e100 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2e110 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2e120 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)==0 );.      i
2e130 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
2e140 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  b) && IsPrimaryK
2e150 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20  eyIndex(pIx).   
2e160 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
2e170 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
2e180 42 43 4c 41 55 53 45 29 21 3d 30 0a 20 20 20 20  BCLAUSE)!=0.    
2e190 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
2e1a0 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d  This is one term
2e1b0 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69   of an OR-optimi
2e1c0 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  zation using the
2e1d0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20   PRIMARY KEY of 
2e1e0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54  a.        ** WIT
2e1f0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
2e200 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61  .  No need for a
2e210 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 20   separate index 
2e220 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  */.        iInde
2e230 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
2e240 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20  TabCur;.        
2e250 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  op = 0;.      }e
2e260 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  lse if( pWInfo->
2e270 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
2e280 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20  S_OFF ){.       
2e290 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61   Index *pJ = pTa
2e2a0 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e  bItem->pTab->pIn
2e2b0 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e  dex;.        iIn
2e2c0 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72 67  dexCur = iAuxArg
2e2d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2e2e0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2e2f0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2e300 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  IRED );.        
2e310 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a  while( ALWAYS(pJ
2e320 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a  ) && pJ!=pIx ){.
2e330 20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78            iIndex
2e340 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Cur++;.         
2e350 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b   pJ = pJ->pNext;
2e360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e370 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
2e380 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
2e390 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
2e3a0 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75  ss[1] = iIndexCu
2e3b0 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  r;.      }else i
2e3c0 66 28 20 69 41 75 78 41 72 67 20 26 26 20 28 77  f( iAuxArg && (w
2e3d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2e3e0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21  E_OR_SUBCLAUSE)!
2e3f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49  =0 ){.        iI
2e400 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72  ndexCur = iAuxAr
2e410 67 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  g;.        op = 
2e420 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20  OP_ReopenIdx;.  
2e430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e440 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70     iIndexCur = p
2e450 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2e460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
2e470 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
2e480 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
2e490 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63  assert( pIx->pSc
2e4a0 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
2e4b0 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ema );.      ass
2e4c0 65 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d  ert( iIndexCur>=
2e4d0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 );.      if( o
2e4e0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  p ){.        sql
2e4f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2e500 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c  , op, iIndexCur,
2e510 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29   pIx->tnum, iDb)
2e520 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e530 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
2e540 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a  o(pParse, pIx);.
2e550 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f          if( (pLo
2e560 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2e570 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21  ERE_CONSTRAINT)!
2e580 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2e590 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2e5a0 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52   (WHERE_COLUMN_R
2e5b0 41 4e 47 45 7c 57 48 45 52 45 5f 53 4b 49 50 53  ANGE|WHERE_SKIPS
2e5c0 43 41 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20 20  CAN))==0.       
2e5d0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
2e5e0 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
2e5f0 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20  RDERBY_MIN)==0. 
2e600 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
2e610 6f 2d 3e 65 44 69 73 74 69 6e 63 74 21 3d 57 48  o->eDistinct!=WH
2e620 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
2e630 45 52 45 44 0a 20 20 20 20 20 20 20 20 29 7b 0a  ERED.        ){.
2e640 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e650 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2e660 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b   OPFLAG_SEEKEQ);
2e670 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44   /* Hint to COMD
2e680 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  B2 */.        }.
2e690 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
2e6a0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
2e6b0 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64  x->zName));.#ifd
2e6c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2e6d0 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
2e6e0 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  K.        {.    
2e6f0 20 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65        u64 colUse
2e700 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
2e710 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20   int ii, jj;.   
2e720 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
2e730 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e   ii<pIx->nColumn
2e740 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
2e750 20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61       jj = pIx->a
2e760 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20  iColumn[ii];.   
2e770 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c           if( jj<
2e780 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2e790 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a            if( jj
2e7a0 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20  >63 ) jj = 63;. 
2e7b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2e7c0 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
2e7d0 64 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29  d & MASKBIT(jj))
2e7e0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2e7f0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55              colU
2e800 73 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c  sed |= ((u64)1)<
2e810 3c 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36  <(ii<63 ? ii : 6
2e820 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  3);.          }.
2e830 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e840 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
2e850 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
2e860 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c  d, iIndexCur, 0,
2e870 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e890 20 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65      (u8*)&colUse
2e8a0 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  d, P4_INT64);.  
2e8b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f        }.#endif /
2e8c0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
2e8d0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
2e8e0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2e8f0 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30  }.    if( iDb>=0
2e900 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65   ) sqlite3CodeVe
2e910 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
2e920 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70  e, iDb);.  }.  p
2e930 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71  WInfo->iTop = sq
2e940 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2e950 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64  Addr(v);.  if( d
2e960 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2e970 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2e980 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65  nError;..  /* Ge
2e990 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
2e9a0 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68  to do the search
2e9b0 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f  .  Each iteratio
2e9c0 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a  n of the for.  *
2e9d0 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e  * loop below gen
2e9e0 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
2e9f0 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20  a single nested 
2ea00 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20  loop of the VM. 
2ea10 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a   ** program..  *
2ea20 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
2ea30 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29  <nTabList; ii++)
2ea40 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 78  {.    int addrEx
2ea50 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77  plain;.    int w
2ea60 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  sFlags;.    pLev
2ea70 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
2ea80 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73  ii];.    wsFlags
2ea90 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2eaa0 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e  p->wsFlags;.#ifn
2eab0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2eac0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
2ead0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
2eae0 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
2eaf0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
2eb00 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
2eb10 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
2eb20 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
2eb30 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20   &pWInfo->sWC,. 
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2eb50 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2eb60 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52  el->iFrom], notR
2eb70 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20  eady, pLevel);. 
2eb80 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
2eb90 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2eba0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2ebb0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2ebc0 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d     addrExplain =
2ebd0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2ebe0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
2ebf0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54 61       pParse, pTa
2ec00 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 77  bList, pLevel, w
2ec10 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b  ctrlFlags.    );
2ec20 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
2ec30 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  rBody = sqlite3V
2ec40 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2ec50 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
2ec60 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f  = sqlite3WhereCo
2ec70 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70  deOneLoopStart(p
2ec80 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65  WInfo, ii, notRe
2ec90 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  ady);.    pWInfo
2eca0 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c  ->iContinue = pL
2ecb0 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a  evel->addrCont;.
2ecc0 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
2ecd0 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
2ece0 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c 61  ==0 && (wctrlFla
2ecf0 67 73 26 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  gs&WHERE_OR_SUBC
2ed00 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  LAUSE)==0 ){.   
2ed10 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 41     sqlite3WhereA
2ed20 64 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20  ddScanStatus(v, 
2ed30 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
2ed40 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a  , addrExplain);.
2ed50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2ed60 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d  Done. */.  VdbeM
2ed70 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
2ed80 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f   "Begin WHERE-co
2ed90 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  re"));.  return 
2eda0 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
2edb0 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
2edc0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
2edd0 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
2ede0 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
2edf0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2ee00 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
2ee10 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
2ee20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
2ee30 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
2ee40 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2ee50 2f 2a 0a 2a 2a 20 50 61 72 74 20 6f 66 20 73 71  /*.** Part of sq
2ee60 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
2ee70 77 69 6c 6c 20 72 65 77 72 69 74 65 20 6f 70 63  will rewrite opc
2ee80 6f 64 65 73 20 74 6f 20 72 65 66 65 72 65 6e 63  odes to referenc
2ee90 65 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 72  e the.** index r
2eea0 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d  ather than the m
2eeb0 61 69 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20 53  ain table.  In S
2eec0 51 4c 49 54 45 5f 44 45 42 55 47 20 6d 6f 64 65  QLITE_DEBUG mode
2eed0 2c 20 77 65 20 77 61 6e 74 0a 2a 2a 20 74 6f 20  , we want.** to 
2eee0 74 72 61 63 65 20 74 68 6f 73 65 20 63 68 61 6e  trace those chan
2eef0 67 65 73 20 69 66 20 50 52 41 47 4d 41 20 76 64  ges if PRAGMA vd
2ef00 62 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f 6e  be_addoptrace=on
2ef10 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
2ef20 2a 2a 20 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f  ** does that..*/
2ef30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ef40 44 45 42 55 47 0a 23 20 64 65 66 69 6e 65 20 4f  DEBUG.# define O
2ef50 70 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63  pcodeRewriteTrac
2ef60 65 28 44 2c 4b 2c 50 29 20 2f 2a 20 6e 6f 2d 6f  e(D,K,P) /* no-o
2ef70 70 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66  p */.#else.# def
2ef80 69 6e 65 20 4f 70 63 6f 64 65 52 65 77 72 69 74  ine OpcodeRewrit
2ef90 65 54 72 61 63 65 28 44 2c 4b 2c 50 29 20 73 71  eTrace(D,K,P) sq
2efa0 6c 69 74 65 33 57 68 65 72 65 4f 70 63 6f 64 65  lite3WhereOpcode
2efb0 52 65 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b  RewriteTrace(D,K
2efc0 2c 50 29 0a 20 20 73 74 61 74 69 63 20 76 6f 69  ,P).  static voi
2efd0 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 70  d sqlite3WhereOp
2efe0 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65  codeRewriteTrace
2eff0 28 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  (.    sqlite3 *d
2f000 62 2c 0a 20 20 20 20 69 6e 74 20 70 63 2c 0a 20  b,.    int pc,. 
2f010 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 0a 20     VdbeOp *pOp. 
2f020 20 29 7b 0a 20 20 20 20 69 66 28 20 28 64 62 2d   ){.    if( (db-
2f030 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2f040 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 29 3d  VdbeAddopTrace)=
2f050 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
2f060 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
2f070 74 4f 70 28 30 2c 20 70 63 2c 20 70 4f 70 29 3b  tOp(0, pc, pOp);
2f080 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  .  }.#endif../*.
2f090 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
2f0a0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
2f0b0 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
2f0c0 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
2f0d0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2f0e0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
2f0f0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
2f100 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
2f110 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
2f120 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20  WInfo){.  Parse 
2f130 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
2f140 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65  ->pParse;.  Vdbe
2f150 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2f160 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2f170 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
2f180 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  el;.  WhereLoop 
2f190 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73  *pLoop;.  SrcLis
2f1a0 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
2f1b0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
2f1c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2f1d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
2f1e0 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20  * Generate loop 
2f1f0 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
2f200 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64  ..  */.  VdbeMod
2f210 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
2f220 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29  End WHERE-core")
2f230 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66  );.  for(i=pWInf
2f240 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d  o->nLevel-1; i>=
2f250 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
2f260 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65   addr;.    pLeve
2f270 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
2f280 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  ];.    pLoop = p
2f290 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
2f2a0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
2f2b0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 23 69  p!=OP_Noop ){.#i
2f2c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
2f2d0 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44  ABLE_SKIPAHEAD_D
2f2e0 49 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69 6e  ISTINCT.      in
2f2f0 74 20 61 64 64 72 53 65 65 6b 20 3d 20 30 3b 0a  t addrSeek = 0;.
2f300 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
2f310 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  x;.      int n;.
2f320 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2f330 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
2f340 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
2f350 52 45 44 0a 20 20 20 20 20 20 20 26 26 20 69 3d  RED.       && i=
2f360 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
2f370 31 20 20 2f 2a 20 54 69 63 6b 65 74 20 5b 65 66  1  /* Ticket [ef
2f380 39 33 31 38 37 35 37 62 31 35 32 65 33 5d 20 32  9318757b152e3] 2
2f390 30 31 37 2d 31 30 2d 32 31 20 2a 2f 0a 20 20 20  017-10-21 */.   
2f3a0 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
2f3b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2f3c0 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
2f3d0 20 20 26 26 20 28 70 49 64 78 20 3d 20 70 4c 6f    && (pIdx = pLo
2f3e0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2f3f0 65 78 29 2d 3e 68 61 73 53 74 61 74 31 0a 20 20  ex)->hasStat1.  
2f400 20 20 20 20 20 26 26 20 28 6e 20 3d 20 70 4c 6f       && (n = pLo
2f410 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78  op->u.btree.nIdx
2f420 43 6f 6c 29 3e 30 0a 20 20 20 20 20 20 20 26 26  Col)>0.       &&
2f430 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45   pIdx->aiRowLogE
2f440 73 74 5b 6e 5d 3e 3d 33 36 0a 20 20 20 20 20 20  st[n]>=36.      
2f450 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
2f460 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  1 = pParse->nMem
2f470 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +1;.        int 
2f480 6a 2c 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 66  j, op;.        f
2f490 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
2f4a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2f4b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f4c0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4c 65  , OP_Column, pLe
2f4d0 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6a 2c  vel->iIdxCur, j,
2f4e0 20 72 31 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20   r1+j);.        
2f4f0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  }.        pParse
2f500 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b 31 3b 0a 20  ->nMem += n+1;. 
2f510 20 20 20 20 20 20 20 6f 70 20 3d 20 70 4c 65 76         op = pLev
2f520 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 20  el->op==OP_Prev 
2f530 3f 20 4f 50 5f 53 65 65 6b 4c 54 20 3a 20 4f 50  ? OP_SeekLT : OP
2f540 5f 53 65 65 6b 47 54 3b 0a 20 20 20 20 20 20 20  _SeekGT;.       
2f550 20 61 64 64 72 53 65 65 6b 20 3d 20 73 71 6c 69   addrSeek = sqli
2f560 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
2f570 28 76 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  (v, op, pLevel->
2f580 69 49 64 78 43 75 72 2c 20 30 2c 20 72 31 2c 20  iIdxCur, 0, r1, 
2f590 6e 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  n);.        Vdbe
2f5a0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
2f5b0 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b 0a 20 20  ==OP_SeekLT);.  
2f5c0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2f5d0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
2f5e0 65 65 6b 47 54 29 3b 0a 20 20 20 20 20 20 20 20  eekGT);.        
2f5f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f600 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c  2(v, OP_Goto, 1,
2f610 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20   pLevel->p2);.  
2f620 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
2f630 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53  SQLITE_DISABLE_S
2f640 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43  KIPAHEAD_DISTINC
2f650 54 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  T */.      /* Th
2f660 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 3a 20 41  e common case: A
2f670 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
2f680 78 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  xt row */.      
2f690 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2f6a0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
2f6b0 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  l->addrCont);.  
2f6c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f6d0 64 64 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d  ddOp3(v, pLevel-
2f6e0 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  >op, pLevel->p1,
2f6f0 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65   pLevel->p2, pLe
2f700 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20  vel->p3);.      
2f710 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2f720 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
2f730 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  5);.      VdbeCo
2f740 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2f750 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2f760 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2f770 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 56  P_Next);.      V
2f780 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2f790 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2f7a0 50 72 65 76 29 3b 0a 20 20 20 20 20 20 56 64 62  Prev);.      Vdb
2f7b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2f7c0 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e  Level->op==OP_VN
2f7d0 65 78 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ext);.#ifndef SQ
2f7e0 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49  LITE_DISABLE_SKI
2f7f0 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43 54 0a  PAHEAD_DISTINCT.
2f800 20 20 20 20 20 20 69 66 28 20 61 64 64 72 53 65        if( addrSe
2f810 65 6b 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ek ) sqlite3Vdbe
2f820 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2f830 53 65 65 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Seek);.#endif.  
2f840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2f850 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2f860 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
2f870 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
2f880 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
2f890 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2f8a0 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65  E_IN_ABLE && pLe
2f8b0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20  vel->u.in.nIn>0 
2f8c0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
2f8d0 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
2f8e0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2f8f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2f900 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
2f910 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  l->addrNxt);.   
2f920 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
2f930 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26  >u.in.nIn, pIn=&
2f940 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
2f950 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20  Loop[j-1]; j>0; 
2f960 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20  j--, pIn--){.   
2f970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f980 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
2f990 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20  >addrInTop+1);. 
2f9a0 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e         if( pIn->
2f9b0 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d 4f 50 5f 4e  eEndLoopOp!=OP_N
2f9c0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oop ){.         
2f9d0 20 69 66 28 20 70 49 6e 2d 3e 6e 50 72 65 66 69   if( pIn->nPrefi
2f9e0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  x ){.           
2f9f0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
2fa00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2fa10 49 4e 5f 45 41 52 4c 59 4f 55 54 20 29 3b 0a 20  IN_EARLYOUT );. 
2fa20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2fa30 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2fa40 76 2c 20 4f 50 5f 49 66 4e 6f 48 6f 70 65 2c 20  v, OP_IfNoHope, 
2fa50 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
2fa60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2fa80 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2fa90 74 41 64 64 72 28 76 29 2b 32 2c 0a 20 20 20 20  tAddr(v)+2,.    
2faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fab0 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69            pIn->i
2fac0 42 61 73 65 2c 20 70 49 6e 2d 3e 6e 50 72 65 66  Base, pIn->nPref
2fad0 69 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ix);.           
2fae0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2faf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2fb00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2fb10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
2fb20 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
2fb30 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
2fb40 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
2fb50 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2fb60 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  (v);.          V
2fb70 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2fb80 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2fb90 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20  ==OP_Prev);.    
2fba0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2fbb0 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
2fbc0 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74  dLoopOp==OP_Next
2fbd0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2fbe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fbf0 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
2fc00 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20  >addrInTop-1);. 
2fc10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2fc20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2fc30 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
2fc40 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
2fc50 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64    if( pLevel->ad
2fc60 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  drSkip ){.      
2fc70 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
2fc80 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
2fc90 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  kip);.      Vdbe
2fca0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78  Comment((v, "nex
2fcb0 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25  t skip-scan on %
2fcc0 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  s", pLoop->u.btr
2fcd0 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
2fce0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2fcf0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2fd00 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
2fd10 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
2fd20 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2fd30 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
2fd40 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  p-2);.    }.#ifn
2fd50 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
2fd60 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
2fd70 42 53 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  BS.    if( pLeve
2fd80 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29  l->addrLikeRep )
2fd90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2fda0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2fdb0 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69  DecrJumpZero, (i
2fdc0 6e 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  nt)(pLevel->iLik
2fdd0 65 52 65 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20  eRepCntr>>1),.  
2fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fdf0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
2fe00 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20  drLikeRep);.    
2fe10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2fe20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2fe30 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2fe40 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
2fe50 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f     int ws = pLoo
2fe60 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
2fe70 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2fe80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2fe90 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
2fea0 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65  iLeftJoin); Vdbe
2feb0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2fec0 20 20 20 61 73 73 65 72 74 28 20 28 77 73 20 26     assert( (ws &
2fed0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2fee0 3d 3d 30 20 7c 7c 20 28 77 73 20 26 20 57 48 45  ==0 || (ws & WHE
2fef0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
2ff00 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  ;.      if( (ws 
2ff10 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2ff20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2ff30 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
2ff40 69 54 61 62 43 75 72 3d 3d 70 54 61 62 4c 69 73  iTabCur==pTabLis
2ff50 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2ff60 6f 6d 5d 2e 69 43 75 72 73 6f 72 20 29 3b 0a 20  om].iCursor );. 
2ff70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ff80 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
2ff90 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
2ffa0 69 54 61 62 43 75 72 29 3b 0a 20 20 20 20 20 20  iTabCur);.      
2ffb0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
2ffc0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2ffd0 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 28 77 73   .       || ((ws
2ffe0 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
2fff0 52 29 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  R) && pLevel->u.
30000 70 43 6f 76 69 64 78 29 20 0a 20 20 20 20 20 20  pCovidx) .      
30010 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30020 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
30030 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
30040 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
30050 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30060 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
30070 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
30080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30090 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
300a0 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
300b0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
300c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
300d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
300e0 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Goto(v, pLevel->
300f0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
30100 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
30110 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
30120 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
30130 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
30140 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
30150 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20  RE-loop%d: %s", 
30160 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
30170 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
30180 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
30190 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  el->iFrom].pTab-
301a0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20  >zName));.  }.. 
301b0 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
301c0 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
301d0 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
301e0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
301f0 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
30200 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
30210 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
30220 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
30230 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  k);..  assert( p
30240 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70  WInfo->nLevel<=p
30250 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
30260 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
30270 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
30280 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
30290 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
302a0 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b      int k, last;
302b0 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
302c0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
302d0 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  x = 0;.    struc
302e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
302f0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
30300 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
30310 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
30320 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
30330 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
30340 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
30350 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
30360 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20  vel->pWLoop;..  
30370 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f    /* For a co-ro
30380 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c  utine, change al
30390 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65  l OP_Column refe
303a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61  rences to the ta
303b0 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
303c0 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74  e co-routine int
303d0 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73  o OP_Copy of res
303e0 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ult contained in
303f0 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20   a register..   
30400 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63   ** OP_Rowid bec
30410 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20  omes OP_Null..  
30420 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
30430 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
30440 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
30450 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
30460 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
30470 65 64 20 29 3b 0a 20 20 20 20 20 20 74 72 61 6e  ed );.      tran
30480 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70  slateColumnToCop
30490 79 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  y(pParse, pLevel
304a0 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76  ->addrBody, pLev
304b0 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20  el->iTabCur,.   
304c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304d0 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
304e0 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29  m->regResult, 0)
304f0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
30500 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
30510 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
30520 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
30530 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74   VDBE code subst
30540 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
30550 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
30560 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74  m the index inst
30570 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20  ead of from the 
30580 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73  table where poss
30590 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63  ible.  In some c
305a0 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73  ases.    ** this
305b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72   optimization pr
305c0 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65  events the table
305d0 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67   from ever being
305e0 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e   read, which can
305f0 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20  .    ** yield a 
30600 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
30610 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
30620 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
30630 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
30640 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
30650 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
30660 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
30670 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
30680 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
30690 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
306a0 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
306b0 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
306c0 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
306d0 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
306e0 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
306f0 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
30700 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
30710 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
30720 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
30730 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
30740 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
30750 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
30760 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
30770 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
30780 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f  DEXED|WHERE_IDX_
30790 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70  ONLY) ){.      p
307a0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
307b0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
307c0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70   }else if( pLoop
307d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
307e0 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
307f0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
30800 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20  l->u.pCovidx;.  
30810 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
30820 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
30830 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
30840 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52  ASS_OFF || !HasR
30850 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
30860 65 29 29 0a 20 20 20 20 20 26 26 20 21 64 62 2d  e)).     && !db-
30870 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
30880 20 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20    ){.      last 
30890 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
308a0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
308b0 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61     k = pLevel->a
308c0 64 64 72 42 6f 64 79 3b 0a 23 69 66 64 65 66 20  ddrBody;.#ifdef 
308d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
308e0 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
308f0 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
30900 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
30910 20 20 20 20 70 72 69 6e 74 66 28 22 54 52 41 4e      printf("TRAN
30920 53 4c 41 54 45 20 6f 70 63 6f 64 65 73 20 69 6e  SLATE opcodes in
30930 20 72 61 6e 67 65 20 25 64 2e 2e 25 64 5c 6e 22   range %d..%d\n"
30940 2c 20 6b 2c 20 6c 61 73 74 2d 31 29 3b 0a 20 20  , k, last-1);.  
30950 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30960 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
30970 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b  VdbeGetOp(v, k);
30980 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c  .      for(; k<l
30990 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
309a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
309b0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
309c0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
309d0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
309e0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
309f0 6f 6c 75 6d 6e 0a 23 69 66 64 65 66 20 53 51 4c  olumn.#ifdef SQL
30a00 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
30a10 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20  T_SQL_FUNC.     
30a20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f      || pOp->opco
30a30 64 65 3d 3d 4f 50 5f 4f 66 66 73 65 74 0a 23 65  de==OP_Offset.#e
30a40 6e 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a  ndif.        ){.
30a50 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20            int x 
30a60 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
30a70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
30a80 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20  x->pTable==pTab 
30a90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30aa0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
30ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30ac0 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
30ad0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
30ae0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
30af0 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e         x = pPk->
30b00 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20  aiColumn[x];.   
30b10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
30b20 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   x>=0 );.       
30b30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78     }.          x
30b40 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
30b50 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29  OfIndex(pIdx, x)
30b60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30b70 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x>=0 ){.        
30b80 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b      pOp->p2 = x;
30b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
30ba0 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
30bb0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
30bc0 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74      OpcodeRewrit
30bd0 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f  eTrace(db, k, pO
30be0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  p);.          }.
30bf0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
30c00 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
30c10 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
30c20 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 0a  LY)==0 || x>=0 .
30c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
30c40 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
30c50 73 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  s );.        }el
30c60 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
30c70 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
30c80 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
30c90 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
30ca0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Cur;.          p
30cb0 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
30cc0 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  IdxRowid;.      
30cd0 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74      OpcodeRewrit
30ce0 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f  eTrace(db, k, pO
30cf0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
30d00 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
30d10 65 3d 3d 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  e==OP_IfNullRow 
30d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
30d30 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
30d40 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
30d50 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54    OpcodeRewriteT
30d60 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f 70 29  race(db, k, pOp)
30d70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30d80 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
30d90 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
30da0 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
30db0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
30dc0 61 63 65 20 29 20 70 72 69 6e 74 66 28 22 54 52  ace ) printf("TR
30dd0 41 4e 53 4c 41 54 45 20 63 6f 6d 70 6c 65 74 65  ANSLATE complete
30de0 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  \n");.#endif.   
30df0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
30e00 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
30e10 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
30e20 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
30e30 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
30e40 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
30e50 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
30e60 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.