/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact e954bdbd248e755ddbe0ff54b743a7b99eeb2d852d034b2176004a905c4128bc:


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 41 6e  xprSkipCollateAn
22c0: 64 4c 69 6b 65 6c 79 28 70 54 65 72 6d 2d 3e 70  dLikely(pTerm->p
22d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e  Expr->pRight))->
22e0: 6f 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  op.             
22f0: 20 20 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20    ==TK_COLUMN.  
2300: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2310: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
2320: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2330: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
2340: 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  iv; j++){.      
2350: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
2360: 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d  n->aiCur[j]==pX-
2370: 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20  >iTable.        
2380: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
2390: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58  >aiColumn[j]==pX
23a0: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
23c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23f0: 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45  if( j==pScan->nE
2400: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
2410: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43        pScan->aiC
2420: 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62  ur[j] = pX->iTab
2430: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
2440: 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d    pScan->aiColum
2450: 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75  n[j] = pX->iColu
2460: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
2470: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b    pScan->nEquiv+
2480: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
2490: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24a0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
24b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
24c0: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
24d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24e0: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
24f0: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
2500: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
2510: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
2520: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
2530: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
2540: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2550: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
2570: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
2590: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
25a0: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
25b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
25c0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
25d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25e0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
25f0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
2600: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
2610: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2620: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2630: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2640: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2650: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
2660: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
2670: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
2680: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
2690: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65           pX->pLe
26d0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
26e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26f0: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
2700: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
2710: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2720: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2730: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
2740: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61  oll->zName, pSca
2750: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b  n->zCollName) ){
2760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2770: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2780: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27a0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
27b0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
27c0: 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20  _EQ|WO_IS))!=0. 
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
27e0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
27f0: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
2800: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
2810: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
2820: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43  able==pScan->aiC
2830: 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  ur[0].          
2840: 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d     && pX->iColum
2850: 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75  n==pScan->aiColu
2860: 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  mn[0].          
2870: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2880: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
2890: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28a0: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
28b0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
28c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28d0: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
28e0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 20  ->pWC = pWC;.   
28f0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2900: 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20  k = k+1;.       
2910: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
2920: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
2930: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2940: 0a 20 20 20 20 20 20 70 57 43 20 3d 20 70 57 43  .      pWC = pWC
2950: 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20  ->pOuter;.      
2960: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
2970: 65 28 20 70 57 43 21 3d 30 20 29 3b 0a 20 20 20  e( pWC!=0 );.   
2980: 20 69 66 28 20 70 53 63 61 6e 2d 3e 69 45 71 75   if( pScan->iEqu
2990: 69 76 3e 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69  iv>=pScan->nEqui
29a0: 76 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  v ) break;.    p
29b0: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69  WC = pScan->pOri
29c0: 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a  gWC;.    k = 0;.
29d0: 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69      pScan->iEqui
29e0: 76 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  v++;.  }.  retur
29f0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2a00: 69 73 20 69 73 20 77 68 65 72 65 53 63 61 6e 49  is is whereScanI
2a10: 6e 69 74 28 29 20 66 6f 72 20 74 68 65 20 63 61  nit() for the ca
2a20: 73 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 6f  se of an index o
2a30: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n an expression.
2a40: 0a 2a 2a 20 49 74 20 69 73 20 66 61 63 74 6f 72  .** It is factor
2a50: 65 64 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65  ed out into a se
2a60: 70 61 72 61 74 65 20 74 61 69 6c 2d 72 65 63 75  parate tail-recu
2a70: 72 73 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65  rsion subroutine
2a80: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20   so that.** the 
2a90: 6e 6f 72 6d 61 6c 20 77 68 65 72 65 53 63 61 6e  normal whereScan
2aa0: 49 6e 69 74 28 29 20 72 6f 75 74 69 6e 65 2c 20  Init() routine, 
2ab0: 77 68 69 63 68 20 69 73 20 61 20 68 69 67 68 2d  which is a high-
2ac0: 72 75 6e 6e 65 72 2c 20 64 6f 65 73 20 6e 6f 74  runner, does not
2ad0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 70 75 73 68  .** need to push
2ae0: 20 72 65 67 69 73 74 65 72 73 20 6f 6e 74 6f 20   registers onto 
2af0: 74 68 65 20 73 74 61 63 6b 20 61 73 20 70 61 72  the stack as par
2b00: 74 20 6f 66 20 69 74 73 20 70 72 6f 6c 6f 67 75  t of its prologu
2b10: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
2b20: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 57 68 65  ITE_NOINLINE Whe
2b30: 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61  reTerm *whereSca
2b40: 6e 49 6e 69 74 49 6e 64 65 78 45 78 70 72 28 57  nInitIndexExpr(W
2b50: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29  hereScan *pScan)
2b60: 7b 0a 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66  {.  pScan->idxaf
2b70: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
2b80: 66 66 69 6e 69 74 79 28 70 53 63 61 6e 2d 3e 70  ffinity(pScan->p
2b90: 49 64 78 45 78 70 72 29 3b 0a 20 20 72 65 74 75  IdxExpr);.  retu
2ba0: 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74  rn whereScanNext
2bb0: 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pScan);.}../*.*
2bc0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2bd0: 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e  HERE clause scan
2be0: 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ner object.  Ret
2bf0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
2c00: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
2c10: 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  tch.  Return NUL
2c20: 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  L if there are n
2c30: 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  o matches..**.**
2c40: 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c   The scanner wil
2c50: 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20 74  l be searching t
2c60: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2c70: 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f  pWC.  It will lo
2c80: 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20  ok.** for terms 
2c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
2ca0: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
2cb0: 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  e X is column iC
2cc0: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a  olumn of table.*
2cd0: 2a 20 69 43 75 72 2e 20 20 20 4f 72 20 69 66 20  * iCur.   Or if 
2ce0: 70 49 64 78 21 3d 30 20 74 68 65 6e 20 58 20 69  pIdx!=0 then X i
2cf0: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e  s column iColumn
2d00: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 20   of index pIdx. 
2d10: 20 70 49 64 78 0a 2a 2a 20 6d 75 73 74 20 62 65   pIdx.** must be
2d20: 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
2d30: 78 65 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75  xes of table iCu
2d40: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6f 70  r..**.** The <op
2d50: 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  > must be one of
2d60: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64   the operators d
2d70: 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61  escribed by opMa
2d80: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  sk..**.** If the
2d90: 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20 58   search is for X
2da0: 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63   and the WHERE c
2db0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
2dc0: 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
2dd0: 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68 69  orm X=Y then thi
2de0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2df0: 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72 6d  also return term
2e00: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
2e10: 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "Y <op> <expr>"
2e20: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
2e30: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e 73   levels of trans
2e40: 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69 74  itivity is limit
2e50: 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e  ed,.** but is en
2e60: 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d  ough to handle m
2e70: 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63  ost commonly occ
2e80: 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65  urring SQL state
2e90: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
2ea0: 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54  X is not the INT
2eb0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2ec0: 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20   then X must be 
2ed0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a  compatible with.
2ee0: 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  ** index pIdx..*
2ef0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
2f00: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69  rm *whereScanIni
2f10: 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a  t(.  WhereScan *
2f20: 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20  pScan,       /* 
2f30: 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62  The WhereScan ob
2f40: 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69  ject being initi
2f50: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
2f60: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2f70: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2f80: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63   clause to be sc
2f90: 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anned */.  int i
2fa0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
2fb0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
2fc0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  scan for */.  in
2fd0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
2fe0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2ff0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
3000: 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20   u32 opMask,    
3010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72           /* Oper
3020: 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20  ator(s) to scan 
3030: 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  for */.  Index *
3040: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
3050: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
3060: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
3070: 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 70   index */.){.  p
3080: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20  Scan->pOrigWC = 
3090: 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57  pWC;.  pScan->pW
30a0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e  C = pWC;.  pScan
30b0: 2d 3e 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a  ->pIdxExpr = 0;.
30c0: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
30d0: 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 7a 43  = 0;.  pScan->zC
30e0: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ollName = 0;.  p
30f0: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f  Scan->opMask = o
3100: 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e  pMask;.  pScan->
3110: 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  k = 0;.  pScan->
3120: 61 69 43 75 72 5b 30 5d 20 3d 20 69 43 75 72 3b  aiCur[0] = iCur;
3130: 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  .  pScan->nEquiv
3140: 20 3d 20 31 3b 0a 20 20 70 53 63 61 6e 2d 3e 69   = 1;.  pScan->i
3150: 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 69 66 28  Equiv = 1;.  if(
3160: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74   pIdx ){.    int
3170: 20 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20   j = iColumn;.  
3180: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
3190: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
31a0: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
31b0: 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 20  XN_EXPR ){.     
31c0: 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70 72   pScan->pIdxExpr
31d0: 20 3d 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70   = pIdx->aColExp
31e0: 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20  r->a[j].pExpr;. 
31f0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c       pScan->zCol
3200: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
3210: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 70  Coll[j];.      p
3220: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  Scan->aiColumn[0
3230: 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  ] = XN_EXPR;.   
3240: 20 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53     return whereS
3250: 63 61 6e 49 6e 69 74 49 6e 64 65 78 45 78 70 72  canInitIndexExpr
3260: 28 70 53 63 61 6e 29 3b 0a 20 20 20 20 7d 65 6c  (pScan);.    }el
3270: 73 65 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d  se if( iColumn==
3280: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  pIdx->pTable->iP
3290: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 43 6f  Key ){.      iCo
32a0: 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  lumn = XN_ROWID;
32b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
32c0: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
32d0: 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66     pScan->idxaff
32e0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
32f0: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
3300: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 70  ffinity;.      p
3310: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
3320: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
3330: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
3340: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e   if( iColumn==XN
3350: 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 72 65 74  _EXPR ){.    ret
3360: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 53 63  urn 0;.  }.  pSc
3370: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
3380: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 72 65 74  = iColumn;.  ret
3390: 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78  urn whereScanNex
33a0: 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  t(pScan);.}../*.
33b0: 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  ** Search for a 
33c0: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
33d0: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
33e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
33f0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
3400: 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66  where X is a ref
3410: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43  erence to the iC
3420: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69  olumn of table i
3430: 43 75 72 20 6f 72 20 6f 66 20 69 6e 64 65 78 20  Cur or of index 
3440: 70 49 64 78 0a 2a 2a 20 69 66 20 70 49 64 78 21  pIdx.** if pIdx!
3450: 3d 30 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  =0 and <op> is o
3460: 6e 65 20 6f 66 20 74 68 65 20 57 4f 5f 78 78 20  ne of the WO_xx 
3470: 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73  operator codes s
3480: 70 65 63 69 66 69 65 64 20 62 79 0a 2a 2a 20 74  pecified by.** t
3490: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
34a0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
34b0: 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20  er to the term. 
34c0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
34d0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
34e0: 20 70 49 64 78 21 3d 30 20 74 68 65 6e 20 69 74   pIdx!=0 then it
34f0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
3500: 74 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74  the indexes of t
3510: 61 62 6c 65 20 69 43 75 72 2e 20 20 0a 2a 2a 20  able iCur.  .** 
3520: 53 65 61 72 63 68 20 66 6f 72 20 74 65 72 6d 73  Search for terms
3530: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 69 43   matching the iC
3540: 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
3550: 6f 66 20 70 49 64 78 0a 2a 2a 20 72 61 74 68 65  of pIdx.** rathe
3560: 72 20 74 68 61 6e 20 74 68 65 20 69 43 6f 6c 75  r than the iColu
3570: 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  mn-th column of 
3580: 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a  table iCur..**.*
3590: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
35a0: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
35b0: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
35c0: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
35d0: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
35e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
35f0: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
3600: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
3610: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
3620: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
3630: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
3640: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
3650: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
3660: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 69 43 75  ld.  The.** aiCu
3670: 72 5b 5d 2f 69 61 43 6f 6c 75 6d 6e 5b 5d 20 61  r[]/iaColumn[] a
3680: 72 72 61 79 73 20 68 6f 6c 64 20 58 20 61 6e 64  rrays hold X and
3690: 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c   all its equival
36a0: 65 6e 74 73 2e 20 54 68 65 72 65 20 61 72 65 20  ents. There are 
36b0: 31 31 0a 2a 2a 20 73 6c 6f 74 73 20 69 6e 20 61  11.** slots in a
36c0: 69 43 75 72 5b 5d 2f 61 69 43 6f 6c 75 6d 6e 5b  iCur[]/aiColumn[
36d0: 5d 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20  ] so that means 
36e0: 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20  we can look for 
36f0: 58 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 0a  X plus up to 10.
3700: 2a 2a 20 6f 74 68 65 72 20 65 71 75 69 76 61 6c  ** other equival
3710: 65 6e 74 20 76 61 6c 75 65 73 2e 20 20 48 65 6e  ent values.  Hen
3720: 63 65 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  ce a search for 
3730: 58 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65  X will return <e
3740: 78 70 72 3e 20 69 66 20 58 3d 41 31 0a 2a 2a 20  xpr> if X=A1.** 
3750: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
3760: 3d 41 33 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20  =A3 and ... and 
3770: 41 39 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c  A9=A10 and A10=<
3780: 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  expr>..**.** If 
3790: 74 68 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70  there are multip
37a0: 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  le terms in the 
37b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
37c0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
37d0: 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e   <expr>".** then
37e0: 20 74 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65   try for the one
37f0: 20 77 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65   with no depende
3800: 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20  ncies on <expr> 
3810: 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  - in other words
3820: 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e   where.** <expr>
3830: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
3840: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d  xpression of som
3850: 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65  e kind.  Only re
3860: 74 75 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a  turn entries of.
3870: 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  ** the form "X <
3880: 6f 70 3e 20 59 22 20 77 68 65 72 65 20 59 20 69  op> Y" where Y i
3890: 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e  s a column in an
38a0: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e  other table if n
38b0: 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68  o terms of.** th
38c0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
38d0: 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69  const-expr>" exi
38e0: 73 74 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d  st.   If no term
38f0: 73 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e  s with a constan
3900: 74 20 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20  t RHS.** exist, 
3910: 74 72 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20  try to return a 
3920: 74 65 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e  term that does n
3930: 6f 74 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e  ot use WO_EQUIV.
3940: 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a 73  .*/.WhereTerm *s
3950: 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
3960: 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75  erm(.  WhereClau
3970: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
3980: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
3990: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
39a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
39b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
39c0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c  rsor number of L
39d0: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  HS */.  int iCol
39e0: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  umn,          /*
39f0: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3a00: 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61  f LHS */.  Bitma
3a10: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
3a20: 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74   /* RHS must not
3a30: 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68   overlap with th
3a40: 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32  is mask */.  u32
3a50: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
3a60: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f     /* Mask of WO
3a70: 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72  _xx values descr
3a80: 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a  ibing operator *
3a90: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
3aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
3ab0: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
3ac0: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c  with this index,
3ad0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
3ae0: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
3af0: 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57  pResult = 0;.  W
3b00: 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57  hereTerm *p;.  W
3b10: 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a  hereScan scan;..
3b20: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49    p = whereScanI
3b30: 6e 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20  nit(&scan, pWC, 
3b40: 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f  iCur, iColumn, o
3b50: 70 2c 20 70 49 64 78 29 3b 0a 20 20 6f 70 20 26  p, pIdx);.  op &
3b60: 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 3b 0a 20  = WO_EQ|WO_IS;. 
3b70: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
3b80: 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52   if( (p->prereqR
3b90: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
3ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
3bb0: 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d   p->prereqRight=
3bc0: 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61  =0 && (p->eOpera
3bd0: 74 6f 72 26 6f 70 29 21 3d 30 20 29 7b 0a 20 20  tor&op)!=0 ){.  
3be0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
3bf0: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  p->eOperator & W
3c00: 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IS );.        
3c10: 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 20 20  return p;.      
3c20: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  }.      if( pRes
3c30: 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75 6c 74  ult==0 ) pResult
3c40: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
3c50: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  p = whereScanNex
3c60: 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20  t(&scan);.  }.  
3c70: 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a  return pResult;.
3c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3c90: 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
3ca0: 70 4c 69 73 74 20 66 6f 72 20 61 6e 20 65 6e 74  pList for an ent
3cb0: 72 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  ry that matches 
3cc0: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
3cd0: 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70  mn.** of index p
3ce0: 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
3cf0: 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ch an expression
3d00: 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69   is found, its i
3d10: 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61  ndex in pList->a
3d20: 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  [] is returned. 
3d30: 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73  If.** no express
3d40: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31  ion is found, -1
3d50: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
3d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
3d70: 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73  IndexCol(.  Pars
3d80: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3da0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
3db0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
3dc0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
3dd0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3de0: 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a  list to search *
3df0: 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20  /.  int iBase,  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
3e20: 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  r table associat
3e30: 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a  ed with pIdx */.
3e40: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61    /* Index to ma
3e70: 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f  tch column of */
3e80: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20     /* Column of 
3eb0: 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a  index to match *
3ec0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
3ed0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
3ee0: 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
3ef0: 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69  [iCol];..  for(i
3f00: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
3f10: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
3f20: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
3f30: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e  xprSkipCollateAn
3f40: 64 4c 69 6b 65 6c 79 28 70 4c 69 73 74 2d 3e 61  dLikely(pList->a
3f50: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
3f60: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
3f70: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e  LUMN.     && p->
3f80: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
3f90: 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20  iColumn[iCol].  
3fa0: 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d     && p->iTable=
3fb0: 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20  =iBase.    ){.  
3fc0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3fd0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
3fe0: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
3ff0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
4000: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
4010: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
4020: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
4030: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
4040: 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20    return i;.    
4050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
4060: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
4070: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
4080: 20 69 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   if the iCol-th 
4090: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
40a0: 70 49 64 78 20 69 73 20 4e 4f 54 20 4e 55 4c 4c  pIdx is NOT NULL
40b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
40c0: 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c  ndexColumnNotNul
40d0: 6c 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  l(Index *pIdx, i
40e0: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt iCol){.  int 
40f0: 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  j;.  assert( pId
4100: 78 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  x!=0 );.  assert
4110: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
4120: 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  l<pIdx->nColumn 
4130: 29 3b 0a 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61  );.  j = pIdx->a
4140: 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a 20  iColumn[iCol];. 
4150: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
4160: 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54   return pIdx->pT
4170: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f  able->aCol[j].no
4180: 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  tNull;.  }else i
4190: 66 28 20 6a 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( j==(-1) ){.  
41a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
41c0: 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a 20 20 20 20   j==(-2) );.    
41d0: 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 41 73  return 0;  /* As
41e0: 73 75 6d 65 20 61 6e 20 69 6e 64 65 78 65 64 20  sume an indexed 
41f0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 61  expression can a
4200: 6c 77 61 79 73 20 79 69 65 6c 64 20 61 20 4e 55  lways yield a NU
4210: 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a 0a 2f 2a  LL */..  }.}../*
4220: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
4230: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4240: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
4250: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68  passed as the th
4260: 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ird argument.** 
4270: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a  is redundant..**
4280: 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c  .** A DISTINCT l
4290: 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ist is redundant
42a0: 20 69 66 20 61 6e 79 20 73 75 62 73 65 74 20 6f   if any subset o
42b0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
42c0: 20 74 68 65 0a 2a 2a 20 44 49 53 54 49 4e 43 54   the.** DISTINCT
42d0: 20 6c 69 73 74 20 61 72 65 20 63 6f 6c 6c 65 63   list are collec
42e0: 74 69 76 65 6c 79 20 75 6e 69 71 75 65 20 61 6e  tively unique an
42f0: 64 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 6e  d individually n
4300: 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  on-null..*/.stat
4310: 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  ic int isDistinc
4320: 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61  tRedundant(.  Pa
4330: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4340: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
4350: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4360: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
4370: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t,        /* The
4380: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
4390: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
43a0: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  WC,         /* T
43b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
43c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
43d0: 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f  Distinct       /
43e0: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
43f0: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
4400: 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b  e DISTINCT */.){
4410: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
4420: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
4430: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a   .  int iBase;..
4460: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
4470: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74   more than one t
4480: 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65  able or sub-sele
4490: 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ct in the FROM c
44a0: 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68  lause of.  ** th
44b0: 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69  is query, then i
44c0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
44d0: 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74  ssible to show t
44e0: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
44f0: 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73   .  ** clause is
4500: 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
4510: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
4520: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
4530: 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61  0;.  iBase = pTa
4540: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
4550: 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54  sor;.  pTab = pT
4560: 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61  abList->a[0].pTa
4570: 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20  b;..  /* If any 
4580: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
4590: 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c  ns is an IPK col
45a0: 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61  umn on table iBa
45b0: 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  se, then return 
45c0: 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65  .  ** true. Note
45d0: 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65  : The (p->iTable
45e0: 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f 66  ==iBase) part of
45f0: 20 74 68 69 73 20 74 65 73 74 20 6d 61 79 20 62   this test may b
4600: 65 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20  e false if the. 
4610: 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45   ** current SELE
4620: 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  CT is a correlat
4630: 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  ed sub-query..  
4640: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
4650: 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72  pDistinct->nExpr
4660: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
4670: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
4680: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c  rSkipCollateAndL
4690: 69 6b 65 6c 79 28 70 44 69 73 74 69 6e 63 74 2d  ikely(pDistinct-
46a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
46b0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
46c0: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
46d0: 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d  ble==iBase && p-
46e0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
46f0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
4700: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
4710: 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
4720: 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67   table, checking
4730: 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20   each to see if 
4740: 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68  it makes.  ** th
4750: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
4760: 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20  fier redundant. 
4770: 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20  It does so if:. 
4780: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68   **.  **   1. Th
4790: 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c  e index is itsel
47a0: 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20  f UNIQUE, and.  
47b0: 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c  **.  **   2. All
47c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
47d0: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  in the index are
47e0: 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20   either part of 
47f0: 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20  the pDistinct.  
4800: 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72  **      list, or
4810: 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20   else the WHERE 
4820: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4830: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
4840: 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a  rm "col=X",.  **
4850: 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73        where X is
4860: 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75   a constant valu
4870: 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  e. The collation
4880: 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68   sequences of th
4890: 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70  e.  **      comp
48a0: 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63  arison and selec
48b0: 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f  t-list expressio
48c0: 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  ns must match th
48d0: 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ose of the index
48e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e  ..  **.  **   3.
48f0: 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e   All of those in
4900: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  dex columns for 
4910: 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20  which the WHERE 
4920: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a  clause does not.
4930: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69    **      contai
4940: 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d  n a "col=X" term
4950: 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
4960: 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  a NOT NULL const
4970: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
4980: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
4990: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
49a0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
49b0: 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
49c0: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
49d0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
49e0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; i<pIdx->nKey
49f0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
4a00: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57   if( 0==sqlite3W
4a10: 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
4a20: 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69  , iBase, i, ~(Bi
4a30: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
4a40: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
4a50: 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f   if( findIndexCo
4a60: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
4a70: 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
4a80: 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , i)<0 ) break;.
4a90: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65          if( inde
4aa0: 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70  xColumnNotNull(p
4ab0: 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65  Idx, i)==0 ) bre
4ac0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4ad0: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64  }.    if( i==pId
4ae0: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
4af0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
4b00: 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  x implies that t
4b10: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
4b20: 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61  ifier is redunda
4b30: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nt. */.      ret
4b40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
4b50: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
4b60: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
4b70: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
4b80: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
4b90: 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a  e to base 2..*/.
4ba0: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73  static LogEst es
4bb0: 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a  tLog(LogEst N){.
4bc0: 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f    return N<=10 ?
4bd0: 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45   0 : sqlite3LogE
4be0: 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f  st(N) - 33;.}../
4bf0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f  *.** Convert OP_
4c00: 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74  Column opcodes t
4c10: 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65  o OP_Copy in pre
4c20: 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
4c30: 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d code..**.** Th
4c40: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
4c50: 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56  over generated V
4c60: 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61  DBE code and tra
4c70: 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d  nslates OP_Colum
4c80: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74  n.** opcodes int
4c90: 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74  o OP_Copy when t
4ca0: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
4cb0: 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63  g accessed via c
4cc0: 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e  o-routine .** in
4cd0: 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62  stead of via tab
4ce0: 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a  le lookup..**.**
4cf0: 20 49 66 20 74 68 65 20 69 41 75 74 6f 69 64 78   If the iAutoidx
4d00: 43 75 72 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  Cur is not zero,
4d10: 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52 6f 77   then any OP_Row
4d20: 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  id instructions 
4d30: 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69 54 61  on.** cursor iTa
4d40: 62 43 75 72 20 61 72 65 20 74 72 61 6e 73 66 6f  bCur are transfo
4d50: 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 53 65 71  rmed into OP_Seq
4d60: 75 65 6e 63 65 20 6f 70 63 6f 64 65 20 66 6f 72  uence opcode for
4d70: 20 74 68 65 0a 2a 2a 20 69 41 75 74 6f 69 64 78   the.** iAutoidx
4d80: 43 75 72 20 63 75 72 73 6f 72 2c 20 69 6e 20 6f  Cur cursor, in o
4d90: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
4da0: 20 75 6e 69 71 75 65 20 72 6f 77 69 64 73 20 66   unique rowids f
4db0: 6f 72 20 74 68 65 0a 2a 2a 20 61 75 74 6f 6d 61  or the.** automa
4dc0: 74 69 63 20 69 6e 64 65 78 20 62 65 69 6e 67 20  tic index being 
4dd0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 73 74  generated..*/.st
4de0: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c  atic void transl
4df0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
4e00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4e10: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4e20: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
4e30: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
4e40: 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20     /* Translate 
4e50: 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64 65  from this opcode
4e60: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   to the end */. 
4e70: 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
4e80: 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d       /* OP_Colum
4e90: 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65 72  n/OP_Rowid refer
4ea0: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
4eb0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
4ec0: 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a 20  gister,      /* 
4ed0: 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  The first column
4ee0: 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67 69   is in this regi
4ef0: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 41  ster */.  int iA
4f00: 75 74 6f 69 64 78 43 75 72 20 20 20 20 20 2f 2a  utoidxCur     /*
4f10: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 75   If non-zero, cu
4f20: 72 73 6f 72 20 6f 66 20 61 75 74 6f 69 6e 64 65  rsor of autoinde
4f30: 78 20 62 65 69 6e 67 20 67 65 6e 65 72 61 74 65  x being generate
4f40: 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  d */.){.  Vdbe *
4f50: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4f60: 65 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  e;.  VdbeOp *pOp
4f70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4f80: 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a  tOp(v, iStart);.
4f90: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c    int iEnd = sql
4fa0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4fb0: 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 70 50  ddr(v);.  if( pP
4fc0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
4fd0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
4fe0: 0a 20 20 66 6f 72 28 3b 20 69 53 74 61 72 74 3c  .  for(; iStart<
4ff0: 69 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b 2c 20  iEnd; iStart++, 
5000: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  pOp++){.    if( 
5010: 70 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43 75 72  pOp->p1!=iTabCur
5020: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5030: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
5040: 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
5050: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
5060: 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20 20   = OP_Copy;.    
5070: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d    pOp->p1 = pOp-
5080: 3e 70 32 20 2b 20 69 52 65 67 69 73 74 65 72 3b  >p2 + iRegister;
5090: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
50a0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
50b0: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20  pOp->p3 = 0;.   
50c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
50d0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
50e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 41   ){.      if( iA
50f0: 75 74 6f 69 64 78 43 75 72 20 29 7b 0a 20 20 20  utoidxCur ){.   
5100: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
5110: 20 3d 20 4f 50 5f 53 65 71 75 65 6e 63 65 3b 0a   = OP_Sequence;.
5120: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
5130: 3d 20 69 41 75 74 6f 69 64 78 43 75 72 3b 0a 20  = iAutoidxCur;. 
5140: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5150: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
5160: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
5170: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a     pOp->p1 = 0;.
5180: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20          pOp->p3 
5190: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
51a0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
51b0: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
51c0: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
51d0: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
51e0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
51f0: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
5200: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
5210: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
5220: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
5230: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
5240: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
5250: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
5260: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
5270: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
5280: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5290: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
52a0: 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
52b0: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
52c0: 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f  ABLED).static vo
52d0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
52e0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
52f0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
5300: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
5310: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
5320: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
5330: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
5340: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
5350: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5360: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
5370: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
5380: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
5390: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
53a0: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
53b0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
53c0: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
53d0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
53e0: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
53f0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
5400: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
5410: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
5420: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
5430: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5440: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
5450: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5460: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
5470: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
5480: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
5490: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
54a0: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
54b0: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
54c0: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
54d0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
54e0: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
54f0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
5500: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
5510: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
5520: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
5530: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
5540: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
5550: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
5560: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5570: 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
5580: 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
5590: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
55a0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
55b0: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
55c0: 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
55d0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
55e0: 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
55f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
5600: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
5610: 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
5620: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
5630: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
5640: 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
5650: 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
5660: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
5670: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
5680: 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
5690: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
56a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
56b0: 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
56c0: 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
56d0: 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c  atedCost);.  sql
56e0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
56f0: 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73  "  estimatedRows
5700: 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74  =%lld\n", p->est
5710: 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23  imatedRows);.}.#
5720: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
5730: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
5740: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
5750: 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
5760: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
5770: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
5780: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
5790: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
57a0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
57b0: 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66  term pTerm is of
57c0: 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74   a form where it
57d0: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65  .** could be use
57e0: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
57f0: 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20  to access pSrc, 
5800: 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72  assuming an appr
5810: 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78  opriate.** index
5820: 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61   existed..*/.sta
5830: 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44  tic int termCanD
5840: 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65  riveIndex(.  Whe
5850: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
5860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
5870: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
5880: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73   to check */.  s
5890: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
58a0: 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  em *pSrc,     /*
58b0: 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72   Table we are tr
58c0: 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a  ying to access *
58d0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
58e0: 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20  eady            
58f0: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20     /* Tables in 
5900: 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74  outer loops of t
5910: 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20  he join */.){.  
5920: 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20  char aff;.  if( 
5930: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
5940: 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  r!=pSrc->iCursor
5950: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
5960: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
5970: 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
5980: 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72  _IS))==0 ) retur
5990: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 72 63  n 0;.  if( (pSrc
59a0: 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
59b0: 4a 54 5f 4c 45 46 54 29 20 0a 20 20 20 26 26 20  JT_LEFT) .   && 
59c0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
59d0: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
59e0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26  P_FromJoin).   &
59f0: 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
5a00: 74 6f 72 20 26 20 57 4f 5f 49 53 29 0a 20 20 29  tor & WO_IS).  )
5a10: 7b 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  {.    /* Cannot 
5a20: 75 73 65 20 61 6e 20 49 53 20 74 65 72 6d 20 66  use an IS term f
5a30: 72 6f 6d 20 74 68 65 20 57 48 45 52 45 20 63 6c  rom the WHERE cl
5a40: 61 75 73 65 20 61 73 20 61 6e 20 69 6e 64 65 78  ause as an index
5a50: 20 64 72 69 76 65 72 20 66 6f 72 0a 20 20 20 20   driver for.    
5a60: 2a 2a 20 74 68 65 20 52 48 53 20 6f 66 20 61 20  ** the RHS of a 
5a70: 4c 45 46 54 20 4a 4f 49 4e 2e 20 53 75 63 68 20  LEFT JOIN. Such 
5a80: 61 20 74 65 72 6d 20 63 61 6e 20 6f 6e 6c 79 20  a term can only 
5a90: 62 65 20 75 73 65 64 20 69 66 20 69 74 20 69 73  be used if it is
5aa0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
5ab0: 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a   ON clause.  */.
5ac0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5ad0: 7d 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  }.  if( (pTerm->
5ae0: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
5af0: 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74  tReady)!=0 ) ret
5b00: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65  urn 0;.  if( pTe
5b10: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
5b20: 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
5b30: 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
5b40: 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
5b50: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
5b60: 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
5b70: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
5b80: 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
5b90: 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
5ba0: 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   0;.  testcase( 
5bb0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  pTerm->pExpr->op
5bc0: 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 72 65 74  ==TK_IS );.  ret
5bd0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
5be0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5bf0: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
5c00: 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  INDEX./*.** Gene
5c10: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e  rate code to con
5c20: 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
5c30: 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61   object for an a
5c40: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a  utomatic index.*
5c50: 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20  * and to set up 
5c60: 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f  the WhereLevel o
5c70: 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20  bject pLevel so 
5c80: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65  that the code ge
5c90: 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73  nerator.** makes
5ca0: 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f   use of the auto
5cb0: 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a  matic index..*/.
5cc0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
5cd0: 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
5ce0: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
5cf0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
5d00: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
5d10: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
5d20: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
5d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5d40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
5d50: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5d60: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
5d70: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
5d80: 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74  se term to get t
5d90: 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f  he next index */
5da0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
5db0: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
5dc0: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
5dd0: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
5de0: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
5df0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
5e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
5e10: 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72  te new index her
5e20: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b  e */.){.  int nK
5e30: 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
5e40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5e50: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
5e60: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
5e70: 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
5e80: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
5e90: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
5ea0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
5eb0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
5ec0: 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
5ed0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  ;          /* En
5ee0: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
5ef0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f10: 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
5f20: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
5f30: 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
5f40: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
5f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
5f60: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
5f70: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5f80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  n */.  int addrI
5f90: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
5fa0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
5fb0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
5fc0: 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20  ion bypass jump 
5fd0: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
5fe0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
5ff0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
6000: 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  ing indexed */. 
6010: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6030: 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
6040: 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
6050: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
6060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6070: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
6080: 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
6090: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
60c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
60f0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
6100: 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
6110: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
6120: 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
6130: 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
6140: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
6150: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
6160: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
6170: 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
6180: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
6190: 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oop;           /
61a0: 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63  * The Loop objec
61b0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f  t */.  char *zNo
61c0: 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  tUsed;          
61d0: 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
61e0: 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  e on the end of 
61f0: 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  pIdx */.  Bitmas
6200: 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20  k idxCols;      
6210: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
6220: 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20  of columns used 
6230: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
6240: 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43    Bitmask extraC
6250: 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ols;          /*
6260: 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74   Bitmap of addit
6270: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ional columns */
6280: 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e  .  u8 sentWarnin
6290: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  g = 0;         /
62a0: 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72 6e  * True if a warn
62b0: 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73  ning has been is
62c0: 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sued */.  Expr *
62d0: 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20 20 20  pPartial = 0;   
62e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69 61 6c        /* Partial
62f0: 20 49 6e 64 65 78 20 45 78 70 72 65 73 73 69 6f   Index Expressio
6300: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  n */.  int iCont
6310: 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20 20 20  inue = 0;       
6320: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
6330: 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64 65 64  to skip excluded
6340: 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74 72 75 63   rows */.  struc
6350: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
6360: 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52  pTabItem;  /* FR
6370: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
6380: 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a  eing indexed */.
6390: 20 20 69 6e 74 20 61 64 64 72 43 6f 75 6e 74 65    int addrCounte
63a0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  r = 0;        /*
63b0: 20 41 64 64 72 65 73 73 20 77 68 65 72 65 20 69   Address where i
63c0: 6e 74 65 67 65 72 20 63 6f 75 6e 74 65 72 20 69  nteger counter i
63d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  s initialized */
63e0: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6400: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73  * Array of regis
6410: 74 65 72 73 20 77 68 65 72 65 20 72 65 63 6f 72  ters where recor
6420: 64 20 69 73 20 61 73 73 65 6d 62 6c 65 64 20 2a  d is assembled *
6430: 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  /..  /* Generate
6440: 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76   code to skip ov
6450: 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  er the creation 
6460: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  and initializati
6470: 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74  on of the.  ** t
6480: 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f  ransient index o
6490: 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  n 2nd and subseq
64a0: 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20  uent iterations 
64b0: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a  of the loop. */.
64c0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
64d0: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
64e0: 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69  !=0 );.  addrIni
64f0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
6500: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
6510: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6520: 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  v);..  /* Count 
6530: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
6540: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
6550: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
6560: 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75  index.  ** and u
6570: 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45  sed to match WHE
6580: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
6590: 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43  aints */.  nKeyC
65a0: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
65b0: 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
65c0: 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
65d0: 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
65e0: 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
65f0: 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f  >pWLoop;.  idxCo
6600: 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
6610: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
6620: 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
6630: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
6640: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
6650: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
6660: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
6670: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
6680: 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65  oin)    /* prere
6690: 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72  q always non-zer
66a0: 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c  o */.         ||
66b0: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
66c0: 69 6e 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  inTable!=pSrc->i
66d0: 43 75 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f  Cursor   /*   fo
66e0: 72 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  r the right-hand
66f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c     */.         |
6700: 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21  | pLoop->prereq!
6710: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
6720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74            /*   t
6730: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
6740: 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  OIN */.    if( p
6750: 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a  Loop->prereq==0.
6760: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
6770: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
6780: 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20  IRTUAL)==0.     
6790: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
67a0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
67b0: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20  omJoin).     && 
67c0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
67d0: 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  leConstant(pExpr
67e0: 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
67f0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69   ){.      pParti
6800: 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
6810: 41 6e 64 28 70 50 61 72 73 65 2c 20 70 50 61 72  And(pParse, pPar
6820: 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tial,.          
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6850: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
6860: 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 20   pExpr, 0));.   
6870: 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43   }.    if( termC
6880: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
6890: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
68a0: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
68b0: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
68c0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
68d0: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
68e0: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
68f0: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
6900: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
6910: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
6920: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
6930: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
6940: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
6950: 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e   if( !sentWarnin
6960: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
6970: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
6980: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
6990: 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  X,.            "
69a0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
69b0: 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62  on %s(%s)", pTab
69c0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
69d0: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61         pTable->a
69e0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
69f0: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61  ;.        sentWa
6a00: 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  rning = 1;.     
6a10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64   }.      if( (id
6a20: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
6a30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
6a40: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
6a50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
6a60: 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29  op, nKeyCol+1) )
6a70: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
6a80: 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f   end_auto_index_
6a90: 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20 20 20  create;.        
6aa0: 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  }.        pLoop-
6ab0: 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b  >aLTerm[nKeyCol+
6ac0: 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
6ad0: 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
6ae0: 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mask;.      }.  
6af0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6b00: 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20  ( nKeyCol>0 );. 
6b10: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
6b20: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  nEq = pLoop->nLT
6b30: 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20  erm = nKeyCol;. 
6b40: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
6b50: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
6b60: 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  Q | WHERE_IDX_ON
6b70: 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58  LY | WHERE_INDEX
6b80: 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED.             
6b90: 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f          | WHERE_
6ba0: 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f  AUTO_INDEX;..  /
6bb0: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
6bc0: 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  er of additional
6bd0: 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
6be0: 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a  to create a.  **
6bf0: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
6c00: 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e    A "covering in
6c10: 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78  dex" is an index
6c20: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
6c30: 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  ll.  ** columns 
6c40: 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20  that are needed 
6c50: 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57  by the query.  W
6c60: 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69  ith a covering i
6c70: 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f  ndex, the.  ** o
6c80: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65  riginal table ne
6c90: 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
6ca0: 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d  accessed.  Autom
6cb0: 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73  atic indices mus
6cc0: 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65  t.  ** be a cove
6cd0: 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75  ring index becau
6ce0: 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  se the index wil
6cf0: 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
6d00: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69   if the.  ** ori
6d10: 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e  ginal table chan
6d20: 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ges and the inde
6d30: 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e  x and table cann
6d40: 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a  ot both be used.
6d50: 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20    ** if they go 
6d60: 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a  out of sync..  *
6d70: 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20  /.  extraCols = 
6d80: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
6d90: 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b  (~idxCols | MASK
6da0: 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d  BIT(BMS-1));.  m
6db0: 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d  xBitCol = MIN(BM
6dc0: 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  S-1,pTable->nCol
6dd0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
6de0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
6df0: 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  -1 );.  testcase
6e00: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
6e10: 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69  BMS-2 );.  for(i
6e20: 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
6e30: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
6e40: 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
6e50: 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b  T(i) ) nKeyCol++
6e60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
6e70: 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
6e80: 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
6e90: 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61    nKeyCol += pTa
6ea0: 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20  ble->nCol - BMS 
6eb0: 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  + 1;.  }..  /* C
6ec0: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
6ed0: 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73  ex object to des
6ee0: 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78  cribe this index
6ef0: 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c   */.  pIdx = sql
6f00: 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
6f10: 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d 3e  xObject(pParse->
6f20: 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30  db, nKeyCol+1, 0
6f30: 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20  , &zNotUsed);.  
6f40: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 67 6f  if( pIdx==0 ) go
6f50: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
6f60: 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f  x_create;.  pLoo
6f70: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
6f80: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
6f90: 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
6fa0: 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
6fb0: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
6fc0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
6fd0: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
6fe0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
6ff0: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
7000: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
7010: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
7020: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
7030: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
7040: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
7050: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
7060: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
7070: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
7080: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
7090: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
70a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
70b0: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
70c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
70d0: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
70e0: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
70f0: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
7100: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
7110: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
7120: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
7130: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
7140: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
7150: 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
7160: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
7170: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
7180: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
7190: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
71a0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
71b0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
71c0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
71d0: 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e   pColl ? pColl->
71e0: 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65 33 53  zName : sqlite3S
71f0: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
7200: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
7210: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
7220: 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70  t( (u32)n==pLoop
7230: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
7240: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74  ..  /* Add addit
7250: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
7260: 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  eded to make the
7270: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
7280: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76   into.  ** a cov
7290: 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
72a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
72b0: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
72c0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
72d0: 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20  MASKBIT(i) ){.  
72e0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
72f0: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
7300: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
7310: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
7320: 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  ARY;.      n++;.
7330: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
7340: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
7350: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
7360: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
7370: 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
7380: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
7390: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
73a0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
73b0: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71  ->azColl[n] = sq
73c0: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
73d0: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
73e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
73f0: 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70  ==nKeyCol );.  p
7400: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
7410: 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 70   = XN_ROWID;.  p
7420: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
7430: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
7440: 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  Y;..  /* Create 
7450: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
7460: 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  dex */.  assert(
7470: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
7480: 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d  >=0 );.  pLevel-
7490: 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73  >iIdxCur = pPars
74a0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
74b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
74c0: 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  , OP_OpenAutoind
74d0: 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ex, pLevel->iIdx
74e0: 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b  Cur, nKeyCol+1);
74f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
7500: 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
7510: 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62 65  e, pIdx);.  Vdbe
7520: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72  Comment((v, "for
7530: 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e   %s", pTable->zN
7540: 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ame));..  /* Fil
7550: 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  l the automatic 
7560: 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65  index with conte
7570: 6e 74 20 2a 2f 0a 20 20 70 54 61 62 49 74 65 6d  nt */.  pTabItem
7580: 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66 6f 2d   = &pWC->pWInfo-
7590: 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
75a0: 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
75b0: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
75c0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
75d0: 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
75e0: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67   = pTabItem->reg
75f0: 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64 64 72  Return;.    addr
7600: 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  Counter = sqlite
7610: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7620: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
7630: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7640: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7650: 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
7660: 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74  Yield, 0, pTabIt
7670: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
7680: 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20  ;.    addrTop = 
7690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
76a0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
76b0: 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56  regYield);.    V
76c0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
76d0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
76e0: 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
76f0: 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e   %s", pTabItem->
7700: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
7710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
7720: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
7730: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
7740: 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  wind, pLevel->iT
7750: 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65  abCur); VdbeCove
7760: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
7770: 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20  f( pPartial ){. 
7780: 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73     iContinue = s
7790: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
77a0: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
77b0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
77c0: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61 72  lse(pParse, pPar
77d0: 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  tial, iContinue,
77e0: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
77f0: 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  LL);.    pLoop->
7800: 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
7810: 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d  _PARTIALIDX;.  }
7820: 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
7830: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7840: 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 42  (pParse);.  regB
7850: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 6e  ase = sqlite3Gen
7860: 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a 20  erateIndexKey(. 
7870: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 49 64       pParse, pId
7880: 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  x, pLevel->iTabC
7890: 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30  ur, regRecord, 0
78a0: 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20  , 0, 0, 0.  );. 
78b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
78c0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
78d0: 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt, pLevel->iIdx
78e0: 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Cur, regRecord);
78f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
7900: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7910: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
7920: 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20  .  if( pPartial 
7930: 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  ) sqlite3VdbeRes
7940: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
7950: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
7960: 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  TabItem->fg.viaC
7970: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
7980: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7990: 65 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e 74  eP2(v, addrCount
79a0: 65 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b 0a  er, regBase+n);.
79b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
79c0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
79d0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73  Failed );.    as
79e0: 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49  sert( pLevel->iI
79f0: 64 78 43 75 72 3e 30 20 29 3b 0a 20 20 20 20 74  dxCur>0 );.    t
7a00: 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
7a10: 43 6f 70 79 28 70 50 61 72 73 65 2c 20 61 64 64  Copy(pParse, add
7a20: 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  rTop, pLevel->iT
7a30: 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
7a60: 73 75 6c 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sult, pLevel->iI
7a70: 64 78 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69  dxCur);.    sqli
7a80: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
7a90: 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 70 54 61  ddrTop);.    pTa
7aa0: 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
7ab0: 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65  outine = 0;.  }e
7ac0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7ad0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7ae0: 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  _Next, pLevel->i
7af0: 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b  TabCur, addrTop+
7b00: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
7b10: 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
7b20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7b30: 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
7b40: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a  TUS_AUTOINDEX);.
7b50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
7b60: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
7b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
7b80: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
7b90: 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
7ba0: 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65   .  /* Jump here
7bb0: 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74   when skipping t
7bc0: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
7bd0: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
7be0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
7bf0: 64 72 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75  drInit);..end_au
7c00: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3a  to_index_create:
7c10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
7c20: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7c30: 20 70 50 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65   pPartial);.}.#e
7c40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7c50: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
7c60: 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  DEX */..#ifndef 
7c70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7c80: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41  UALTABLE./*.** A
7c90: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75  llocate and popu
7ca0: 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  late an sqlite3_
7cb0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
7cc0: 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20  ture. It is the 
7cd0: 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
7ce0: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
7cf0: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
7d00: 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63  elease the struc
7d10: 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69  ture.** by passi
7d20: 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72  ng the pointer r
7d30: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
7d40: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69  function to sqli
7d50: 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
7d60: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
7d70: 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61  dex_info *alloca
7d80: 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50  teIndexInfo(.  P
7d90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7db0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
7dc0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
7dd0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
7de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7df0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 62  e WHERE clause b
7e00: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
7e10: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73  .  Bitmask mUnus
7e20: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
7e30: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72     /* Ignore ter
7e40: 6d 73 20 77 69 74 68 20 74 68 65 73 65 20 70 72  ms with these pr
7e50: 65 72 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63  ereqs */.  struc
7e60: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
7e70: 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 54 68  pSrc,      /* Th
7e80: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
7e90: 72 6d 20 74 68 61 74 20 69 73 20 74 68 65 20 76  rm that is the v
7ea0: 74 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  tab */.  ExprLis
7eb0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
7ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7ed0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
7ee0: 2a 2f 0a 20 20 75 31 36 20 2a 70 6d 4e 6f 4f 6d  */.  u16 *pmNoOm
7ef0: 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
7f00: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
7f10: 74 65 72 6d 73 20 6e 6f 74 20 74 6f 20 6f 6d 69  terms not to omi
7f20: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  t */.){.  int i,
7f30: 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
7f40: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
7f50: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
7f60: 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
7f70: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7f80: 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
7f90: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
7fa0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7fb0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7fc0: 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 73 74  ge *pUsage;.  st
7fd0: 72 75 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78  ruct HiddenIndex
7fe0: 49 6e 66 6f 20 2a 70 48 69 64 64 65 6e 3b 0a 20  Info *pHidden;. 
7ff0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
8000: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
8010: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
8020: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
8030: 6f 3b 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74  o;.  u16 mNoOmit
8040: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e   = 0;..  /* Coun
8050: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
8060: 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63  possible WHERE c
8070: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
8080: 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a  s referring.  **
8090: 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c   to this virtual
80a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
80b0: 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d  i=nTerm=0, pTerm
80c0: 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
80d0: 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
80e0: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
80f0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
8100: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
8110: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8120: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
8130: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
8140: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
8150: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
8160: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
8170: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
8180: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
8190: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
81a0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
81b0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
81c0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
81d0: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
81e0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
81f0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8200: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
8210: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
8220: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8230: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
8240: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8250: 20 26 20 7e 28 57 4f 5f 45 51 55 49 56 29 29 3d   & ~(WO_EQUIV))=
8260: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
8270: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
8280: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
8290: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
82a0: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
82b0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
82c0: 28 2d 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72  (-1) );.    nTer
82d0: 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  m++;.  }..  /* I
82e0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
82f0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
8300: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
8310: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a  he current .  **
8320: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
8330: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
8340: 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
8350: 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a  rBy part of.  **
8360: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
8370: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
8380: 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72  e..  */.  nOrder
8390: 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f  By = 0;.  if( pO
83a0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
83b0: 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  t n = pOrderBy->
83c0: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
83d0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
83e0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
83f0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8400: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
8410: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
8420: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
8430: 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
8440: 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
8450: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
8460: 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 46 6c  rBy->a[i].sortFl
8470: 61 67 73 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52  ags & KEYINFO_OR
8480: 44 45 52 5f 42 49 47 4e 55 4c 4c 20 29 20 62 72  DER_BIGNULL ) br
8490: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
84a0: 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20  f( i==n){.      
84b0: 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20  nOrderBy = n;.  
84c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
84d0: 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
84e0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
84f0: 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70  ructure.  */.  p
8500: 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  IdxInfo = sqlite
8510: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
8520: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
8530: 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20  (*pIdxInfo).    
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66         + (sizeof
8560: 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69  (*pIdxCons) + si
8570: 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e  zeof(*pUsage))*n
8580: 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20  Term.           
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72  + sizeof(*pIdxOr
85b0: 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20  derBy)*nOrderBy 
85c0: 2b 20 73 69 7a 65 6f 66 28 2a 70 48 69 64 64 65  + sizeof(*pHidde
85d0: 6e 29 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  n) );.  if( pIdx
85e0: 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
85f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8600: 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
8610: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74  emory");.    ret
8620: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
8630: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
8640: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
8650: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
8660: 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  fo structure con
8670: 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20  tains.  ** many 
8680: 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20  fields that are 
8690: 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22  declared "const"
86a0: 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73   to prevent xBes
86b0: 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a  tIndex from.  **
86c0: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20   changing them. 
86d0: 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73   We have to do s
86e0: 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e  ome funky castin
86f0: 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  g in order to.  
8700: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** initialize th
8710: 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f  ose fields..  */
8720: 0a 20 20 70 48 69 64 64 65 6e 20 3d 20 28 73 74  .  pHidden = (st
8730: 72 75 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78  ruct HiddenIndex
8740: 49 6e 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f 5b  Info*)&pIdxInfo[
8750: 31 5d 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d  1];.  pIdxCons =
8760: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
8770: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
8780: 74 2a 29 26 70 48 69 64 64 65 6e 5b 31 5d 3b 0a  t*)&pHidden[1];.
8790: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
87a0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
87b0: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
87c0: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
87d0: 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72  .  pUsage = (str
87e0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
87f0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
8800: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
8810: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28  [nOrderBy];.  *(
8820: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
8830: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
8840: 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  erm;.  *(int*)&p
8850: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
8860: 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  y = nOrderBy;.  
8870: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
8880: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
8890: 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
88a0: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
88b0: 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63  xCons;.  *(struc
88c0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
88d0: 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49  orderby**)&pIdxI
88e0: 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20  nfo->aOrderBy = 
88f0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a  pIdxOrderBy;.  *
8900: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
8910: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
8920: 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e  _usage**)&pIdxIn
8930: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
8940: 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65            pUsage
8990: 3b 0a 0a 20 20 70 48 69 64 64 65 6e 2d 3e 70 57  ;..  pHidden->pW
89a0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 48 69 64 64  C = pWC;.  pHidd
89b0: 65 6e 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  en->pParse = pPa
89c0: 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  rse;.  for(i=j=0
89d0: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
89e0: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
89f0: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
8a00: 20 75 31 36 20 6f 70 3b 0a 20 20 20 20 69 66 28   u16 op;.    if(
8a10: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
8a20: 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
8a30: 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
8a40: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
8a50: 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e  rereqRight & mUn
8a60: 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75  usable ) continu
8a70: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
8a80: 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
8a90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
8aa0: 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
8ab0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
8ac0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8ad0: 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
8ae0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
8af0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
8b00: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8b10: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8b20: 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
8b30: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
8b40: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8b50: 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66  WO_ALL );.    if
8b60: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
8b70: 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55 49 56  tor & ~(WO_EQUIV
8b80: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
8b90: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
8ba0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8bb0: 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
8bc0: 3b 0a 20 20 20 20 69 66 28 20 28 70 53 72 63 2d  ;.    if( (pSrc-
8bd0: 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
8be0: 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20  T_LEFT)!=0.     
8bf0: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
8c00: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
8c10: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
8c20: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
8c30: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
8c40: 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 0a 20 20  S|WO_ISNULL)).  
8c50: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e    ){.      /* An
8c60: 20 22 49 53 22 20 74 65 72 6d 20 69 6e 20 74 68   "IS" term in th
8c70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
8c80: 68 65 72 65 20 74 68 65 20 76 69 72 74 75 61 6c  here the virtual
8c90: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 68   table is the rh
8ca0: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20  s.      ** of a 
8cb0: 4c 45 46 54 20 4a 4f 49 4e 2e 20 44 6f 20 6e 6f  LEFT JOIN. Do no
8cc0: 74 20 70 61 73 73 20 74 68 69 73 20 74 65 72 6d  t pass this term
8cd0: 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
8ce0: 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69  table.      ** i
8cf0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61  mplementation, a
8d00: 73 20 74 68 69 73 20 63 61 6e 20 6c 65 61 64 20  s this can lead 
8d10: 74 6f 20 69 6e 63 6f 72 72 65 63 74 20 72 65 73  to incorrect res
8d20: 75 6c 74 73 20 66 72 6f 6d 20 53 51 4c 20 73 75  ults from SQL su
8d30: 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 73 3a 0a  ch.      ** as:.
8d40: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
8d50: 2a 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 76  *   "LEFT JOIN v
8d60: 74 61 62 20 57 48 45 52 45 20 76 74 61 62 2e 63  tab WHERE vtab.c
8d70: 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 20 2a 2f 0a  ol IS NULL"  */.
8d80: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8d90: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8da0: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
8db0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8dc0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8dd0: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
8de0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8df0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  }.    assert( pT
8e00: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
8e10: 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 70  n>=(-1) );.    p
8e20: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75  IdxCons[j].iColu
8e30: 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  mn = pTerm->u.le
8e40: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  ftColumn;.    pI
8e50: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f  dxCons[j].iTermO
8e60: 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f  ffset = i;.    o
8e70: 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  p = pTerm->eOper
8e80: 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20  ator & WO_ALL;. 
8e90: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e     if( op==WO_IN
8ea0: 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20   ) op = WO_EQ;. 
8eb0: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 41 55     if( op==WO_AU
8ec0: 58 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 43  X ){.      pIdxC
8ed0: 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72  ons[j].op = pTer
8ee0: 6d 2d 3e 65 4d 61 74 63 68 4f 70 3b 0a 20 20 20  m->eMatchOp;.   
8ef0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 20 26 20   }else if( op & 
8f00: 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  (WO_ISNULL|WO_IS
8f10: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  ) ){.      if( o
8f20: 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==WO_ISNULL ){.
8f30: 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
8f40: 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c 49 54 45 5f  [j].op = SQLITE_
8f50: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
8f60: 5f 49 53 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  _ISNULL;.      }
8f70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
8f80: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53  dxCons[j].op = S
8f90: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8fa0: 54 52 41 49 4e 54 5f 49 53 3b 0a 20 20 20 20 20  TRAINT_IS;.     
8fb0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8fc0: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
8fd0: 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20  op = (u8)op;.   
8fe0: 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
8ff0: 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74   assignment in t
9000: 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65  he previous line
9010: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c   is possible onl
9020: 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  y because.      
9030: 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
9040: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
9050: 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
9060: 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
9070: 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  e.      ** follo
9080: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
9090: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
90a0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
90b0: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
90c0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
90d0: 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Q );.      asser
90e0: 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
90f0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
9100: 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73  T_LT );.      as
9110: 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
9120: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
9130: 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20  AINT_LE );.     
9140: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d   assert( WO_GT==
9150: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
9160: 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20  STRAINT_GT );.  
9170: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
9180: 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
9190: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b  CONSTRAINT_GE );
91a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
91b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
91c0: 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
91d0: 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
91e0: 4f 5f 47 45 7c 57 4f 5f 41 55 58 29 20 29 3b 0a  O_GE|WO_AUX) );.
91f0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 26 20  .      if( op & 
9200: 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  (WO_LT|WO_LE|WO_
9210: 47 54 7c 57 4f 5f 47 45 29 0a 20 20 20 20 20 20  GT|WO_GE).      
9220: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
9230: 73 56 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e 70  sVector(pTerm->p
9240: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20 0a 20  Expr->pRight) . 
9250: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
9260: 69 66 28 20 69 3c 31 36 20 29 20 6d 4e 6f 4f 6d  if( i<16 ) mNoOm
9270: 69 74 20 7c 3d 20 28 31 20 3c 3c 20 69 29 3b 0a  it |= (1 << i);.
9280: 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d          if( op==
9290: 57 4f 5f 4c 54 20 29 20 70 49 64 78 43 6f 6e 73  WO_LT ) pIdxCons
92a0: 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 4c 45 3b 0a  [j].op = WO_LE;.
92b0: 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d          if( op==
92c0: 57 4f 5f 47 54 20 29 20 70 49 64 78 43 6f 6e 73  WO_GT ) pIdxCons
92d0: 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 47 45 3b 0a  [j].op = WO_GE;.
92e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
92f0: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f     j++;.  }.  fo
9300: 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
9310: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  y; i++){.    Exp
9320: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
9330: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
9340: 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
9350: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
9360: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
9370: 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
9380: 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
9390: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 46 6c 61 67 73  ->a[i].sortFlags
93a0: 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52   & KEYINFO_ORDER
93b0: 5f 44 45 53 43 3b 0a 20 20 7d 0a 0a 20 20 2a 70  _DESC;.  }..  *p
93c0: 6d 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69  mNoOmit = mNoOmi
93d0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  t;.  return pIdx
93e0: 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Info;.}../*.** T
93f0: 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  he table object 
9400: 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64  reference passed
9410: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
9420: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
9430: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
9440: 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72   represent a vir
9450: 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73  tual table. This
9460: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
9470: 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  s the xBestIndex
9480: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
9490: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
94a0: 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74  e with the sqlit
94b0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62  e3_index_info ob
94c0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d  ject that.** com
94d0: 65 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64  es in as the 3rd
94e0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
94f0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
9500: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
9510: 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20  curs, pParse is 
9520: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
9530: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
9540: 61 6e 64 20 61 6e 0a 2a 2a 20 61 70 70 72 6f 70  and an.** approp
9550: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
9560: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
9570: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
9580: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 66 72 6f  E_CONSTRAINT fro
9590: 6d 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20  m.** xBestIndex 
95a0: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
95b0: 64 20 61 6e 20 65 72 72 6f 72 2e 20 20 53 51 4c  d an error.  SQL
95c0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 69  ITE_CONSTRAINT i
95d0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a  ndicates that.**
95e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
95f0: 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 20 22 75  figuration of "u
9600: 6e 75 73 61 62 6c 65 22 20 66 6c 61 67 73 20 69  nusable" flags i
9610: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
9620: 69 6e 66 6f 20 63 61 6e 0a 2a 2a 20 6e 6f 74 20  info can.** not 
9630: 72 65 73 75 6c 74 20 69 6e 20 61 20 76 61 6c 69  result in a vali
9640: 64 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  d plan..**.** Wh
9650: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
9660: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
9670: 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
9680: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
9690: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
96a0: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
96b0: 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
96c0: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
96d0: 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
96e0: 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
96f0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
9700: 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
9710: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9720: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
9730: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
9740: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
9750: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
9760: 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
9770: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
9780: 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  >pVtab;.  int rc
9790: 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  ;..  TRACE_IDX_I
97a0: 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
97b0: 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
97c0: 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
97d0: 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
97e0: 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
97f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9800: 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
9810: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
9820: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
9830: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
9840: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
9850: 74 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  t(pParse->db);. 
9860: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56     }else if( !pV
9870: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
9880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9890: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
98a0: 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
98b0: 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  r(rc));.    }els
98c0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
98d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
98e0: 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45   "%s", pVtab->zE
98f0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
9900: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
9910: 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
9920: 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
9930: 73 67 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  sg = 0;.  return
9940: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
9950: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9960: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
9970: 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  LE) */..#ifdef S
9980: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
9990: 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
99a0: 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  e the location o
99b0: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b  f a particular k
99c0: 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79  ey among all key
99d0: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  s in an.** index
99e0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
99f0: 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73  ults in aStat as
9a00: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
9a10: 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20     aStat[0]     
9a20: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
9a30: 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70  rows less than p
9a40: 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  Rec.**    aStat[
9a50: 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  1]      Est. num
9a60: 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61  ber of rows equa
9a70: 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20  l to pRec.**.** 
9a80: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
9a90: 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74   of the sample t
9aa0: 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  hat is the small
9ab0: 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a  est sample that.
9ac0: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
9ad0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
9ae0: 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  Rec. Note that t
9af0: 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  his index is not
9b00: 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74   an index.** int
9b10: 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  o the aSample[] 
9b20: 61 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e  array - it is an
9b30: 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69   index into a vi
9b40: 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d  rtual set of sam
9b50: 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ples.** based on
9b60: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
9b70: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74   aSample[] and t
9b80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
9b90: 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a  lds in record .*
9ba0: 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74  * pRec. .*/.stat
9bb0: 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53  ic int whereKeyS
9bc0: 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  tats(.  Parse *p
9bd0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
9be0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9bf0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
9c00: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9c20: 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72  ndex to consider
9c30: 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20   domain of */.  
9c40: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
9c50: 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56  pRec,       /* V
9c60: 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20  ector of values 
9c70: 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20  to consider */. 
9c80: 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20   int roundUp,   
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ca0: 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65  Round up if true
9cb0: 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66  .  Round down if
9cc0: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77   false */.  tRow
9cd0: 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20  cnt *aStat      
9ce0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
9cf0: 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65  stats written he
9d00: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
9d10: 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20  Sample *aSample 
9d20: 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
9d30: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d50: 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69  * Index of requi
9d60: 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45  red stats in anE
9d70: 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  q[] etc. */.  in
9d80: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
9d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9da0: 65 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70  ex of first samp
9db0: 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20  le >= pRec */.  
9dc0: 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20  int iSample;    
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9de0: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c  mallest sample l
9df0: 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71  arger than or eq
9e00: 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
9e10: 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20   int iMin = 0;  
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9e30: 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
9e40: 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a  not yet tested *
9e50: 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20  /.  int iTest;  
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74  /* Next sample t
9e80: 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
9e90: 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
9ea0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
9eb0: 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
9ec0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
9ed0: 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
9ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9ef0: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
9f00: 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77  n pRec */.  tRow
9f10: 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20  cnt iLower = 0; 
9f20: 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b          /* anLt[
9f30: 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61  ] + anEq[] of la
9f40: 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65  rgest sample pRe
9f50: 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64  c is > */..#ifnd
9f60: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9f70: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9f80: 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65  ER( pParse );.#e
9f90: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
9fa0: 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Rec!=0 );.  asse
9fb0: 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
9fc0: 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
9fd0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20   pRec->nField>0 
9fe0: 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c  && pRec->nField<
9ff0: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f  =pIdx->nSampleCo
a000: 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20  l );..  /* Do a 
a010: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f  binary search to
a020: 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
a030: 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74  sample greater t
a040: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a  han or equal.  *
a050: 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52  * to pRec. If pR
a060: 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ec contains a si
a070: 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20  ngle field, the 
a080: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74  set of samples t
a090: 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73  o search.  ** is
a0a0: 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d   simply the aSam
a0b0: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  ple[] array. If 
a0c0: 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61  the samples in a
a0d0: 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e  Sample[] contain
a0e0: 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20   more.  ** than 
a0f0: 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20  one fields, all 
a100: 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  fields following
a110: 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69   the first are i
a120: 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  gnored..  **.  *
a130: 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69  * If pRec contai
a140: 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65  ns N fields, whe
a150: 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61  re N is more tha
a160: 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77  n one, then as w
a170: 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ell as the.  ** 
a180: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
a190: 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20  le[] (truncated 
a1a0: 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68  to N fields), th
a1b0: 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61  e search also ha
a1c0: 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64  s to.  ** consid
a1d0: 65 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74  er prefixes of t
a1e0: 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f  hose samples. Fo
a1f0: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
a200: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
a210: 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65  .  ** in aSample
a220: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
a230: 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20     aSample[0] = 
a240: 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (a, 5) .  **    
a250: 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61   aSample[1] = (a
a260: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
a270: 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c  aSample[2] = (b,
a280: 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53   5) .  **     aS
a290: 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31  ample[3] = (c, 1
a2a0: 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53  00) .  **     aS
a2b0: 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31  ample[4] = (c, 1
a2c0: 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  05).  **.  ** Th
a2d0: 65 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70  en the search sp
a2e0: 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c  ace should ideal
a2f0: 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65  ly be the sample
a300: 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20  s above and the 
a310: 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65  .  ** unique pre
a320: 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61  fixes [a], [b] a
a330: 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63  nd [c]. But sinc
a340: 65 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74  e that is hard t
a350: 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a  o organize, .  *
a360: 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61  * the code actua
a370: 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69  lly searches thi
a380: 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s set:.  **.  **
a390: 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a       0: (a) .  *
a3a0: 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20  *     1: (a, 5) 
a3b0: 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c  .  **     2: (a,
a3c0: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33   10) .  **     3
a3d0: 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  : (a, 10) .  ** 
a3e0: 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a      4: (b) .  **
a3f0: 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a       5: (b, 5) .
a400: 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20    **     6: (c) 
a410: 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c  .  **     7: (c,
a420: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
a430: 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a  8: (c, 105).  **
a440: 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29       9: (c, 105)
a450: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65  .  **.  ** For e
a460: 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ach sample in th
a470: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
a480: 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65  y, N samples are
a490: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a   present in the.
a4a0: 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73    ** effective s
a4b0: 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20  ample array. In 
a4c0: 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c  the above, sampl
a4d0: 65 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62  es 0 and 1 are b
a4e0: 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61  ased on .  ** sa
a4f0: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  mple aSample[0].
a500: 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33   Samples 2 and 3
a510: 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65   on aSample[1] e
a520: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66  tc..  **.  ** Of
a530: 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66  ten, sample i of
a540: 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e   each block of N
a550: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
a560: 65 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65  es has (i+1) fie
a570: 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74  lds..  ** Except
a580: 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61  , each sample ma
a590: 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f  y be extended to
a5a0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20   ensure that it 
a5b0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
a5c0: 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  or.  ** equal to
a5d0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61   the previous sa
a5e0: 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61  mple in the arra
a5f0: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
a600: 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20  in the above, . 
a610: 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20   ** sample 2 is 
a620: 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
a630: 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e   of a block of N
a640: 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20   samples, so at 
a650: 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61  first it .  ** a
a660: 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73  ppears that it s
a670: 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64  hould be 1 field
a680: 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65   in size. Howeve
a690: 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61  r, that would ma
a6a0: 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c  ke it .  ** smal
a6b0: 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ler than sample 
a6c0: 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79  1, so the binary
a6d0: 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f   search would no
a6e0: 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73  t work. As a res
a6f0: 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73  ult, .  ** it is
a700: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f   extended to two
a710: 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70   fields. The dup
a720: 6c 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69  licates that thi
a730: 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74  s creates do not
a740: 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79   .  ** cause any
a750: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
a760: 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d    nField = pRec-
a770: 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20  >nField;.  iCol 
a780: 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d  = 0;.  iSample =
a790: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a   pIdx->nSample *
a7a0: 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20   nField;.  do{. 
a7b0: 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20     int iSamp;   
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61   /* Index in aSa
a7e0: 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73  mple[] of test s
a7f0: 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  ample */.    int
a800: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
a810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a820: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
a830: 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f  n test sample */
a840: 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69  ..    iTest = (i
a850: 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a  Min+iSample)/2;.
a860: 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73      iSamp = iTes
a870: 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  t / nField;.    
a880: 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20  if( iSamp>0 ){. 
a890: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70       /* The prop
a8a0: 6f 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73  osed effective s
a8b0: 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69  ample is a prefi
a8c0: 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d  x of sample aSam
a8d0: 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20  ple[iSamp]..    
a8e0: 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c    ** Specificall
a8f0: 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20  y, the shortest 
a900: 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61  prefix of at lea
a910: 73 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46  st (1 + iTest%nF
a920: 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20  ield) .      ** 
a930: 66 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67  fields that is g
a940: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
a950: 70 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69  previous effecti
a960: 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20  ve sample.  */. 
a970: 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73       for(n=(iTes
a980: 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b  t % nField) + 1;
a990: 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b   n<nField; n++){
a9a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
a9b0: 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e  mple[iSamp-1].an
a9c0: 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65  Lt[n-1]!=aSample
a9d0: 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31  [iSamp].anLt[n-1
a9e0: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
a9f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
aa00: 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20      n = iTest + 
aa10: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52  1;.    }..    pR
aa20: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a  ec->nField = n;.
aa30: 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
aa40: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
aa50: 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  re(aSample[iSamp
aa60: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61  ].n, aSample[iSa
aa70: 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20  mp].p, pRec);.  
aa80: 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
aa90: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
aaa0: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
aab0: 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65  t[n-1] + aSample
aac0: 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31  [iSamp].anEq[n-1
aad0: 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  ];.      iMin = 
aae0: 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  iTest+1;.    }el
aaf0: 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26  se if( res==0 &&
ab00: 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20   n<nField ){.   
ab10: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
ab20: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
ab30: 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e  n-1];.      iMin
ab40: 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
ab50: 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20    res = -1;.    
ab60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61  }else{.      iSa
ab70: 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20  mple = iTest;.  
ab80: 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a      iCol = n-1;.
ab90: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
aba0: 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d  res && iMin<iSam
abb0: 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61  ple );.  i = iSa
abc0: 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a  mple / nField;..
abd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
abe0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  BUG.  /* The fol
abf0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
ac00: 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74  atements check t
ac10: 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73  hat the binary s
ac20: 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20  earch code.  ** 
ac30: 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20  above found the 
ac40: 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68  right answer. Th
ac50: 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
ac60: 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72  no purpose other
ac70: 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e  .  ** than to in
ac80: 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73  voke the asserts
ac90: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
aca0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
acb0: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  iled==0 ){.    i
acc0: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
acd0: 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30     /* If (res==0
ace0: 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ) is true, then 
acf0: 70 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75  pRec must be equ
ad00: 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20  al to sample i. 
ad10: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ad20: 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
ad30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ad40: 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31  ( iCol==nField-1
ad50: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
ad60: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
ad70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
ad80: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ==sqlite3VdbeRec
ad90: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
ada0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
adb0: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20  [i].p, pRec) .  
adc0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
add0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
ade0: 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20  iled .      );. 
adf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ae00: 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64  /* Unless i==pId
ae10: 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69  x->nSample, indi
ae20: 63 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63  cating that pRec
ae30: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
ae40: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d        ** all sam
ae50: 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d  ples in the aSam
ae60: 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65  ple[] array, pRe
ae70: 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65  c must be smalle
ae80: 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20  r than the.     
ae90: 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65   ** (iCol+1) fie
aea0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d  ld prefix of sam
aeb0: 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20  ple i.  */.     
aec0: 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78   assert( i<=pIdx
aed0: 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d  ->nSample && i>=
aee0: 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  0 );.      pRec-
aef0: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31  >nField = iCol+1
af00: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
af10: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
af20: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
af30: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
af40: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
af50: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
af60: 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20  ].p, pRec)>0.   
af70: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
af80: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
af90: 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  led );..      /*
afa0: 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f   if i==0 and iCo
afb0: 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72  l==0, then recor
afc0: 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65  d pRec is smalle
afd0: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
afe0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  es.      ** in t
aff0: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
b000: 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ay. Otherwise, i
b010: 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20  f (iCol>0) then 
b020: 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20  pRec must.      
b030: 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ** be greater th
b040: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
b050: 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20  he (iCol) field 
b060: 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65  prefix of sample
b070: 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   i..      ** If 
b080: 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63  (i>0), then pRec
b090: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72   must also be gr
b0a0: 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  eater than sampl
b0b0: 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20  e (i-1).  */.   
b0c0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
b0d0: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
b0e0: 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20  Field = iCol;.  
b0f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
b100: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
b110: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
b120: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
b130: 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20  p, pRec)<=0.    
b140: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
b150: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
b160: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a  iled );.      }.
b170: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
b180: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
b190: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
b1a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b1b0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
b1c0: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
b1d0: 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  [i-1].n, aSample
b1e0: 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30  [i-1].p, pRec)<0
b1f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
b200: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
b210: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
b220: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
b230: 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
b240: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
b250: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
b260: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52      /* Record pR
b270: 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73  ec is equal to s
b280: 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61  ample i */.    a
b290: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69  ssert( iCol==nFi
b2a0: 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74  eld-1 );.    aSt
b2b0: 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
b2c0: 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
b2d0: 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53     aStat[1] = aS
b2e0: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43  ample[i].anEq[iC
b2f0: 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol];.  }else{.  
b300: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
b310: 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29  nt, the (iCol+1)
b320: 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
b330: 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
b340: 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a  he first .    **
b350: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
b360: 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65  greater than pRe
b370: 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64  c. Or, if i==pId
b380: 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20  x->nSample then 
b390: 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c  pRec.    ** is l
b3a0: 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  arger than all s
b3b0: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72  amples in the ar
b3c0: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77  ray. */.    tRow
b3d0: 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70  cnt iUpper, iGap
b3e0: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64  ;.    if( i>=pId
b3f0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  x->nSample ){.  
b400: 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c      iUpper = sql
b410: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
b420: 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
b430: 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t[0]);.    }else
b440: 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
b450: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
b460: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20  [iCol];.    }.. 
b470: 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69     if( iLower>=i
b480: 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
b490: 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Gap = 0;.    }el
b4a0: 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
b4b0: 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72   iUpper - iLower
b4c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b4d0: 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
b4e0: 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29   iGap = (iGap*2)
b4f0: 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /3;.    }else{. 
b500: 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70       iGap = iGap
b510: 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  /3;.    }.    aS
b520: 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20  tat[0] = iLower 
b530: 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61  + iGap;.    aSta
b540: 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76  t[1] = pIdx->aAv
b550: 67 45 71 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20  gEq[nField-1];. 
b560: 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65   }..  /* Restore
b570: 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c   the pRec->nFiel
b580: 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  d value before r
b590: 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20  eturning.  */.  
b5a0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
b5b0: 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20  Field;.  return 
b5c0: 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  i;.}.#endif /* S
b5d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
b5e0: 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  T4 */../*.** If 
b5f0: 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  it is not NULL, 
b600: 70 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20  pTerm is a term 
b610: 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e  that provides an
b620: 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a   upper or lower.
b630: 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61  ** bound on a ra
b640: 6e 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75  nge scan. Withou
b650: 74 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54  t considering pT
b660: 65 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d  erm, it is estim
b670: 61 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68  ated .** that th
b680: 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69  e scan will visi
b690: 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69  t nNew rows. Thi
b6a0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
b6b0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  ns the number.**
b6c0: 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65   estimated to be
b6d0: 20 76 69 73 69 74 65 64 20 61 66 74 65 72 20 74   visited after t
b6e0: 61 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f  aking pTerm into
b6f0: 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20   account..**.** 
b700: 49 66 20 74 68 65 20 75 73 65 72 20 65 78 70 6c  If the user expl
b710: 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
b720: 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20   a likelihood() 
b730: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74  value for this t
b740: 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  erm,.** then the
b750: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
b760: 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20   the likelihood 
b770: 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68  multiplied by th
b780: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69  e number of.** i
b790: 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72  nput rows. Other
b7a0: 77 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74  wise, this funct
b7b0: 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
b7c0: 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c   an "IS NOT NULL
b7d0: 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20  " term.** has a 
b7e0: 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e  likelihood of 0.
b7f0: 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  50, and any othe
b800: 72 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68  r term a likelih
b810: 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a  ood of 0.25..*/.
b820: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68  static LogEst wh
b830: 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57  ereRangeAdjust(W
b840: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
b850: 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20   LogEst nNew){. 
b860: 20 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e   LogEst nRet = n
b870: 4e 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  New;.  if( pTerm
b880: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72   ){.    if( pTer
b890: 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
b8a0: 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d  ){.      nRet +=
b8b0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
b8c0: 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  b;.    }else if(
b8d0: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
b8e0: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
b8f0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20  0 ){.      nRet 
b900: 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73  -= 20;        as
b910: 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65  sert( 20==sqlite
b920: 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20  3LogEst(4) );.  
b930: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
b940: 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65   nRet;.}...#ifde
b950: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b960: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75  STAT4./*.** Retu
b970: 72 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  rn the affinity 
b980: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  for a single col
b990: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e  umn of an index.
b9a0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
b9b0: 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e  IndexColumnAffin
b9c0: 69 74 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ity(sqlite3 *db,
b9d0: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
b9e0: 74 20 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65 72  t iCol){.  asser
b9f0: 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  t( iCol>=0 && iC
ba00: 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ol<pIdx->nColumn
ba10: 20 29 3b 0a 20 20 69 66 28 20 21 70 49 64 78 2d   );.  if( !pIdx-
ba20: 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20  >zColAff ){.    
ba30: 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
ba40: 41 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 20  AffinityStr(db, 
ba50: 70 49 64 78 29 3d 3d 30 20 29 20 72 65 74 75 72  pIdx)==0 ) retur
ba60: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
ba70: 42 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  B;.  }.  assert(
ba80: 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69   pIdx->zColAff[i
ba90: 43 6f 6c 5d 21 3d 30 20 29 3b 0a 20 20 72 65 74  Col]!=0 );.  ret
baa0: 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66  urn pIdx->zColAf
bab0: 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69  f[iCol];.}.#endi
bac0: 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f...#ifdef SQLIT
bad0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f  E_ENABLE_STAT4./
bae0: 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
baf0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
bb00: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
bb10: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73  mber of rows vis
bb20: 69 74 65 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e  ited by a.** ran
bb30: 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69  ge-scan on a ski
bb40: 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f  p-scan index. Fo
bb50: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
bb60: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
bb70: 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63  i1 ON t1(a, b, c
bb80: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  );.**   SELECT *
bb90: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
bba0: 3d 3f 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e  =? AND c BETWEEN
bbb0: 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20   ? AND ?;.**.** 
bbc0: 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Value pLoop->nOu
bbd0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  t is currently s
bbe0: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
bbf0: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ted number of ro
bc00: 77 73 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 66  ws .** visited f
bc10: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f  or scanning (a=?
bc20: 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73 20   AND b=?). This 
bc30: 66 75 6e 63 74 69 6f 6e 20 72 65 64 75 63 65 73  function reduces
bc40: 20 74 68 61 74 20 65 73 74 69 6d 61 74 65 20 0a   that estimate .
bc50: 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61 63 74 6f  ** by some facto
bc60: 72 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  r to account for
bc70: 20 74 68 65 20 28 63 20 42 45 54 57 45 45 4e 20   the (c BETWEEN 
bc80: 3f 20 41 4e 44 20 3f 29 20 65 78 70 72 65 73 73  ? AND ?) express
bc90: 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20  ion based.** on 
bca0: 74 68 65 20 73 74 61 74 34 20 64 61 74 61 20 66  the stat4 data f
bcb0: 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 20 74 68  or the index. th
bcc0: 69 73 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20  is scan will be 
bcd0: 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c  peformed multipl
bce0: 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63  e .** times (onc
bcf0: 65 20 66 6f 72 20 65 61 63 68 20 28 61 2c 62 29  e for each (a,b)
bd00: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61   combination tha
bd10: 74 20 6d 61 74 63 68 65 73 20 61 3d 3f 29 20 69  t matches a=?) i
bd20: 73 20 64 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a  s dealt with .**
bd30: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
bd40: 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74 68  **.** It does th
bd50: 69 73 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74  is by scanning t
bd60: 68 72 6f 75 67 68 20 61 6c 6c 20 73 74 61 74 34  hrough all stat4
bd70: 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72   samples, compar
bd80: 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78  ing values.** ex
bd90: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
bda0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 77  wer and pUpper w
bdb0: 69 74 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ith the correspo
bdc0: 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  nding column in 
bdd0: 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20  each.** sample. 
bde0: 49 66 20 4c 20 61 6e 64 20 55 20 61 72 65 20 74  If L and U are t
bdf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  he number of sam
be00: 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20 62 65  ples found to be
be10: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a   less than or.**
be20: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76 61   equal to the va
be30: 6c 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66  lues extracted f
be40: 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70  rom pLower and p
be50: 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
be60: 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20  ly, and.** N is 
be70: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
be80: 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74 68 65   of samples, the
be90: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c   pLoop->nOut val
bea0: 75 65 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ue is adjusted.*
beb0: 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  * as follows:.**
bec0: 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75  .**   nOut = nOu
bed0: 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c  t * ( min(U - L,
bee0: 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20   1) / N ).**.** 
bef0: 49 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c  If pLower is NUL
bf00: 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61  L, or a value ca
bf10: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
bf20: 64 20 66 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c  d from the term,
bf30: 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20   L is.** set to 
bf40: 7a 65 72 6f 2e 20 49 66 20 70 55 70 70 65 72 20  zero. If pUpper 
bf50: 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61  is NULL, or a va
bf60: 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78  lue cannot be ex
bf70: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c  tracted from it,
bf80: 0a 2a 2a 20 55 20 69 73 20 73 65 74 20 74 6f 20  .** U is set to 
bf90: 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  N..**.** Normall
bfa0: 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
bfb0: 20 73 65 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f   sets *pbDone to
bfc0: 20 31 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e   1 before return
bfd0: 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a  ing. However,.**
bfe0: 20 69 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e   if no value can
bff0: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
c000: 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f 77 65 72  om either pLower
c010: 20 6f 72 20 70 55 70 70 65 72 20 28 61 6e 64 20   or pUpper (and 
c020: 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61  so the.** estima
c030: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
c040: 20 6f 66 20 72 6f 77 73 20 64 65 6c 69 76 65 72   of rows deliver
c050: 65 64 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61  ed remains uncha
c060: 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a  nged), *pbDone.*
c070: 2a 20 69 73 20 6c 65 66 74 20 61 73 20 69 73 2e  * is left as is.
c080: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
c090: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
c0a0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
c0b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
c0c0: 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49  erwise, .** SQLI
c0d0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
c0e0: 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53   int whereRangeS
c0f0: 6b 69 70 53 63 61 6e 45 73 74 28 0a 20 20 50 61  kipScanEst(.  Pa
c100: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c110: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
c120: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
c130: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
c140: 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
c150: 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
c160: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
c170: 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
c180: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
c190: 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
c1a0: 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
c1b0: 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
c1c0: 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
c1d0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
c1e0: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c  hereLoop *pLoop,
c1f0: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
c200: 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66  e .nOut value of
c210: 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
c220: 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20 20 20  int *pbDone     
c230: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
c240: 72 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 20  rue if at least 
c250: 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c 75 65 20  one expr. value 
c260: 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a  extracted */.){.
c270: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f    Index *p = pLo
c280: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
c290: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
c2a0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
c2b0: 45 71 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Eq;.  sqlite3 *d
c2c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c2d0: 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d    int nLower = -
c2e0: 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65 72 20  1;.  int nUpper 
c2f0: 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a  = p->nSample+1;.
c300: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c310: 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66 66 20 3d  E_OK;.  u8 aff =
c320: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c   sqlite3IndexCol
c330: 75 6d 6e 41 66 66 69 6e 69 74 79 28 64 62 2c 20  umnAffinity(db, 
c340: 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c 53  p, nEq);.  CollS
c350: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20  eq *pColl;.  .  
c360: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
c370: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
c380: 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
c390: 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a  ed from pLower *
c3a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
c3b0: 65 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20  e *p2 = 0;      
c3c0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
c3d0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70  racted from pUpp
c3e0: 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
c3f0: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
c400: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
c410: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c420: 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f  record */..  pCo
c430: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
c440: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
c450: 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d  , p->azColl[nEq]
c460: 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20  );.  if( pLower 
c470: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
c480: 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f  te3Stat4ValueFro
c490: 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c  mExpr(pParse, pL
c4a0: 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
c4b0: 67 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a  ght, aff, &p1);.
c4c0: 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a      nLower = 0;.
c4d0: 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72    }.  if( pUpper
c4e0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
c4f0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
c500: 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46  lite3Stat4ValueF
c510: 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
c520: 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
c530: 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29  Right, aff, &p2)
c540: 3b 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70  ;.    nUpper = p
c550: 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70  2 ? 0 : p->nSamp
c560: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  le;.  }..  if( p
c570: 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69  1 || p2 ){.    i
c580: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44  nt i;.    int nD
c590: 69 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  iff;.    for(i=0
c5a0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
c5b0: 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b  && i<p->nSample;
c5c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
c5d0: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f  = sqlite3Stat4Co
c5e0: 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d  lumn(db, p->aSam
c5f0: 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61  ple[i].p, p->aSa
c600: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20  mple[i].n, nEq, 
c610: 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  &pVal);.      if
c620: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c630: 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20  && p1 ){.       
c640: 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74   int res = sqlit
c650: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c  e3MemCompare(p1,
c660: 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20   pVal, pColl);. 
c670: 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d         if( res>=
c680: 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20  0 ) nLower++;.  
c690: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c6a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
c6b0: 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69   p2 ){.        i
c6c0: 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  nt res = sqlite3
c6d0: 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70  MemCompare(p2, p
c6e0: 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Val, pColl);.   
c6f0: 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20       if( res>=0 
c700: 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20  ) nUpper++;.    
c710: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44    }.    }.    nD
c720: 69 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20  iff = (nUpper - 
c730: 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28  nLower);.    if(
c740: 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66   nDiff<=0 ) nDif
c750: 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49  f = 1;..    /* I
c760: 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
c770: 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  an upper and low
c780: 65 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69  er bound specifi
c790: 65 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20  ed, and the .   
c7a0: 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20   ** comparisons 
c7b0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
c7c0: 65 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67  ey are close tog
c7d0: 65 74 68 65 72 2c 20 75 73 65 20 74 68 65 20 66  ether, use the f
c7e0: 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d  allback.    ** m
c7f0: 65 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68  ethod (assume th
c800: 61 74 20 74 68 65 20 73 63 61 6e 20 76 69 73 69  at the scan visi
c810: 74 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72  ts 1/64 of the r
c820: 6f 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74  ows) for estimat
c830: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e  ing.    ** the n
c840: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69  umber of rows vi
c850: 73 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65  sited. Otherwise
c860: 2c 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  , estimate the n
c870: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
c880: 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d    ** using the m
c890: 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
c8a0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  in the header co
c8b0: 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66  mment for this f
c8c0: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  unction. */.    
c8d0: 69 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20  if( nDiff!=1 || 
c8e0: 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f  pUpper==0 || pLo
c8f0: 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  wer==0 ){.      
c900: 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73  int nAdjust = (s
c910: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e  qlite3LogEst(p->
c920: 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74  nSample) - sqlit
c930: 65 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29  e3LogEst(nDiff))
c940: 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  ;.      pLoop->n
c950: 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a  Out -= nAdjust;.
c960: 20 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20        *pbDone = 
c970: 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  1;.      WHERETR
c980: 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67  ACE(0x10, ("rang
c990: 65 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69  e skip-scan regi
c9a0: 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a  ons: %u..%u  adj
c9b0: 75 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22  ust=%d est=%d\n"
c9c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f               nLo
c9e0: 77 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64  wer, nUpper, nAd
c9f0: 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e  just*-1, pLoop->
ca00: 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  nOut));.    }.. 
ca10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
ca20: 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29  rt( *pbDone==0 )
ca30: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
ca40: 56 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20  ValueFree(p1);. 
ca50: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
ca60: 65 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  e(p2);.  sqlite3
ca70: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
ca80: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
ca90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
caa0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 2a  E_ENABLE_STAT4 *
cab0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
cac0: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
cad0: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
cae0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
caf0: 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74  at will be visit
cb00: 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e  ed.** by scannin
cb10: 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61  g an index for a
cb20: 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73   range of values
cb30: 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20  . The range may 
cb40: 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a  have an upper.**
cb50: 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20   bound, a lower 
cb60: 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20  bound, or both. 
cb70: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
cb80: 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20   terms that set 
cb90: 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64  the upper.** and
cba0: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72   lower bounds ar
cbb0: 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79  e represented by
cbc0: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
cbd0: 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  er respectively.
cbe0: 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
cbf0: 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69   assuming that 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 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  a):.**.**   ... 
cc20: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
cc30: 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
cc40: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
cc50: 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20          |_____| 
cc60: 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20    |_____|.**    
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a     |         |.*
cc90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
cca0: 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20        pLower    
ccb0: 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  pUpper.**.** If 
ccc0: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70  either of the up
ccd0: 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75  per or lower bou
cce0: 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nd is not presen
ccf0: 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20  t, then NULL is 
cd00: 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61  passed in.** pla
cd10: 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  ce of the corres
cd20: 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72  ponding WhereTer
cd30: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  m..**.** The val
cd40: 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d  ue in (pBuilder-
cd50: 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
cd60: 45 71 29 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Eq) is the numbe
cd70: 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a  r of the index.*
cd80: 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74  * column subject
cd90: 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f   to the range co
cda0: 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71  nstraint. Or, eq
cdb0: 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20  uivalently, the 
cdc0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75  number of.** equ
cdd0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
cde0: 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74  s optimized by t
cdf0: 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65  he proposed inde
ce00: 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d  x scan. For exam
ce10: 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67  ple,.** assuming
ce20: 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
ce30: 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65  1(a, b), and the
ce40: 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a   SQL query is:.*
ce50: 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
ce60: 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  t1 WHERE a = ? A
ce70: 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c  ND b > ? AND b <
ce80: 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
ce90: 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
cea0: 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20  1 (as the range 
ceb0: 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d  restricted colum
cec0: 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65 63  n, b, is the sec
ced0: 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73  ond .** left-mos
cee0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
cef0: 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74  index). Or, if t
cf00: 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
cf10: 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
cf20: 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
cf30: 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   a < ? ....**.**
cf40: 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74   then nEq is set
cf50: 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   to 0..**.** Whe
cf60: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
cf70: 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75  is called, *pnOu
cf80: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
cf90: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20  sqlite3LogEst() 
cfa0: 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
cfb0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74 68   of rows that th
cfc0: 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20  e index scan is 
cfd0: 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73 69  expected to visi
cfe0: 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f  t without .** co
cff0: 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 72 61  nsidering the ra
d000: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  nge constraints.
d010: 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68   If nEq is 0, th
d020: 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74 68 65  en *pnOut is the
d030: 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72   number of .** r
d040: 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
d050: 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  . Assuming no er
d060: 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f  ror occurs, *pnO
d070: 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20 28  ut is adjusted (
d080: 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61  reduced).** to a
d090: 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72  ccount for the r
d0a0: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
d0b0: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
d0c0: 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68  er..** .** In th
d0d0: 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
d0e0: 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a  ite_stat4 ANALYZ
d0f0: 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75  E data, or if su
d100: 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62  ch data cannot b
d110: 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73 69 6e  e.** used, a sin
d120: 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71 75 61  gle range inequa
d130: 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65  lity reduces the
d140: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
d150: 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20   a factor of 4. 
d160: 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72 20 6f  .** and a pair o
d170: 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78  f constraints (x
d180: 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75  >? AND x<?) redu
d190: 63 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64  ces the expected
d1a0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f   number of.** ro
d1b0: 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20  ws visited by a 
d1c0: 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f  factor of 64..*/
d1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
d1e0: 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
d1f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d200: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d210: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
d220: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
d230: 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
d240: 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68   *pBuilder,.  Wh
d250: 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
d260: 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
d270: 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
d280: 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
d290: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
d2a0: 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
d2b0: 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
d2c0: 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
d2d0: 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
d2e0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
d2f0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
d300: 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74       /* Modify t
d310: 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79  he .nOut and may
d320: 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20  be .rRun fields 
d330: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
d340: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
d350: 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e  t nOut = pLoop->
d360: 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e  nOut;.  LogEst n
d370: 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  New;..#ifdef SQL
d380: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
d390: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c  .  Index *p = pL
d3a0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
d3b0: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
d3c0: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
d3d0: 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  nEq;..  if( p->n
d3e0: 53 61 6d 70 6c 65 3e 30 20 26 26 20 41 4c 57 41  Sample>0 && ALWA
d3f0: 59 53 28 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c  YS(nEq<p->nSampl
d400: 65 43 6f 6c 29 0a 20 20 20 26 26 20 4f 70 74 69  eCol).   && Opti
d410: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
d420: 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
d430: 54 45 5f 53 74 61 74 34 29 0a 20 20 29 7b 0a 20  TE_Stat4).  ){. 
d440: 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69     if( nEq==pBui
d450: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
d460: 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65  ){.      Unpacke
d470: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
d480: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
d490: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b        tRowcnt a[
d4a0: 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42  2];.      int nB
d4b0: 74 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  tm = pLoop->u.bt
d4c0: 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 20 20 20 20  ree.nBtm;.      
d4d0: 69 6e 74 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70  int nTop = pLoop
d4e0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a  ->u.btree.nTop;.
d4f0: 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62  .      /* Variab
d500: 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62  le iLower will b
d510: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
d520: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
d530: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
d540: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64        ** the ind
d550: 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73  ex that are less
d560: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
d570: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
d580: 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20  ge query. The.  
d590: 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75      ** lower bou
d5a0: 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e  nd being the con
d5b0: 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50  catenation of $P
d5c0: 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24   and $L, where $
d5d0: 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  P is the.      *
d5e0: 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72  * key-prefix for
d5f0: 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76  med by the nEq v
d600: 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67  alues matched ag
d610: 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65  ainst the nEq le
d620: 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ft-most.      **
d630: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
d640: 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
d650: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
d660: 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ower..      **. 
d670: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70       ** Or, if p
d680: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72  Lower is NULL or
d690: 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78   $L cannot be ex
d6a0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20  tracted from it 
d6b0: 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20  (because it.    
d6c0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
d6d0: 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
d6e0: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
d6f0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
d700: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
d710: 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75   range is $P. Du
d720: 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20  e to a quirk in 
d730: 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79  the way whereKey
d740: 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65  Stats() works, e
d750: 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  ven.      ** if 
d760: 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $L is available,
d770: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
d780: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62   is called for b
d790: 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20  oth ($P) and .  
d7a0: 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61      ** ($P:$L) a
d7b0: 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  nd the larger of
d7c0: 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65   the two returne
d7d0: 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64  d values is used
d7e0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
d7f0: 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
d800: 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73  Upper is to be s
d810: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
d820: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
d830: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a   of rows.      *
d840: 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
d850: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  upper bound of t
d860: 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
d870: 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20  Where the upper 
d880: 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69  bound.      ** i
d890: 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72  s either ($P) or
d8a0: 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c   ($P:$U). Again,
d8b0: 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61   even if $U is a
d8c0: 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76  vailable, both v
d8d0: 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  alues.      ** o
d8e0: 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71  f iUpper are req
d8f0: 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b  uested of whereK
d900: 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68  eyStats() and th
d910: 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a  e smaller used..
d920: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
d930: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
d940: 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65  rows between the
d950: 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74   two bounds is t
d960: 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d  hen just iUpper-
d970: 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f  iLower..      */
d980: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
d990: 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Lower;     /* Ro
d9a0: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
d9b0: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
d9c0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55        tRowcnt iU
d9d0: 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  pper;     /* Row
d9e0: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
d9f0: 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  upper bound */. 
da00: 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78       int iLwrIdx
da10: 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d   = -2;   /* aSam
da20: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f  ple[] for the lo
da30: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
da40: 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d     int iUprIdx =
da50: 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -1;   /* aSampl
da60: 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65  e[] for the uppe
da70: 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20  r bound */..    
da80: 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20    if( pRec ){.  
da90: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
daa0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42  pRec->nField!=pB
dab0: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
dac0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  d );.        pRe
dad0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69  c->nField = pBui
dae0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
daf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
db00: 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77  * Determine iLow
db10: 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73  er and iUpper us
db20: 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a  ing ($P) only. *
db30: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d  /.      if( nEq=
db40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  =0 ){.        iL
db50: 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
db60: 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52    iUpper = p->nR
db70: 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d 65  owEst0;.      }e
db80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
db90: 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20  Note: this call 
dba0: 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a  could be optimiz
dbb0: 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20  ed away - since 
dbc0: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20  the same values 
dbd0: 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  must .        **
dbe0: 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
dbf0: 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e  sted when testin
dc00: 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72  g key $P in wher
dc10: 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e  eEqualScanEst().
dc20: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65    */.        whe
dc30: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
dc40: 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
dc50: 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65  );.        iLowe
dc60: 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
dc70: 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20    iUpper = a[0] 
dc80: 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  + a[1];.      }.
dc90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
dca0: 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f  Lower==0 || (pLo
dcb0: 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
dcc0: 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21   (WO_GT|WO_GE))!
dcd0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
dce0: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
dcf0: 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61   (pUpper->eOpera
dd00: 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  tor & (WO_LT|WO_
dd10: 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  LE))!=0 );.     
dd20: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f 72   assert( p->aSor
dd30: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
dd40: 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f     if( p->aSortO
dd50: 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20  rder[nEq] ){.   
dd60: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65       /* The role
dd70: 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64 20  s of pLower and 
dd80: 70 55 70 70 65 72 20 61 72 65 20 73 77 61 70 70  pUpper are swapp
dd90: 65 64 20 66 6f 72 20 61 20 44 45 53 43 20 69 6e  ed for a DESC in
dda0: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  dex */.        S
ddb0: 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c 20  WAP(WhereTerm*, 
ddc0: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29 3b  pLower, pUpper);
ddd0: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e  .        SWAP(in
dde0: 74 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a  t, nBtm, nTop);.
ddf0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
de00: 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  * If possible, i
de10: 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c  mprove on the iL
de20: 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20 75 73  ower estimate us
de30: 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a  ing ($P:$L). */.
de40: 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72        if( pLower
de50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
de60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
de70: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20        /* Values 
de80: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
de90: 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  Expr */.        
dea0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
deb0: 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
dec0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
ded0: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
dee0: 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
def0: 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
df00: 78 70 72 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c 20  xpr, nBtm, nEq, 
df10: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  &n);.        if(
df20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
df30: 26 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  & n ){.         
df40: 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
df50: 20 20 20 20 20 20 20 20 20 75 31 36 20 6d 61 73           u16 mas
df60: 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b  k = WO_GT|WO_LE;
df70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
df80: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
df90: 53 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20  Size(pExpr)>n ) 
dfa0: 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f  mask = (WO_LE|WO
dfb0: 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _LT);.          
dfc0: 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iLwrIdx = whereK
dfd0: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
dfe0: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
dff0: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
e000: 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72   a[0] + ((pLower
e010: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61  ->eOperator & ma
e020: 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b  sk) ? a[1] : 0);
e030: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
e040: 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f  New>iLower ) iLo
e050: 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  wer = iNew;.    
e060: 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
e070: 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d          pLower =
e080: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
e090: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
e0a0: 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
e0b0: 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70  rove on the iUpp
e0c0: 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
e0d0: 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20  g ($P:$U). */.  
e0e0: 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29      if( pUpper )
e0f0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  {.        int n;
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78      /* Values ex
e120: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
e130: 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
e140: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70  pr *pExpr = pUpp
e150: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
e160: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
e170: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
e180: 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
e190: 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
e1a0: 72 2c 20 6e 54 6f 70 2c 20 6e 45 71 2c 20 26 6e  r, nTop, nEq, &n
e1b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
e1c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e1d0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  n ){.          t
e1e0: 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
e1f0: 20 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20         u16 mask 
e200: 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_GT|WO_LE;. 
e210: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
e220: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
e230: 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61  ze(pExpr)>n ) ma
e240: 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c  sk = (WO_LE|WO_L
e250: 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 55  T);.          iU
e260: 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79  prIdx = whereKey
e270: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
e280: 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20   pRec, 1, a);.  
e290: 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61          iNew = a
e2a0: 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e  [0] + ((pUpper->
e2b0: 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b  eOperator & mask
e2c0: 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
e2d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
e2e0: 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65  w<iUpper ) iUppe
e2f0: 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
e300: 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
e310: 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30        pUpper = 0
e320: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e330: 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c    }..      pBuil
e340: 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
e350: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
e360: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e370: 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
e380: 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
e390: 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74      nNew = sqlit
e3a0: 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20  e3LogEst(iUpper 
e3b0: 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20  - iLower);.     
e3c0: 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
e3d0: 20 49 66 20 62 6f 74 68 20 69 55 70 70 65 72 20   If both iUpper 
e3e0: 61 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64  and iLower are d
e3f0: 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20  erived from the 
e400: 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
e410: 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61  * sample, then a
e420: 73 73 75 6d 65 20 74 68 65 79 20 61 72 65 20 34  ssume they are 4
e430: 78 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65  x more selective
e440: 2e 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20  .  This brings. 
e450: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
e460: 65 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74  estimated select
e470: 69 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69  ivity more in li
e480: 6e 65 20 77 69 74 68 20 77 68 61 74 20 69 74 20  ne with what it 
e490: 77 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20  would be.       
e4a0: 20 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74     ** if estimat
e4b0: 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 75  ed without the u
e4c0: 73 65 20 6f 66 20 53 54 41 54 34 20 74 61 62 6c  se of STAT4 tabl
e4d0: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
e4e0: 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55   if( iLwrIdx==iU
e4f0: 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20  prIdx ) nNew -= 
e500: 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d  20;  assert( 20=
e510: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
e520: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ) );.        }el
e530: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e  se{.          nN
e540: 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20  ew = 10;        
e550: 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
e560: 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
e570: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e580: 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
e590: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  ){.          nOu
e5a0: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  t = nNew;.      
e5b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52    }.        WHER
e5c0: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53  ETRACE(0x10, ("S
e5d0: 54 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a  TAT4 range scan:
e5e0: 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c   %u..%u  est=%d\
e5f0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
e610: 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
e620: 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b  )iUpper, nOut));
e630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e640: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  se{.      int bD
e650: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  one = 0;.      r
e660: 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b  c = whereRangeSk
e670: 69 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  ipScanEst(pParse
e680: 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72  , pLower, pUpper
e690: 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29  , pLoop, &bDone)
e6a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e  ;.      if( bDon
e6b0: 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  e ) return rc;. 
e6c0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
e6d0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
e6e0: 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
e6f0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42  SED_PARAMETER(pB
e700: 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72  uilder);.  asser
e710: 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
e720: 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  per );.#endif.  
e730: 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d  assert( pUpper==
e740: 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74  0 || (pUpper->wt
e750: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
e760: 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77  LL)==0 );.  nNew
e770: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
e780: 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74  ust(pLower, nOut
e790: 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
e7a0: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70  eRangeAdjust(pUp
e7b0: 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f  per, nNew);..  /
e7c0: 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
e7d0: 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
e7e0: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69  per and lower li
e7f0: 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20  mit and neither 
e800: 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61  limit.  ** has a
e810: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65  n application-de
e820: 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64  fined likelihood
e830: 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72  (), assume the r
e840: 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64  ange is.  ** red
e850: 75 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74  uced by an addit
e860: 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20  ional 75%. This 
e870: 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64  means that, by d
e880: 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d  efault, an open-
e890: 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65  ended.  ** range
e8a0: 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c   query (e.g. col
e8b0: 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64   > ?) is assumed
e8c0: 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66   to match 1/4 of
e8d0: 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
e8e0: 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69  .  ** index. Whi
e8f0: 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67  le a closed rang
e900: 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57  e (e.g. col BETW
e910: 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20  EEN ? AND ?) is 
e920: 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a  estimated to.  *
e930: 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20  * match 1/64 of 
e940: 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20  the index. */ . 
e950: 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70   if( pLower && p
e960: 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Lower->truthProb
e970: 3e 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20  >0 && pUpper && 
e980: 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f  pUpper->truthPro
e990: 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20  b>0 ){.    nNew 
e9a0: 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f  -= 20;.  }..  nO
e9b0: 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30  ut -= (pLower!=0
e9c0: 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b  ) + (pUpper!=0);
e9d0: 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29  .  if( nNew<10 )
e9e0: 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66   nNew = 10;.  if
e9f0: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f  ( nNew<nOut ) nO
ea00: 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64  ut = nNew;.#if d
ea10: 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
ea20: 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28  E_ENABLED).  if(
ea30: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75   pLoop->nOut>nOu
ea40: 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52  t ){.    WHERETR
ea50: 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65  ACE(0x10,("Range
ea60: 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75   scan lowers nOu
ea70: 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  t from %d to %d\
ea80: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
ea90: 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
eaa0: 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d  Out, nOut));.  }
eab0: 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d  .#endif.  pLoop-
eac0: 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
ead0: 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  nOut;.  return r
eae0: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
eaf0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
eb00: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
eb10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
eb20: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
eb30: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
eb40: 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
eb50: 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
eb60: 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
eb70: 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
eb80: 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
eb90: 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
eba0: 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
ebb0: 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
ebc0: 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
ebd0: 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
ebe0: 69 74 65 5f 73 74 61 74 34 20 68 69 73 74 6f 67  ite_stat4 histog
ebf0: 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
ec00: 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
ec10: 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
ec20: 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
ec30: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
ec40: 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
ec50: 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
ec60: 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
ec70: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
ec80: 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
ec90: 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
eca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ecb0: 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
ecc0: 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
ecd0: 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
ece0: 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
ecf0: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
ed00: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
ed10: 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
ed20: 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
ed30: 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
ed40: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
ed50: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
ed60: 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
ed70: 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
ed80: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
ed90: 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
eda0: 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
edb0: 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
edc0: 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
edd0: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
ede0: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
edf0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
ee00: 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
ee10: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
ee20: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
ee30: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
ee40: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
ee50: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
ee60: 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
ee70: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
ee80: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
ee90: 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
eea0: 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
eeb0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
eec0: 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
eed0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
eee0: 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
eef0: 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
ef00: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
ef10: 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
ef20: 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
ef30: 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64  int nEq = pBuild
ef40: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
ef50: 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65  e.nEq;.  Unpacke
ef60: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
ef70: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
ef80: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
efa0: 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
efb0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
efc0: 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
efd0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
efe0: 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b  ics */.  int bOk
eff0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  ;..  assert( nEq
f000: 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
f010: 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq<=p->nColumn
f020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
f030: 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
f040: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d   assert( p->nSam
f050: 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
f060: 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
f070: 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20  cValid<nEq );.. 
f080: 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72   /* If values ar
f090: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
f0a0: 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  for all fields o
f0b0: 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74  f the index to t
f0c0: 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20  he left.  ** of 
f0d0: 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74  this one, no est
f0e0: 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64  imate can be mad
f0f0: 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
f100: 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20  _NOTFOUND. */.  
f110: 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  if( pBuilder->nR
f120: 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20  ecValid<(nEq-1) 
f130: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f140: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
f150: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73   }..  /* This is
f160: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
f170: 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20   only. The call 
f180: 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34 50  to sqlite3Stat4P
f190: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20  robeSetValue(). 
f1a0: 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20   ** below would 
f1b0: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
f1c0: 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28  value.  */.  if(
f1d0: 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq>=p->nColumn
f1e0: 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d   ){.    *pnRow =
f1f0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
f200: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
f210: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
f220: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
f230: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
f240: 2c 20 70 45 78 70 72 2c 20 31 2c 20 6e 45 71 2d  , pExpr, 1, nEq-
f250: 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69  1, &bOk);.  pBui
f260: 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
f270: 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  c;.  if( rc!=SQL
f280: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
f290: 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30  rc;.  if( bOk==0
f2a0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
f2b0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75  _NOTFOUND;.  pBu
f2c0: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
f2d0: 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65   = nEq;..  where
f2e0: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
f2f0: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
f300: 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
f310: 31 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63  10,("equality sc
f320: 61 6e 20 72 65 67 69 6f 6e 73 20 25 73 28 25 64  an regions %s(%d
f330: 29 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ): %d\n",.      
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
f350: 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31 2c 20 28 69  zName, nEq-1, (i
f360: 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e  nt)a[1]));.  *pn
f370: 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20  Row = a[1];.  . 
f380: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
f390: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
f3a0: 4e 41 42 4c 45 5f 53 54 41 54 34 20 2a 2f 0a 0a  NABLE_STAT4 */..
f3b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f3c0: 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  ABLE_STAT4./*.**
f3d0: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
f3e0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
f3f0: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
f400: 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
f410: 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20  n IN constraint 
f420: 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
f430: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
f440: 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
f450: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c  is a list of val
f460: 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ues.  Example:.*
f470: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52  *.**        WHER
f480: 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29  E x IN (1,2,3,4)
f490: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
f4a0: 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
f4b0: 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
f4c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
f4d0: 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
f4e0: 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
f4f0: 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
f500: 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
f510: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
f520: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
f530: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
f540: 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
f550: 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
f560: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
f570: 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
f580: 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
f590: 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
f5a0: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
f5b0: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
f5c0: 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
f5d0: 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
f5e0: 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
f5f0: 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
f600: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
f610: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
f620: 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e   int whereInScan
f630: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
f640: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
f650: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
f660: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
f670: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
f680: 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
f690: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ,.  ExprList *pL
f6a0: 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ist,     /* The 
f6b0: 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68  value list on th
f6c0: 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28  e RHS of "x IN (
f6d0: 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a  v1,v2,v3,...)" *
f6e0: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
f6f0: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
f700: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
f710: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
f720: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
f730: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
f740: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
f750: 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d  x;.  i64 nRow0 =
f760: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
f770: 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45  Int(p->aiRowLogE
f780: 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52  st[0]);.  int nR
f790: 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64  ecValid = pBuild
f7a0: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20  er->nRecValid;. 
f7b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f7c0: 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66  _OK;     /* Subf
f7d0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
f7e0: 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
f7f0: 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20   nEst;          
f800: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
f810: 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ws for a single 
f820: 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  term */.  tRowcn
f830: 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20  t nRowEst = 0;  
f840: 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74    /* New estimat
f850: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
f860: 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  of rows */.  int
f870: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
f880: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
f890: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
f8a0: 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
f8b0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72   );.  for(i=0; r
f8c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f8d0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
f8e0: 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d  i++){.    nEst =
f8f0: 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d   nRow0;.    rc =
f900: 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
f910: 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
f920: 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  der, pList->a[i]
f930: 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a  .pExpr, &nEst);.
f940: 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e      nRowEst += n
f950: 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  Est;.    pBuilde
f960: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
f970: 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20  RecValid;.  }.. 
f980: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f990: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
f9a0: 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20  owEst > nRow0 ) 
f9b0: 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b  nRowEst = nRow0;
f9c0: 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52  .    *pnRow = nR
f9d0: 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45  owEst;.    WHERE
f9e0: 54 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20  TRACE(0x10,("IN 
f9f0: 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73  row estimate: es
fa00: 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74  t=%d\n", nRowEst
fa10: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
fa20: 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ( pBuilder->nRec
fa30: 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64  Valid==nRecValid
fa40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
fa50: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
fa60: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
fa70: 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45   */...#ifdef WHE
fa80: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
fa90: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
faa0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65  content of a Whe
fab0: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f  reTerm object.*/
fac0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
fad0: 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72  reTermPrint(Wher
fae0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e  eTerm *pTerm, in
faf0: 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20  t iTerm){.  if( 
fb00: 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pTerm==0 ){.    
fb10: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
fb20: 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55  tf("TERM-%-3d NU
fb30: 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20  LL\n", iTerm);. 
fb40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
fb50: 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63   zType[4];.    c
fb60: 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20  har zLeft[50];. 
fb70: 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c     memcpy(zType,
fb80: 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20   "...", 4);.    
fb90: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
fba0: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
fbb0: 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27  L ) zType[0] = '
fbc0: 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  V';.    if( pTer
fbd0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
fbe0: 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65  O_EQUIV  ) zType
fbf0: 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69  [1] = 'E';.    i
fc00: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
fc10: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
fc20: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
fc30: 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a  zType[2] = 'L';.
fc40: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
fc50: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
fc60: 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71  NGLE ){.      sq
fc70: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
fc80: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
fc90: 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d  ft,"left={%d:%d}
fca0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
fcb0: 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
fcc0: 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65  >leftCursor, pTe
fcd0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
fce0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
fcf0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
fd00: 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26  or & WO_OR)!=0 &
fd10: 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e  & pTerm->u.pOrIn
fd20: 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  fo!=0 ){.      s
fd30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
fd40: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
fd50: 65 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30  eft,"indexable=0
fd60: 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20  x%lld", .       
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
fd90: 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20  ->indexable);.  
fda0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
fdb0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
fdc0: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
fdd0: 65 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70  eft,"left=%d", p
fde0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
fdf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fe00: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fe10: 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d  .       "TERM-%-
fe20: 33 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70  3d %p %s %-12s p
fe30: 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30  rob=%-3d op=0x%0
fe40: 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34  3x wtFlags=0x%04
fe50: 78 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72 6d  x",.       iTerm
fe60: 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20  , pTerm, zType, 
fe70: 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74 72  zLeft, pTerm->tr
fe80: 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20  uthProb,.       
fe90: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fea0: 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  , pTerm->wtFlags
feb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
fec0: 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->iField ){.    
fed0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
fee0: 69 6e 74 66 28 22 20 69 46 69 65 6c 64 3d 25 64  intf(" iField=%d
fef0: 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46 69 65  \n", pTerm->iFie
ff00: 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ld);.    }else{.
ff10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
ff20: 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
ff30: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ff40: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
ff50: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
ff60: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
ff70: 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
ff80: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
ff90: 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65   Show the comple
ffa0: 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  te content of a 
ffb0: 57 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76  WhereClause.*/.v
ffc0: 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
ffd0: 43 6c 61 75 73 65 50 72 69 6e 74 28 57 68 65 72  ClausePrint(Wher
ffe0: 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
fff0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
10000 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; i<pWC->nTerm;
10010 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65   i++){.    where
10020 54 65 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e  TermPrint(&pWC->
10030 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a  a[i], i);.  }.}.
10040 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57  #endif..#ifdef W
10050 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
10060 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  D./*.** Print a 
10070 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
10080 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70   for debugging p
10090 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
100a0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
100b0 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20  Print(WhereLoop 
100c0 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  *p, WhereClause 
100d0 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e  *pWC){.  WhereIn
100e0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
100f0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20  ->pWInfo;.  int 
10100 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e  nb = 1+(pWInfo->
10110 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33  pTabList->nSrc+3
10120 29 2f 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72  )/4;.  struct Sr
10130 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
10140 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
10150 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
10160 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
10170 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
10180 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d    Bitmask mAll =
10190 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
101a0 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73  (nb*4)) - 1;.  s
101b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
101c0 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
101d0 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
101e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
101f0 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
10200 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
10210 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20  nb, p->prereq & 
10220 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mAll);.  sqlite3
10230 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
10240 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
10250 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
10260 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
10270 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
10280 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
10290 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
102a0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
102b0 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
102c0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
102d0 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
102e0 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65  pIndex && (zName
102f0 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
10300 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  ndex->zName)!=0 
10310 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
10320 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
10330 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
10340 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
10350 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
10360 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
10370 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
10380 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
10390 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
103a0 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
103b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
103c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
103d0 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
103e0 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
103f0 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
10400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
10410 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
10420 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
10430 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
10440 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
10450 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
10460 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
10470 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
10480 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
10490 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
104a0 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
104b0 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
104c0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
104d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
104e0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
104f0 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
10500 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
10510 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
10520 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
10530 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
10540 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
10550 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
10560 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
10570 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
10580 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20   WHERE_SKIPSCAN 
10590 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
105a0 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
105b0 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73  5x %d-%d", p->ws
105c0 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
105d0 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65  ,p->nSkip);.  }e
105e0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
105f0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
10600 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %05x N %d", p->w
10610 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
10620 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  m);.  }.  sqlite
10630 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
10640 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
10650 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
10660 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20  Run, p->nOut);. 
10670 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26   if( p->nLTerm &
10680 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54  & (sqlite3WhereT
10690 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
106a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
106b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
106c0 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  >nLTerm; i++){. 
106d0 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
106e0 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  int(p->aLTerm[i]
106f0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
10700 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10710 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
10720 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
10730 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
10740 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
10750 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
10760 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
10770 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
10780 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
10790 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
107a0 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
107b0 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
107c0 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
107d0 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
107e0 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
107f0 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
10800 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
10810 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
10820 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
10830 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
10840 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
10850 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
10860 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
10870 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
10880 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
10890 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
108a0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
108b0 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
108c0 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
108d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
108e0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
108f0 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
10900 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
10910 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10920 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
10930 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
10940 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
10950 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
10960 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
10970 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
10980 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
10990 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
109a0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
109b0 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
109c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
109d0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
109e0 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
109f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10a00 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  NN(db, p->u.btre
10a10 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
10a20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
10a30 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
10a40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
10a50 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
10a60 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
10a70 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
10a80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10a90 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
10aa0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
10ab0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
10ac0 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
10ad0 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
10ae0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
10af0 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77   p->aLTerm);.  w
10b00 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
10b10 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65  on(db, p);.  whe
10b20 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d  reLoopInit(p);.}
10b30 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ../*.** Increase
10b40 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
10b50 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70  cation for pLoop
10b60 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65  ->aLTerm[] to be
10b70 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a   at least n..*/.
10b80 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
10b90 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
10ba0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
10bb0 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  p *p, int n){.  
10bc0 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65  WhereTerm **paNe
10bd0 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c  w;.  if( p->nLSl
10be0 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53  ot>=n ) return S
10bf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20  QLITE_OK;.  n = 
10c00 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65  (n+7)&~7;.  paNe
10c10 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
10c20 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
10c30 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
10c40 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
10c50 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
10c60 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
10c70 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c  .  memcpy(paNew,
10c80 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65   p->aLTerm, size
10c90 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
10ca0 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69  *p->nLSlot);.  i
10cb0 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
10cc0 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
10cd0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
10ce0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
10cf0 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
10d00 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
10d10 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
10d20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10d30 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
10d40 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
10d50 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
10d60 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
10d70 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
10d80 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
10d90 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
10da0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
10db0 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
10dc0 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
10dd0 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
10de0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
10df0 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
10e00 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
10e10 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
10e20 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
10e30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10e40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
10e50 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
10e60 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
10e70 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
10e80 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
10e90 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
10ea0 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
10eb0 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
10ec0 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
10ed0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10ee0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
10ef0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
10f00 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
10f10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
10f20 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
10f30 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
10f40 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
10f50 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
10f60 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
10f70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10f80 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
10f90 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
10fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10fb0 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
10fc0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
10fd0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
10fe0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
10ff0 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
11000 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  FreeNN(db, p);.}
11010 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
11020 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
11030 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
11040 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
11050 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
11060 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
11070 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
11080 72 74 28 20 70 57 49 6e 66 6f 21 3d 30 20 29 3b  rt( pWInfo!=0 );
11090 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
110a0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
110b0 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76  +){.    WhereLev
110c0 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57  el *pLevel = &pW
110d0 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
110e0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  if( pLevel->pWLo
110f0 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  op && (pLevel->p
11100 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
11110 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20   WHERE_IN_ABLE) 
11120 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11130 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
11140 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
11150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11160 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
11170 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73  Clear(&pWInfo->s
11180 57 43 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 57  WC);.  while( pW
11190 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a  Info->pLoops ){.
111a0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
111b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70   = pWInfo->pLoop
111c0 73 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  s;.    pWInfo->p
111d0 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
111e0 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 4c  Loop;.    whereL
111f0 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
11200 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
11210 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 57 49 6e  bFreeNN(db, pWIn
11220 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  fo);.}../*.** Re
11230 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c  turn TRUE if all
11240 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
11250 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
11260 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
11270 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
11280 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
11290 20 20 28 32 29 20 20 58 20 75 73 65 73 20 66 65    (2)  X uses fe
112a0 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
112b0 20 74 65 72 6d 73 20 74 68 61 6e 20 59 0a 2a 2a   terms than Y.**
112c0 20 20 20 28 33 29 20 20 45 76 65 72 79 20 57 48     (3)  Every WH
112d0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
112e0 75 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73  used by X is als
112f0 6f 20 75 73 65 64 20 62 79 20 59 0a 2a 2a 20 20  o used by Y.**  
11300 20 28 34 29 20 20 58 20 73 6b 69 70 73 20 61 74   (4)  X skips at
11310 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63   least as many c
11320 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 20 20  olumns as Y.**  
11330 20 28 35 29 20 20 49 66 20 58 20 69 73 20 61 20   (5)  If X is a 
11340 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
11350 74 68 61 6e 20 59 20 69 73 20 74 6f 6f 0a 2a 2a  than Y is too.**
11360 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 28  .** Conditions (
11370 32 29 20 61 6e 64 20 28 33 29 20 6d 65 61 6e 20  2) and (3) mean 
11380 74 68 61 74 20 58 20 69 73 20 61 20 22 70 72 6f  that X is a "pro
11390 70 65 72 20 73 75 62 73 65 74 22 20 6f 66 20 59  per subset" of Y
113a0 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70  ..** If X is a p
113b0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
113c0 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65  Y then Y is a be
113d0 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20  tter choice and 
113e0 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65  ought.** to have
113f0 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20   a lower cost.  
11400 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
11410 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74  urns TRUE when t
11420 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c  hat cost .** rel
11430 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76  ationship is inv
11440 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20  erted and needs 
11450 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20  to be adjusted. 
11460 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 34 29 0a   Constraint (4).
11470 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
11480 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73  ause if X uses s
11490 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68  kip-scan less th
114a0 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69  an Y it still mi
114b0 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61  ght.** deserve a
114c0 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e   lower cost even
114d0 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
114e0 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 20  er subset of Y. 
114f0 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 35 29 0a   Constraint (5).
11500 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
11510 61 75 73 65 20 61 20 63 6f 76 65 72 69 6e 67 20  ause a covering 
11520 69 6e 64 65 78 20 70 72 6f 62 61 62 6c 79 20 64  index probably d
11530 65 73 65 72 76 65 73 20 74 6f 20 68 61 76 65 20  eserves to have 
11540 61 20 6c 6f 77 65 72 20 63 6f 73 74 0a 2a 2a 20  a lower cost.** 
11550 74 68 61 6e 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  than a non-cover
11560 69 6e 67 20 69 6e 64 65 78 20 65 76 65 6e 20 69  ing index even i
11570 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65 72  f it is a proper
11580 20 73 75 62 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   subset..*/.stat
11590 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
115a0 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
115b0 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65  set(.  const Whe
115c0 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20  reLoop *pX,     
115d0 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65    /* First Where
115e0 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20  Loop to compare 
115f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  */.  const Where
11600 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20  Loop *pY        
11610 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e  /* Compare again
11620 73 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  st this WhereLoo
11630 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  p */.){.  int i,
11640 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c   j;.  if( pX->nL
11650 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e  Term-pX->nSkip >
11660 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d  = pY->nLTerm-pY-
11670 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65  >nSkip ){.    re
11680 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20  turn 0; /* X is 
11690 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
116a0 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  Y */.  }.  if( p
116b0 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e  Y->nSkip > pX->n
116c0 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b  Skip ) return 0;
116d0 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20  .  if( pX->rRun 
116e0 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20  >= pY->rRun ){. 
116f0 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20     if( pX->rRun 
11700 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74  > pY->rRun ) ret
11710 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
11720 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
11730 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e   */.    if( pX->
11740 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20  nOut > pY->nOut 
11750 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
11760 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  * X costs more t
11770 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66  han Y */.  }.  f
11780 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d  or(i=pX->nLTerm-
11790 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
117a0 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72     if( pX->aLTer
117b0 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  m[i]==0 ) contin
117c0 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59  ue;.    for(j=pY
117d0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
117e0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; j--){.      if
117f0 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d  ( pY->aLTerm[j]=
11800 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29  =pX->aLTerm[i] )
11810 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11820 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75    if( j<0 ) retu
11830 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20  rn 0;  /* X not 
11840 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69  a subset of Y si
11850 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f  nce term X[i] no
11860 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20  t used by Y */. 
11870 20 7d 0a 20 20 69 66 28 20 28 70 58 2d 3e 77 73   }.  if( (pX->ws
11880 46 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f  Flags&WHERE_IDX_
11890 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 26 26 20  ONLY)!=0 .   && 
118a0 28 70 59 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  (pY->wsFlags&WHE
118b0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
118c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
118d0 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
118e0 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  (5) */.  }.  ret
118f0 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63  urn 1;  /* All c
11900 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a  onditions meet *
11910 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  /.}../*.** Try t
11920 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73  o adjust the cos
11930 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70  t of WhereLoop p
11940 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73  Template upwards
11950 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f   or downwards so
11960 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  .** that:.**.** 
11970 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20    (1) pTemplate 
11980 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20  costs less than 
11990 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c  any other WhereL
119a0 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20  oops that are a 
119b0 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20  proper.**       
119c0 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c  subset of pTempl
119d0 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  ate.**.**   (2) 
119e0 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
119f0 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74  more than any ot
11a00 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  her WhereLoops f
11a10 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61  or which pTempla
11a20 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61  te.**       is a
11a30 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a   proper subset..
11a40 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68  **.** To say "Wh
11a50 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70  ereLoop X is a p
11a60 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
11a70 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20  Y" means that X 
11a80 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48  uses fewer.** WH
11a90 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
11aa0 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74   than Y and that
11ab0 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
11ac0 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79  use term used by
11ad0 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73   X is.** also us
11ae0 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74  ed by Y..*/.stat
11af0 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
11b00 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73  pAdjustCost(cons
11b10 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t WhereLoop *p, 
11b20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
11b30 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54  late){.  if( (pT
11b40 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
11b50 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
11b60 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
11b70 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70   for(; p; p=p->p
11b80 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69  NextLoop){.    i
11b90 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
11ba0 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f  plate->iTab ) co
11bb0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
11bc0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
11bd0 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
11be0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11bf0 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
11c00 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
11c10 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29  (p, pTemplate) )
11c20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
11c30 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
11c40 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61   downward so tha
11c50 74 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20  t it is cheaper 
11c60 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20  than its .      
11c70 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a  ** subset p. */.
11c80 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
11c90 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
11ca0 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
11cb0 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
11cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11cd0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
11ce0 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
11cf0 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
11d00 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b  un, p->nOut-1));
11d10 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
11d20 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
11d30 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
11d40 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
11d50 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t - 1;.    }else
11d60 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68   if( whereLoopCh
11d70 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65  eaperProperSubse
11d80 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20  t(pTemplate, p) 
11d90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
11da0 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  st pTemplate cos
11db0 74 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74  t upward so that
11dc0 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20   it is costlier 
11dd0 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20  than p since.   
11de0 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20     ** pTemplate 
11df0 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
11e00 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20  et of p */.     
11e10 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
11e20 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61  ,("subset cost a
11e30 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20  djustment %d,%d 
11e40 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20  to %d,%d\n",.   
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
11e70 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Run, pTemplate->
11e80 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  nOut, p->rRun, p
11e90 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20  ->nOut+1));.    
11ea0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
11eb0 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20  n = p->rRun;.   
11ec0 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
11ed0 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31  ut = p->nOut + 1
11ee0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11ef0 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
11f00 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
11f10 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f  ps in *ppPrev lo
11f20 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68  oking for one th
11f30 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 72 65 70  at can be.** rep
11f40 6c 61 63 65 64 20 62 79 20 70 54 65 6d 70 6c 61  laced by pTempla
11f50 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
11f60 20 4e 55 4c 4c 20 69 66 20 70 54 65 6d 70 6c 61   NULL if pTempla
11f70 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
11f80 6e 67 20 6f 6e 20 74 68 65 20 57 68 65 72 65 4c  ng on the WhereL
11f90 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a 20 49 6e 20  oop list..** In 
11fa0 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 70  other words if p
11fb0 54 65 6d 70 6c 61 74 65 20 6f 75 67 68 74 20 74  Template ought t
11fc0 6f 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  o be dropped fro
11fd0 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64  m further consid
11fe0 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
11ff0 66 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c  f pX is a WhereL
12000 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61  oop that pTempla
12010 74 65 20 63 61 6e 20 72 65 70 6c 61 63 65 2c 20  te can replace, 
12020 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
12030 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69  ** link that poi
12040 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a  nts to pX..**.**
12050 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61   If pTemplate ca
12060 6e 6e 6f 74 20 72 65 70 6c 61 63 65 20 61 6e 79  nnot replace any
12070 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e   existing elemen
12080 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75  t of the list bu
12090 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  t needs.** to be
120a0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
120b0 73 74 20 61 73 20 61 20 6e 65 77 20 65 6e 74 72  st as a new entr
120c0 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  y, then return a
120d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
120e0 2a 2a 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c  ** tail of the l
120f0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  ist..*/.static W
12100 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65  hereLoop **where
12110 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a  LoopFindLesser(.
12120 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
12130 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68  Prev,.  const Wh
12140 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
12150 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  te.){.  WhereLoo
12160 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a  p *p;.  for(p=(*
12170 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72  ppPrev); p; ppPr
12180 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ev=&p->pNextLoop
12190 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20  , p=*ppPrev){.  
121a0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
121b0 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c  Template->iTab |
121c0 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70  | p->iSortIdx!=p
121d0 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49  Template->iSortI
121e0 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  dx ){.      /* I
121f0 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61  f either the iTa
12200 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61  b or iSortIdx va
12210 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65  lues for two Whe
12220 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65  reLoop are diffe
12230 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  rent.      ** th
12240 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f  en those WhereLo
12250 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ops need to be c
12260 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61  onsidered separa
12270 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69  tely.  Neither i
12280 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e  s.      ** a can
12290 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63  didate to replac
122a0 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a  e the other. */.
122b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
122c0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20      }.    /* In 
122d0 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
122e0 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
122f0 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20  rSetup value is 
12300 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20  either zero.    
12310 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f  ** or the cost o
12320 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75  f building an au
12330 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e  tomatic index (N
12340 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c  logN) and the Nl
12350 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  ogN.    ** is th
12360 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61  e same for compa
12370 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73  tible WhereLoops
12380 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
12390 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c   p->rSetup==0 ||
123a0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74   pTemplate->rSet
123b0 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  up==0 .         
123c0 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53          || p->rS
123d0 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
123e0 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
123f0 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  /* whereLoopAddB
12400 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65  tree() always ge
12410 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65  nerates and inse
12420 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  rts the automati
12430 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  c index.    ** c
12440 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63  ase first.  Henc
12450 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e  e compatible can
12460 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  didate WhereLoop
12470 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c  s never have a l
12480 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65  arger.    ** rSe
12490 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53  tup. Call this S
124a0 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a  ETUP-INVARIANT *
124b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
124c0 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
124d0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
124e0 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75     /* Any loop u
124f0 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69  sing an appliati
12500 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78  on-defined index
12510 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   (or PRIMARY KEY
12520 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55   or.    ** UNIQU
12530 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69  E constraint) wi
12540 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d  th one or more =
12550 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73  = constraints is
12560 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
12570 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  han an automatic
12580 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69   index. Unless i
12590 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e  t is a skip-scan
125a0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d  . */.    if( (p-
125b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
125c0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a  _AUTO_INDEX)!=0.
125d0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
125e0 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20  te->nSkip)==0.  
125f0 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
12600 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
12610 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
12620 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
12630 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
12640 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a  E_COLUMN_EQ)!=0.
12650 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72       && (p->prer
12660 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
12670 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
12680 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29  te->prereq.    )
12690 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
126a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
126b0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
126c0 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74  op p is better t
126d0 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70  han pTemplate, p
126e0 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a  Template can be.
126f0 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64      ** discarded
12700 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  .  WhereLoop p i
12710 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20  s better if:.   
12720 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73   **   (1)  p has
12730 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65   no more depende
12740 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70  ncies than pTemp
12750 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  late, and.    **
12760 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e     (2)  p has an
12770 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
12780 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c  cost than pTempl
12790 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ate.    */.    i
127a0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
127b0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
127c0 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20  q)==p->prereq   
127d0 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
127e0 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
127f0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20    /* (2a) */.   
12820 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54    && p->rRun<=pT
12830 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12850 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
12860 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70     && p->nOut<=p
12870 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12890 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20      /* (2c) */. 
128a0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
128b0 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72  rn 0;  /* Discar
128c0 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  d pTemplate */. 
128d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
128e0 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77  pTemplate is alw
128f0 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20  ays better than 
12900 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20  p, then cause p 
12910 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  to be overwritte
12920 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54  n.    ** with pT
12930 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c  emplate.  pTempl
12940 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68  ate is better th
12950 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20  an p if:.    ** 
12960 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65    (1)  pTemplate
12970 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
12980 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c  endences than p,
12990 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32   and.    **   (2
129a0 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73  )  pTemplate has
129b0 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
129c0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a  er cost than p..
129d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
129e0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
129f0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
12a00 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
12a10 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20  q   /* (1)  */. 
12a20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
12a30 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
12a60 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
12a70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74  ->nOut>=pTemplat
12a80 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20  e->nOut         
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
12ab0 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
12ac0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
12ad0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
12ae0 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56   ); /* SETUP-INV
12af0 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a  ARIANT above */.
12b00 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f        break;   /
12b10 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20  * Cause p to be 
12b20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70  overwritten by p
12b30 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
12b40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
12b50 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pPrev;.}../*.** 
12b60 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63  Insert or replac
12b70 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  e a WhereLoop en
12b80 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65  try using the te
12b90 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e  mplate supplied.
12ba0 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
12bb0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  ng WhereLoop ent
12bc0 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72  ry might be over
12bd0 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e  written if the n
12be0 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69  ew template.** i
12bf0 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73  s better and has
12c00 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
12c10 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d  ies.  Or the tem
12c20 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67  plate will be ig
12c30 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20  nored.** and no 
12c40 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75  insert will occu
12c50 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  r if an existing
12c60 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61   WhereLoop is fa
12c70 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20  ster and has.** 
12c80 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
12c90 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70  es than the temp
12ca0 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65  late.  Otherwise
12cb0 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
12cc0 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73   is.** added bas
12cd0 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61  ed on the templa
12ce0 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  te..**.** If pBu
12cf0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
12d00 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77   not NULL then w
12d10 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c  e care about onl
12d20 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75  y the.** prerequ
12d30 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20  isites and rRun 
12d40 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f  and nOut costs o
12d50 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f  f the N best loo
12d60 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66  ps.  That.** inf
12d70 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68  ormation is gath
12d80 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69  ered in the pBui
12d90 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a  lder->pOrSet obj
12da0 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69  ect.  This speci
12db0 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  al.** processing
12dc0 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e   mode is used on
12dd0 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  ly for OR clause
12de0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
12df0 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61  ** When accumula
12e00 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f  ting multiple lo
12e10 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64  ops (when pBuild
12e20 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55  er->pOrSet is NU
12e30 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20  LL) we.** still 
12e40 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
12e50 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69  similar loops wi
12e60 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  th the new templ
12e70 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  ate if the.** ne
12e80 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  w template is be
12e90 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
12ea0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
12eb0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
12ec0 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
12ed0 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
12ee0 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
12ef0 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
12f00 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
12f10 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
12f20 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
12f30 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
12f40 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
12f50 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
12f60 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
12f70 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
12f80 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
12f90 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
12fa0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
12fb0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f   current loop.*/
12fc0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
12fd0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
12fe0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
12ff0 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
13000 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
13010 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
13020 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65  rev, *p;.  Where
13030 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
13040 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
13050 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
13060 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
13070 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  >db;.  int rc;..
13080 20 20 2f 2a 20 53 74 6f 70 20 74 68 65 20 73 65    /* Stop the se
13090 61 72 63 68 20 6f 6e 63 65 20 77 65 20 68 69 74  arch once we hit
130a0 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
130b0 65 72 20 73 65 61 72 63 68 20 6c 69 6d 69 74 20  er search limit 
130c0 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
130d0 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 3d 3d 30  r->iPlanLimit==0
130e0 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
130f0 43 45 28 30 78 66 66 66 66 66 66 66 66 2c 28 22  CE(0xffffffff,("
13100 3d 3d 3d 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  === query planne
13110 72 20 73 65 61 72 63 68 20 6c 69 6d 69 74 20 72  r search limit r
13120 65 61 63 68 65 64 20 3d 3d 3d 5c 6e 22 29 29 3b  eached ===\n"));
13130 0a 20 20 20 20 69 66 28 20 70 42 75 69 6c 64 65  .    if( pBuilde
13140 72 2d 3e 70 4f 72 53 65 74 20 29 20 70 42 75 69  r->pOrSet ) pBui
13150 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 20  lder->pOrSet->n 
13160 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
13170 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
13180 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 69 50 6c  .  pBuilder->iPl
13190 61 6e 4c 69 6d 69 74 2d 2d 3b 0a 0a 20 20 2f 2a  anLimit--;..  /*
131a0 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f   If pBuilder->pO
131b0 72 53 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c  rSet is defined,
131c0 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20   then only keep 
131d0 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73  track of the cos
131e0 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72  ts.  ** and prer
131f0 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eqs..  */.  if( 
13200 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
13210 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
13220 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d  Template->nLTerm
13230 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41   ){.#if WHERETRA
13240 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
13250 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65   u16 n = pBuilde
13260 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20  r->pOrSet->n;.  
13270 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64      int x =.#end
13280 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72  if.      whereOr
13290 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d  Insert(pBuilder-
132a0 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61  >pOrSet, pTempla
132b0 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d  te->prereq, pTem
132c0 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20  plate->rRun,.   
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
13300 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  );.#if WHERETRAC
13310 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
13320 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
13330 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
13340 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20  & 0x8 ){.       
13350 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
13360 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a  ntf(x?"   or-%d:
13370 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22    ":"   or-X:  "
13380 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 68  , n);.        wh
13390 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
133a0 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
133b0 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  ->pWC);.      }.
133c0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
133d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
133e0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  K;.  }..  /* Loo
133f0 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  k for an existin
13400 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72  g WhereLoop to r
13410 65 70 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d  eplace with pTem
13420 70 6c 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65  plate.  */.  whe
13430 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74  reLoopAdjustCost
13440 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  (pWInfo->pLoops,
13450 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70   pTemplate);.  p
13460 70 50 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f  pPrev = whereLoo
13470 70 46 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49  pFindLesser(&pWI
13480 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
13490 6d 70 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20  mplate);..  if( 
134a0 70 70 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ppPrev==0 ){.   
134b0 20 2f 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64   /* There alread
134c0 79 20 65 78 69 73 74 73 20 61 20 57 68 65 72 65  y exists a Where
134d0 4c 6f 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74  Loop on the list
134e0 20 74 68 61 74 20 69 73 20 62 65 74 74 65 72 0a   that is better.
134f0 20 20 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d      ** than pTem
13500 70 6c 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69  plate, so just i
13510 67 6e 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20  gnore pTemplate 
13520 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
13530 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
13540 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
13550 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
13560 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  0x8 ){.      sql
13570 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
13580 22 20 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20  "   skip: ");.  
13590 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
135a0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
135b0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
135c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
135d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
135e0 20 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20    .  }else{.    
135f0 70 20 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d  p = *ppPrev;.  }
13600 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
13610 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  ch this point it
13620 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68   means that eith
13630 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65  er p[] should be
13640 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a   overwritten.  *
13650 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  * with pTemplate
13660 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73  [] if p[] exists
13670 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20  , or if p==NULL 
13680 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20  then allocate a 
13690 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f  new.  ** WhereLo
136a0 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  op and insert it
136b0 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ..  */.#if WHERE
136c0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
136d0 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71   0x8 */.  if( sq
136e0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
136f0 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28  & 0x8 ){.    if(
13700 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p!=0 ){.      s
13710 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
13720 66 28 22 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a  f("replace: ");.
13730 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
13740 72 69 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72  rint(p, pBuilder
13750 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 73 71  ->pWC);.      sq
13760 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
13770 28 22 20 20 20 77 69 74 68 3a 20 22 29 3b 0a 20  ("   with: ");. 
13780 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13790 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
137a0 74 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b  tf("    add: ");
137b0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65  .    }.    where
137c0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
137d0 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
137e0 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  WC);.  }.#endif.
137f0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
13800 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
13810 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  new WhereLoop to
13820 20 61 64 64 20 74 6f 20 74 68 65 20 65 6e 64 20   add to the end 
13830 6f 66 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  of the list */. 
13840 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 20 3d     *ppPrev = p =
13850 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
13860 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
13870 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
13880 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
13890 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
138a0 5f 42 4b 50 54 3b 0a 20 20 20 20 77 68 65 72 65  _BKPT;.    where
138b0 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20  LoopInit(p);.   
138c0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20   p->pNextLoop = 
138d0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
138e0 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76  /* We will be ov
138f0 65 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c  erwriting WhereL
13900 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65  oop p[].  But be
13910 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73  fore we do, firs
13920 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f  t.    ** go thro
13930 75 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20  ugh the rest of 
13940 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c  the list and del
13950 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e  ete any other en
13960 74 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20  tries besides.  
13970 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72    ** p[] that ar
13980 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64  e also supplated
13990 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
139a0 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
139b0 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e  *ppTail = &p->pN
139c0 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65  extLoop;.    Whe
139d0 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a  reLoop *pToDel;.
139e0 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61      while( *ppTa
139f0 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61  il ){.      ppTa
13a00 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  il = whereLoopFi
13a10 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c  ndLesser(ppTail,
13a20 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20   pTemplate);.   
13a30 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30     if( ppTail==0
13a40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
13a50 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c  pToDel = *ppTail
13a60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 44  ;.      if( pToD
13a70 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  el==0 ) break;. 
13a80 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70       *ppTail = p
13a90 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ToDel->pNextLoop
13aa0 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  ;.#if WHERETRACE
13ab0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
13ac0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
13ad0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
13ae0 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20   0x8 ){.        
13af0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
13b00 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b  tf(" delete: ");
13b10 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
13b20 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20  opPrint(pToDel, 
13b30 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
13b40 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
13b50 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
13b60 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29  lete(db, pToDel)
13b70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
13b80 20 3d 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72   = whereLoopXfer
13b90 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74  (db, p, pTemplat
13ba0 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
13bb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
13bc0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
13bd0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
13be0 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  dex = p->u.btree
13bf0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
13c00 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65   pIndex && pInde
13c10 78 2d 3e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49  x->idxType==SQLI
13c20 54 45 5f 49 44 58 54 59 50 45 5f 49 50 4b 20 29  TE_IDXTYPE_IPK )
13c30 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
13c40 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
13c50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
13c60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
13c70 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
13c80 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
13c90 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
13ca0 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
13cb0 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
13cc0 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
13cd0 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
13ce0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
13cf0 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
13d00 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
13d10 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
13d20 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
13d30 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
13d40 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
13d50 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
13d60 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
13d70 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
13d80 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
13d90 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
13da0 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
13db0 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
13dc0 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
13dd0 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
13de0 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
13df0 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
13e00 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
13e10 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
13e20 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
13e30 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
13e40 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
13e50 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
13e60 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
13e70 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
13e80 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
13e90 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
13ea0 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
13eb0 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
13ec0 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
13ed0 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
13ee0 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
13ef0 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
13f00 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
13f10 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
13f20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
13f30 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
13f40 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
13f50 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
13f60 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
13f70 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
13f80 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
13f90 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
13fa0 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
13fb0 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
13fc0 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
13fd0 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
13fe0 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
13ff0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
14000 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
14010 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
14020 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
14030 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
14040 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
14050 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
14060 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
14070 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
14080 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
14090 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
140a0 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
140b0 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
140c0 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
140d0 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
140e0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
140f0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
14100 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
14110 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
14120 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
14130 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
14140 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
14150 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
14160 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
14170 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
14180 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
14190 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
141a0 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
141b0 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
141c0 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
141d0 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
141e0 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
141f0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
14200 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
14210 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
14220 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
14230 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
14240 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
14250 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
14260 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
14270 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
14280 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
14290 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
142a0 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
142b0 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
142c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
142d0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
142e0 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
142f0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
14300 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
14310 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
14320 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
14330 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
14340 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
14350 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
14360 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
14370 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
14380 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
14390 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
143a0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
143b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
143c0 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
143d0 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
143e0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
143f0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
14400 72 6d 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  rm++){.    asser
14410 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
14420 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77     if( (pTerm->w
14430 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
14440 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61  RTUAL)!=0 ) brea
14450 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  k;.    if( (pTer
14460 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
14470 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d  Loop->maskSelf)=
14480 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
14490 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
144a0 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c  rereqAll & notAl
144b0 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74  lowed)!=0 ) cont
144c0 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
144d0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  pLoop->nLTerm-1;
144e0 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
144f0 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61     pX = pLoop->a
14500 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20  LTerm[j];.      
14510 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74  if( pX==0 ) cont
14520 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
14530 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61  pX==pTerm ) brea
14540 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  k;.      if( pX-
14550 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28  >iParent>=0 && (
14560 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72  &pWC->a[pX->iPar
14570 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62  ent])==pTerm ) b
14580 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14590 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20  if( j<0 ){.     
145a0 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
145b0 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20  hProb<=0 ){.    
145c0 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72 75 74      /* If a trut
145d0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73  h probability is
145e0 20 73 70 65 63 69 66 69 65 64 20 75 73 69 6e 67   specified using
145f0 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28   the likelihood(
14600 29 20 68 69 6e 74 73 2c 0a 20 20 20 20 20 20 20  ) hints,.       
14610 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 74 68 65   ** then use the
14620 20 70 72 6f 62 61 62 69 6c 69 74 79 20 70 72 6f   probability pro
14630 76 69 64 65 64 20 62 79 20 74 68 65 20 61 70 70  vided by the app
14640 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  lication. */.   
14650 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
14660 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
14670 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Prob;.      }els
14680 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  e{.        /* In
14690 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
146a0 65 78 70 6c 69 63 69 74 20 74 72 75 74 68 20 70  explicit truth p
146b0 72 6f 62 61 62 69 6c 69 74 69 65 73 2c 20 75 73  robabilities, us
146c0 65 20 68 65 75 72 69 73 74 69 63 73 20 74 6f 0a  e heuristics to.
146d0 20 20 20 20 20 20 20 20 2a 2a 20 67 75 65 73 73          ** guess
146e0 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 74 72   a reasonable tr
146f0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e  uth probability.
14700 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   */.        pLoo
14710 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20  p->nOut--;.     
14720 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
14730 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57  perator&(WO_EQ|W
14740 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 20  O_IS) ){.       
14750 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
14760 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
14770 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
14780 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
14790 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
147a0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
147b0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
147c0 49 73 49 6e 74 65 67 65 72 28 70 52 69 67 68 74  IsInteger(pRight
147d0 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29  , &k) && k>=(-1)
147e0 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20   && k<=1 ){.    
147f0 20 20 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a          k = 10;.
14800 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
14810 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d  .            k =
14820 20 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   20;.          }
14830 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
14840 52 65 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75  Reduce<k ) iRedu
14850 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  ce = k;.        
14860 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
14870 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
14880 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65  >nOut > nRow-iRe
14890 64 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e  duce )  pLoop->n
148a0 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65  Out = nRow - iRe
148b0 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  duce;.}../* .** 
148c0 54 65 72 6d 20 70 54 65 72 6d 20 69 73 20 61 20  Term pTerm is a 
148d0 76 65 63 74 6f 72 20 72 61 6e 67 65 20 63 6f 6d  vector range com
148e0 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
148f0 6e 2e 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d  n. The first com
14900 70 61 72 69 73 6f 6e 0a 2a 2a 20 69 6e 20 74 68  parison.** in th
14910 65 20 76 65 63 74 6f 72 20 63 61 6e 20 62 65 20  e vector can be 
14920 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
14930 63 6f 6c 75 6d 6e 20 6e 45 71 20 6f 66 20 74 68  column nEq of th
14940 65 20 69 6e 64 65 78 2e 20 54 68 69 73 0a 2a 2a  e index. This.**
14950 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
14960 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
14970 65 72 20 6f 66 20 76 65 63 74 6f 72 20 65 6c 65  er of vector ele
14980 6d 65 6e 74 73 20 74 68 61 74 20 63 61 6e 20 62  ments that can b
14990 65 20 75 73 65 64 0a 2a 2a 20 61 73 20 70 61 72  e used.** as par
149a0 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 63  t of the range c
149b0 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a  omparison..**.**
149c0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
149d0 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a   the query is:.*
149e0 2a 0a 2a 2a 20 20 20 57 48 45 52 45 20 61 20 3d  *.**   WHERE a =
149f0 20 3f 20 41 4e 44 20 28 62 2c 20 63 2c 20 64 29   ? AND (b, c, d)
14a00 20 3e 20 28 3f 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a   > (?, ?, ?).**.
14a10 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
14a20 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
14a30 20 49 4e 44 45 58 20 2e 2e 2e 20 4f 4e 20 28 61   INDEX ... ON (a
14a40 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 2a 2a  , b, c, d, e).**
14a50 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75  .** then this fu
14a60 6e 63 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  nction would be 
14a70 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 45 71  invoked with nEq
14a80 3d 31 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  =1. The value re
14a90 74 75 72 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69  turned in.** thi
14aa0 73 20 63 61 73 65 20 69 73 20 33 2e 0a 2a 2f 0a  s case is 3..*/.
14ab0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
14ac0 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a  RangeVectorLen(.
14ad0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14ae0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
14af0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
14b00 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
14b10 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
14b20 65 6e 20 6f 6e 20 70 49 64 78 20 2a 2f 0a 20 20  en on pIdx */.  
14b30 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
14b40 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
14b50 78 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  x to be used for
14b60 20 61 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f   a inequality co
14b70 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e  nstraint */.  in
14b80 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20  t nEq,          
14b90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14ba0 70 72 69 6f 72 20 65 71 75 61 6c 69 74 79 20 63  prior equality c
14bb0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 73 61  onstraints on sa
14bc0 6d 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  me index */.  Wh
14bd0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 20  ereTerm *pTerm  
14be0 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72     /* The vector
14bf0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
14c00 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  traint */.){.  i
14c10 6e 74 20 6e 43 6d 70 20 3d 20 73 71 6c 69 74 65  nt nCmp = sqlite
14c20 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
14c30 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  pTerm->pExpr->pL
14c40 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  eft);.  int i;..
14c50 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 43 6d    nCmp = MIN(nCm
14c60 70 2c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  p, (pIdx->nColum
14c70 6e 20 2d 20 6e 45 71 29 29 3b 0a 20 20 66 6f 72  n - nEq));.  for
14c80 28 69 3d 31 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b  (i=1; i<nCmp; i+
14c90 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 65 73 74 20  +){.    /* Test 
14ca0 69 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 20  if comparison i 
14cb0 6f 66 20 70 54 65 72 6d 20 69 73 20 63 6f 6d 70  of pTerm is comp
14cc0 61 74 69 62 6c 65 20 77 69 74 68 20 63 6f 6c 75  atible with colu
14cd0 6d 6e 20 28 69 2b 6e 45 71 29 20 0a 20 20 20 20  mn (i+nEq) .    
14ce0 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
14cf0 20 49 66 20 6e 6f 74 2c 20 65 78 69 74 20 74 68   If not, exit th
14d00 65 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20  e loop.  */.    
14d10 63 68 61 72 20 61 66 66 3b 20 20 20 20 20 20 20  char aff;       
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14d30 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69   Comparison affi
14d40 6e 69 74 79 20 2a 2f 0a 20 20 20 20 63 68 61 72  nity */.    char
14d50 20 69 64 78 61 66 66 20 3d 20 30 3b 20 20 20 20   idxaff = 0;    
14d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
14d70 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 66 66  exed columns aff
14d80 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 43 6f 6c  inity */.    Col
14d90 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
14da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
14db0 6d 70 61 72 69 73 6f 6e 20 63 6f 6c 6c 61 74 69  mparison collati
14dc0 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
14dd0 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20     Expr *pLhs = 
14de0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  pTerm->pExpr->pL
14df0 65 66 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  eft->x.pList->a[
14e00 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  i].pExpr;.    Ex
14e10 70 72 20 2a 70 52 68 73 20 3d 20 70 54 65 72 6d  pr *pRhs = pTerm
14e20 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
14e30 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66  .    if( pRhs->f
14e40 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
14e50 65 63 74 20 29 7b 0a 20 20 20 20 20 20 70 52 68  ect ){.      pRh
14e60 73 20 3d 20 70 52 68 73 2d 3e 78 2e 70 53 65 6c  s = pRhs->x.pSel
14e70 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  ect->pEList->a[i
14e80 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c  ].pExpr;.    }el
14e90 73 65 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d  se{.      pRhs =
14ea0 20 70 52 68 73 2d 3e 78 2e 70 4c 69 73 74 2d 3e   pRhs->x.pList->
14eb0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14ec0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
14ed0 74 68 61 74 20 74 68 65 20 4c 48 53 20 6f 66 20  that the LHS of 
14ee0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
14ef0 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  s a column refer
14f00 65 6e 63 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  ence to.    ** t
14f10 68 65 20 72 69 67 68 74 20 63 6f 6c 75 6d 6e 20  he right column 
14f20 6f 66 20 74 68 65 20 72 69 67 68 74 20 73 6f 75  of the right sou
14f30 72 63 65 20 74 61 62 6c 65 2e 20 41 6e 64 20 74  rce table. And t
14f40 68 61 74 20 74 68 65 20 73 6f 72 74 0a 20 20 20  hat the sort.   
14f50 20 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65   ** order of the
14f60 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 73   index column is
14f70 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
14f80 20 73 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 74   sort order of t
14f90 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 6d 6f  he.    ** leftmo
14fa0 73 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 2e  st index column.
14fb0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 68    */.    if( pLh
14fc0 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  s->op!=TK_COLUMN
14fd0 20 0a 20 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e   .     || pLhs->
14fe0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 0a 20 20  iTable!=iCur .  
14ff0 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 43 6f 6c     || pLhs->iCol
15000 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn!=pIdx->aiCol
15010 75 6d 6e 5b 69 2b 6e 45 71 5d 20 0a 20 20 20 20  umn[i+nEq] .    
15020 20 7c 7c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f   || pIdx->aSortO
15030 72 64 65 72 5b 69 2b 6e 45 71 5d 21 3d 70 49 64  rder[i+nEq]!=pId
15040 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
15050 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q].    ){.      
15060 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15070 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 68 73    testcase( pLhs
15080 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f  ->iColumn==XN_RO
15090 57 49 44 20 29 3b 0a 20 20 20 20 61 66 66 20 3d  WID );.    aff =
150a0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
150b0 66 66 69 6e 69 74 79 28 70 52 68 73 2c 20 73 71  ffinity(pRhs, sq
150c0 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
150d0 79 28 70 4c 68 73 29 29 3b 0a 20 20 20 20 69 64  y(pLhs));.    id
150e0 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61  xaff = sqlite3Ta
150f0 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
15100 79 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20  y(pIdx->pTable, 
15110 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  pLhs->iColumn);.
15120 20 20 20 20 69 66 28 20 61 66 66 21 3d 69 64 78      if( aff!=idx
15130 61 66 66 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  aff ) break;..  
15140 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
15150 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
15160 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
15170 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 69  hs, pRhs);.    i
15180 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 62 72  f( pColl==0 ) br
15190 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  eak;.    if( sql
151a0 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
151b0 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e  l->zName, pIdx->
151c0 61 7a 43 6f 6c 6c 5b 69 2b 6e 45 71 5d 29 20 29  azColl[i+nEq]) )
151d0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
151e0 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn i;.}../*.**
151f0 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74   Adjust the cost
15200 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d 75   C by the costMu
15210 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54 68  lt facter T.  Th
15220 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69  is only occurs i
15230 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69  f.** compiled wi
15240 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42  th -DSQLITE_ENAB
15250 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23  LE_COSTMULT.*/.#
15260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15270 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64  BLE_COSTMULT.# d
15280 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d  efine ApplyCostM
15290 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20 20  ultiplier(C,T)  
152a0 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64  C += T.#else.# d
152b0 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d  efine ApplyCostM
152c0 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a 23  ultiplier(C,T).#
152d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  endif../*.** We 
152e0 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63  have so far matc
152f0 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  hed pBuilder->pN
15300 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
15310 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a  terms of the .**
15320 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20 54   index pIndex. T
15330 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20  ry to match one 
15340 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  more..**.** When
15350 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
15360 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64  s called, pBuild
15370 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63  er->pNew->nOut c
15380 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20  ontains the .** 
15390 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
153a0 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76 69  xpected to be vi
153b0 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72 69  sited by filteri
153c0 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45 71  ng using the nEq
153d0 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e   .** terms only.
153e0 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66 69   If it is modifi
153f0 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20 69  ed, this value i
15400 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72  s restored befor
15410 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
15420 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ion returns..**.
15430 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 69 64  ** If pProbe->id
15440 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44  xType==SQLITE_ID
15450 58 54 59 50 45 5f 49 50 4b 2c 20 74 68 61 74 20  XTYPE_IPK, that 
15460 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20  means pIndex is 
15470 0a 2a 2a 20 61 20 66 61 6b 65 20 69 6e 64 65 78  .** a fake index
15480 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 49 4e   used for the IN
15490 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
154a0 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
154b0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
154c0 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  eeIndex(.  Where
154d0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
154e0 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68  ilder,     /* Th
154f0 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74  e WhereLoop fact
15500 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ory */.  struct 
15510 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
15520 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  rc,      /* FROM
15530 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
15540 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
15550 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20   Index *pProbe, 
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20   /* An index on 
15580 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  pSrc */.  LogEst
15590 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20   nInMul         
155a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67            /* log
155b0 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61  (Number of itera
155c0 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29  tions due to IN)
155d0 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
155e0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
155f0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20  ilder->pWInfo;  
15600 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65  /* WHERE analyse
15610 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
15620 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
15630 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
15640 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
15650 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
15660 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
15670 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
15680 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
15690 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65  ion malloc conte
156a0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
156b0 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
156c0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
156d0 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e  ate WhereLoop un
156e0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
156f0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
15700 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
15710 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65        /* A Where
15720 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69  Term under consi
15730 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  deration */.  in
15740 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20  t opMask;       
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15760 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73   Valid operators
15770 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
15780 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20   */.  WhereScan 
15790 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20  scan;           
157a0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
157b0 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d  r for WHERE term
157c0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73  s */.  Bitmask s
157d0 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20  aved_prereq;    
157e0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
157f0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
15800 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31  ->prereq */.  u1
15810 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20  6 saved_nLTerm; 
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15830 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
15840 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  of pNew->nLTerm 
15850 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
15860 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
15870 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
15880 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
15890 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20  u.btree.nEq */. 
158a0 20 75 31 36 20 73 61 76 65 64 5f 6e 42 74 6d 3b   u16 saved_nBtm;
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
158d0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
158e0 72 65 65 2e 6e 42 74 6d 20 2a 2f 0a 20 20 75 31  ree.nBtm */.  u1
158f0 36 20 73 61 76 65 64 5f 6e 54 6f 70 3b 20 20 20  6 saved_nTop;   
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15910 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
15920 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  of pNew->u.btree
15930 2e 6e 54 6f 70 20 2a 2f 0a 20 20 75 31 36 20 73  .nTop */.  u16 s
15940 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20  aved_nSkip;     
15950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
15960 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
15970 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20  pNew->nSkip */. 
15980 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61   u32 saved_wsFla
15990 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
159a0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
159b0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c  ue of pNew->wsFl
159c0 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ags */.  LogEst 
159d0 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20  saved_nOut;     
159e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
159f0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
15a00 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e  ew->nOut */.  in
15a10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15a30 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
15a40 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20    LogEst rSize; 
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
15a70 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
15a80 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
15a90 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
15aa0 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74        /* Logarit
15ab0 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65  hm of table size
15ac0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
15ad0 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d  *pTop = 0, *pBtm
15ae0 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64   = 0; /* Top and
15af0 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f   bottom range co
15b00 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20  nstraints */..  
15b10 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
15b20 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d  >pNew;.  if( db-
15b30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
15b40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
15b50 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 57 48 45 52  MEM_BKPT;.  WHER
15b60 45 54 52 41 43 45 28 30 78 38 30 30 2c 20 28 22  ETRACE(0x800, ("
15b70 42 45 47 49 4e 20 25 73 2e 61 64 64 42 74 72 65  BEGIN %s.addBtre
15b80 65 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64  eIdx(%s), nEq=%d
15b90 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
15ba0 20 20 20 20 20 20 20 20 20 20 70 50 72 6f 62 65            pProbe
15bb0 2d 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  ->pTable->zName,
15bc0 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 70  pProbe->zName, p
15bd0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
15be0 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  ));..  assert( (
15bf0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
15c00 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
15c10 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
15c20 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
15c30 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
15c40 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
15c50 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
15c60 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
15c70 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
15c80 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
15c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
15ca0 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  rt( pNew->u.btre
15cb0 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a 20 20 20  e.nBtm==0 );.   
15cc0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
15cd0 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_IN|WO_GT|WO_G
15ce0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  E|WO_LT|WO_LE|WO
15cf0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20  _ISNULL|WO_IS;. 
15d00 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d   }.  if( pProbe-
15d10 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70  >bUnordered ) op
15d20 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c  Mask &= ~(WO_GT|
15d30 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
15d40 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  E);..  assert( p
15d50 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
15d60 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
15d70 20 29 3b 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71   );..  saved_nEq
15d80 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   = pNew->u.btree
15d90 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 42  .nEq;.  saved_nB
15da0 74 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  tm = pNew->u.btr
15db0 65 65 2e 6e 42 74 6d 3b 0a 20 20 73 61 76 65 64  ee.nBtm;.  saved
15dc0 5f 6e 54 6f 70 20 3d 20 70 4e 65 77 2d 3e 75 2e  _nTop = pNew->u.
15dd0 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 20 20 73 61  btree.nTop;.  sa
15de0 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77  ved_nSkip = pNew
15df0 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64  ->nSkip;.  saved
15e00 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e  _nLTerm = pNew->
15e10 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f  nLTerm;.  saved_
15e20 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  wsFlags = pNew->
15e30 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64  wsFlags;.  saved
15e40 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e  _prereq = pNew->
15e50 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f  prereq;.  saved_
15e60 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  nOut = pNew->nOu
15e70 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65  t;.  pTerm = whe
15e80 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
15e90 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  , pBuilder->pWC,
15ea0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
15eb0 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20  saved_nEq,.     
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
15ee0 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  e);.  pNew->rSet
15ef0 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20  up = 0;.  rSize 
15f00 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
15f10 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67  ogEst[0];.  rLog
15f20 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
15f30 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63  ize);.  for(; rc
15f40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
15f50 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d  Term!=0; pTerm =
15f60 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
15f70 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20  scan)){.    u16 
15f80 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70  eOp = pTerm->eOp
15f90 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f  erator;   /* Sho
15fa0 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d  rthand for pTerm
15fb0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
15fc0 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49     LogEst rCostI
15fd0 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e  dx;.    LogEst n
15fe0 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20  OutUnadjusted;  
15ff0 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65        /* nOut be
16000 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48  fore IN() and WH
16010 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ERE adjustments 
16020 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d  */.    int nIn =
16030 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
16040 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20  E_ENABLE_STAT4. 
16050 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64     int nRecValid
16060 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
16070 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20  cValid;.#endif. 
16080 20 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f     if( (eOp==WO_
16090 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d  ISNULL || (pTerm
160a0 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56  ->wtFlags&TERM_V
160b0 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26  NULL)!=0).     &
160c0 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74  & indexColumnNot
160d0 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76  Null(pProbe, sav
160e0 65 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  ed_nEq).    ){. 
160f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
16100 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54  * ignore IS [NOT
16110 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  ] NULL constrain
16120 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63  ts on NOT NULL c
16130 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a  olumns */.    }.
16140 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
16150 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
16160 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
16170 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
16180 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65  Do not allow the
16190 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
161a0 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  a LIKE optimizat
161b0 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ion range constr
161c0 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  aint.    ** to m
161d0 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20  ix with a lower 
161e0 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d  range bound from
161f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72   some other sour
16200 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  ce */.    if( pT
16210 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
16220 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70  ERM_LIKEOPT && p
16230 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
16240 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75  =WO_LT ) continu
16250 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  e;..    /* Do no
16260 74 20 61 6c 6c 6f 77 20 63 6f 6e 73 74 72 61 69  t allow constrai
16270 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45  nts from the WHE
16280 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
16290 75 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  used by the.    
162a0 2a 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  ** right table o
162b0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
162c0 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  Only constraints
162d0 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
162e0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c  e are.    ** all
162f0 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  owed */.    if( 
16300 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
16310 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
16320 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
16330 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
16340 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
16350 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  oin).    ){.    
16360 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
16370 7d 0a 0a 20 20 20 20 69 66 28 20 49 73 55 6e 69  }..    if( IsUni
16380 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29  queIndex(pProbe)
16390 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70   && saved_nEq==p
163a0 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31  Probe->nKeyCol-1
163b0 20 29 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64   ){.      pBuild
163c0 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20  er->bldFlags |= 
163d0 53 51 4c 49 54 45 5f 42 4c 44 46 5f 55 4e 49 51  SQLITE_BLDF_UNIQ
163e0 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  UE;.    }else{. 
163f0 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62       pBuilder->b
16400 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ldFlags |= SQLIT
16410 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44 3b 0a  E_BLDF_INDEXED;.
16420 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
16430 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
16440 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
16450 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
16460 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
16470 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
16480 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b  tm = saved_nBtm;
16490 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
164a0 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f  ee.nTop = saved_
164b0 6e 54 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nTop;.    pNew->
164c0 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
164d0 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77  LTerm;.    if( w
164e0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
164f0 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
16500 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
16510 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
16520 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
16530 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70  w->nLTerm++] = p
16540 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Term;.    pNew->
16550 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f  prereq = (saved_
16560 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e  prereq | pTerm->
16570 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e  prereqRight) & ~
16580 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
16590 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e  .    assert( nIn
165a0 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c  Mul==0.        |
165b0 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
165c0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
165d0 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20  NULL)!=0 .      
165e0 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
165f0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
16600 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20  MN_IN)!=0 .     
16610 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
16620 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
16630 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29  PSCAN)!=0 .    )
16640 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26  ;..    if( eOp &
16650 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
16660 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
16670 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
16680 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
16690 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
166a0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
166b0 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
166c0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
166d0 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
166e0 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
166f0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  s */.        int
16700 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   i;.        nIn 
16710 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
16720 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
16730 28 32 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  (25) );..       
16740 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
16750 6f 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20  on may actually 
16760 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28  be of the form (
16770 78 2c 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54  x, y) IN (SELECT
16780 2e 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ...)..        **
16790 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
167a0 65 72 65 20 69 73 20 61 20 73 65 70 61 72 61 74  ere is a separat
167b0 65 20 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20  e term for each 
167c0 6f 66 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a  of (x) and (y)..
167d0 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
167e0 65 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74  er, the nIn mult
167f0 69 70 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e  iplier should on
16800 6c 79 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e  ly be applied on
16810 63 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20  ce, not once.   
16820 20 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68       ** for each
16830 20 73 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20   such term. The 
16840 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63  following loop c
16850 68 65 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d  hecks that pTerm
16860 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   is the.        
16870 2a 2a 20 66 69 72 73 74 20 73 75 63 68 20 74 65  ** first such te
16880 72 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73  rm in use, and s
16890 65 74 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20  ets nIn back to 
168a0 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20  0 if it is not. 
168b0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
168c0 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65  =0; i<pNew->nLTe
168d0 72 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rm-1; i++){.    
168e0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
168f0 61 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65  aLTerm[i] && pNe
16900 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45  w->aLTerm[i]->pE
16910 78 70 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e  xpr==pExpr ) nIn
16920 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
16930 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
16940 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
16950 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e  pList && pExpr->
16960 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  x.pList->nExpr) 
16970 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
16980 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
16990 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20  e, ...)" */.    
169a0 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65      nIn = sqlite
169b0 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78  3LogEst(pExpr->x
169c0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  .pList->nExpr);.
169d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
169e0 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53  nIn>0 );  /* RHS
169f0 20 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72   always has 2 or
16a00 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20   more terms...  
16a10 54 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20  The parser.     
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20       ** changes 
16a40 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20  "x IN (?)" into 
16a50 22 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20 20  "x=?". */.      
16a60 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f  }.      if( pPro
16a70 62 65 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a  be->hasStat1 ){.
16a80 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 4d          LogEst M
16a90 2c 20 6c 6f 67 4b 2c 20 73 61 66 65 74 79 4d 61  , logK, safetyMa
16aa0 72 67 69 6e 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rgin;.        /*
16ab0 20 4c 65 74 3a 0a 20 20 20 20 20 20 20 20 2a 2a   Let:.        **
16ac0 20 20 20 4e 20 3d 20 74 68 65 20 74 6f 74 61 6c     N = the total
16ad0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16ae0 69 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  in the table.   
16af0 20 20 20 20 20 2a 2a 20 20 20 4b 20 3d 20 74 68       **   K = th
16b00 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
16b10 69 65 73 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ies on the RHS o
16b20 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
16b30 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 4d  r.        **   M
16b40 20 3d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   = the number of
16b50 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
16b60 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  le that match te
16b70 72 6d 73 20 74 6f 20 74 68 65 20 0a 20 20 20 20  rms to the .    
16b80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74 6f 20      **       to 
16b90 74 68 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20  the left in the 
16ba0 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 49 66 20  same index.  If 
16bb0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
16bc0 69 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  is on.        **
16bd0 20 20 20 20 20 20 20 74 68 65 20 6c 65 66 74 2d         the left-
16be0 6d 6f 73 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d  most index colum
16bf0 6e 2c 20 4d 3d 3d 4e 2e 0a 20 20 20 20 20 20 20  n, M==N..       
16c00 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
16c10 69 76 65 6e 20 74 68 65 20 64 65 66 69 6e 69 74  iven the definit
16c20 69 6f 6e 73 20 61 62 6f 76 65 2c 20 69 74 20 69  ions above, it i
16c30 73 20 62 65 74 74 65 72 20 74 6f 20 6f 6d 69 74  s better to omit
16c40 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16c50 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  .        ** from
16c60 20 74 68 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75   the index looku
16c70 70 20 61 6e 64 20 69 6e 73 74 65 61 64 20 64 6f  p and instead do
16c80 20 61 20 73 63 61 6e 20 6f 66 20 74 68 65 20 4d   a scan of the M
16c90 20 65 6c 65 6d 65 6e 74 73 2c 0a 20 20 20 20 20   elements,.     
16ca0 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 65 61     ** testing ea
16cb0 63 68 20 73 63 61 6e 6e 65 64 20 72 6f 77 20 61  ch scanned row a
16cc0 67 61 69 6e 73 74 20 74 68 65 20 49 4e 20 6f 70  gainst the IN op
16cd0 65 72 61 74 6f 72 20 73 65 70 61 72 61 74 65 6c  erator separatel
16ce0 79 2c 20 69 66 3a 0a 20 20 20 20 20 20 20 20 2a  y, if:.        *
16cf0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  *.        **    
16d00 20 20 20 20 4d 2a 6c 6f 67 28 4b 29 20 3c 20 4b      M*log(K) < K
16d10 2a 6c 6f 67 28 4e 29 0a 20 20 20 20 20 20 20 20  *log(N).        
16d20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 75  **.        ** Ou
16d30 72 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20  r estimates for 
16d40 4d 2c 20 4b 2c 20 61 6e 64 20 4e 20 6d 69 67 68  M, K, and N migh
16d50 74 20 62 65 20 69 6e 61 63 63 75 72 61 74 65 2c  t be inaccurate,
16d60 20 73 6f 20 77 65 20 62 75 69 6c 64 20 69 6e 0a   so we build in.
16d70 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 61 66          ** a saf
16d80 65 74 79 20 6d 61 72 67 69 6e 20 6f 66 20 32 20  ety margin of 2 
16d90 28 4c 6f 67 45 73 74 3a 20 31 30 29 20 74 68 61  (LogEst: 10) tha
16da0 74 20 66 61 76 6f 72 73 20 75 73 69 6e 67 20 74  t favors using t
16db0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20  he IN operator. 
16dc0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
16dd0 68 65 20 69 6e 64 65 78 2c 20 61 73 20 75 73 69  he index, as usi
16de0 6e 67 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20  ng an index has 
16df0 62 65 74 74 65 72 20 77 6f 72 73 74 2d 63 61 73  better worst-cas
16e00 65 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20  e behavior..    
16e10 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20      ** If we do 
16e20 6e 6f 74 20 68 61 76 65 20 72 65 61 6c 20 73 71  not have real sq
16e30 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 2c  lite_stat1 data,
16e40 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 74   always prefer t
16e50 6f 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  o use.        **
16e60 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
16e70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d      */.        M
16e80 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
16e90 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
16ea0 5d 3b 0a 20 20 20 20 20 20 20 20 6c 6f 67 4b 20  ];.        logK 
16eb0 3d 20 65 73 74 4c 6f 67 28 6e 49 6e 29 3b 0a 20  = estLog(nIn);. 
16ec0 20 20 20 20 20 20 20 73 61 66 65 74 79 4d 61 72         safetyMar
16ed0 67 69 6e 20 3d 20 31 30 3b 20 20 2f 2a 20 54 55  gin = 10;  /* TU
16ee0 4e 49 4e 47 3a 20 65 78 74 72 61 20 77 65 69 67  NING: extra weig
16ef0 68 74 20 66 6f 72 20 69 6e 64 65 78 65 64 20 49  ht for indexed I
16f00 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  N */.        if(
16f10 20 4d 20 2b 20 6c 6f 67 4b 20 2b 20 73 61 66 65   M + logK + safe
16f20 74 79 4d 61 72 67 69 6e 20 3c 20 6e 49 6e 20 2b  tyMargin < nIn +
16f30 20 72 4c 6f 67 53 69 7a 65 20 29 7b 0a 20 20 20   rLogSize ){.   
16f40 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
16f50 45 28 30 78 34 30 2c 0a 20 20 20 20 20 20 20 20  E(0x40,.        
16f60 20 20 20 20 28 22 53 63 61 6e 20 70 72 65 66 65      ("Scan prefe
16f70 72 72 65 64 20 6f 76 65 72 20 49 4e 20 6f 70 65  rred over IN ope
16f80 72 61 74 6f 72 20 6f 6e 20 63 6f 6c 75 6d 6e 20  rator on column 
16f90 25 64 20 6f 66 20 5c 22 25 73 5c 22 20 28 25 64  %d of \"%s\" (%d
16fa0 3c 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  <%d)\n",.       
16fb0 20 20 20 20 20 20 73 61 76 65 64 5f 6e 45 71 2c        saved_nEq,
16fc0 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20   pProbe->zName, 
16fd0 4d 2b 6c 6f 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72  M+logK+10, nIn+r
16fe0 4c 6f 67 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  LogSize));.     
16ff0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
17000 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
17010 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
17020 43 45 28 30 78 34 30 2c 0a 20 20 20 20 20 20 20  CE(0x40,.       
17030 20 20 20 20 20 28 22 49 4e 20 6f 70 65 72 61 74       ("IN operat
17040 6f 72 20 70 72 65 66 65 72 72 65 64 20 6f 6e 20  or preferred on 
17050 63 6f 6c 75 6d 6e 20 25 64 20 6f 66 20 5c 22 25  column %d of \"%
17060 73 5c 22 20 28 25 64 3e 3d 25 64 29 5c 6e 22 2c  s\" (%d>=%d)\n",
17070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61  .             sa
17080 76 65 64 5f 6e 45 71 2c 20 70 50 72 6f 62 65 2d  ved_nEq, pProbe-
17090 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31  >zName, M+logK+1
170a0 30 2c 20 6e 49 6e 2b 72 4c 6f 67 53 69 7a 65 29  0, nIn+rLogSize)
170b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
170c0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
170d0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
170e0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20  E_COLUMN_IN;.   
170f0 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
17100 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29   (WO_EQ|WO_IS) )
17110 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
17120 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
17130 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a  umn[saved_nEq];.
17140 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
17150 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
17160 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73  UMN_EQ;.      as
17170 73 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d  sert( saved_nEq=
17180 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  =pNew->u.btree.n
17190 45 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Eq );.      if( 
171a0 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a  iCol==XN_ROWID .
171b0 20 20 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e         || (iCol>
171c0 3d 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20  =0 && nInMul==0 
171d0 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50  && saved_nEq==pP
171e0 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29  robe->nKeyCol-1)
171f0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
17200 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52    if( iCol==XN_R
17210 4f 57 49 44 20 7c 7c 20 70 50 72 6f 62 65 2d 3e  OWID || pProbe->
17220 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 0a 20 20 20  uniqNotNull .   
17230 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65        || (pProbe
17240 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
17250 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 20  pProbe->onError 
17260 26 26 20 65 4f 70 3d 3d 57 4f 5f 45 51 29 20 0a  && eOp==WO_EQ) .
17270 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
17280 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
17290 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
172a0 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OW;.        }els
172b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
172c0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
172d0 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a  ERE_UNQ_WANTED;.
172e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
172f0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
17300 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
17310 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
17320 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
17330 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20  COLUMN_NULL;.   
17340 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
17350 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29   (WO_GT|WO_GE) )
17360 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
17370 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b  ( eOp & WO_GT );
17380 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17390 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a   eOp & WO_GE );.
173a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
173b0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
173c0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
173d0 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
173e0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
173f0 42 74 6d 20 3d 20 77 68 65 72 65 52 61 6e 67 65  Btm = whereRange
17400 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20  VectorLen(.     
17410 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72       pParse, pSr
17420 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f  c->iCursor, pPro
17430 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70  be, saved_nEq, p
17440 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20  Term.      );.  
17450 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d      pBtm = pTerm
17460 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30  ;.      pTop = 0
17470 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
17480 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
17490 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20  M_LIKEOPT ){.   
174a0 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f       /* Range co
174b0 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f  ntraints that co
174c0 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45  me from the LIKE
174d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72   optimization ar
174e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  e.        ** alw
174f0 61 79 73 20 75 73 65 64 20 69 6e 20 70 61 69 72  ays used in pair
17500 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  s. */.        pT
17510 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a  op = &pTerm[1];.
17520 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17530 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57  (pTop-(pTerm->pW
17540 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57  C->a))<pTerm->pW
17550 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20  C->nTerm );.    
17560 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
17570 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
17580 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20  _LIKEOPT );.    
17590 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
175a0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
175b0 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LT );.        if
175c0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
175d0 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
175e0 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
175f0 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
17600 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
17610 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
17620 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20  ++] = pTop;.    
17630 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
17640 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
17650 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 70 4e  IMIT;.        pN
17660 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70  ew->u.btree.nTop
17670 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
17680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
17690 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f  ssert( eOp & (WO
176a0 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20  _LT|WO_LE) );.  
176b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
176c0 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20  p & WO_LT );.   
176d0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
176e0 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
176f0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
17700 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
17710 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f  RANGE|WHERE_TOP_
17720 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65  LIMIT;.      pNe
17730 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
17740 3d 20 77 68 65 72 65 52 61 6e 67 65 56 65 63 74  = whereRangeVect
17750 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20  orLen(.         
17760 20 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69   pParse, pSrc->i
17770 43 75 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20  Cursor, pProbe, 
17780 73 61 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d  saved_nEq, pTerm
17790 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
177a0 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
177b0 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
177c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
177d0 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
177e0 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
177f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
17800 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
17810 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a  -2] : 0;.    }..
17820 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
17830 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  oint pNew->nOut 
17840 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
17850 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
17860 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  ected to.    ** 
17870 62 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68  be visited by th
17880 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66  e index scan bef
17890 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ore considering 
178a0 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74  term pTerm, or t
178b0 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
178c0 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d   of nIn and nInM
178d0 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ul. In other wor
178e0 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ds, assuming tha
178f0 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78  t all .    ** "x
17900 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20   IN(...)" terms 
17910 61 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74  are replaced wit
17920 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20  h "x = ?". This 
17930 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20  block updates.  
17940 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
17950 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20  f pNew->nOut to 
17960 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72  account for pTer
17970 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e  m (but not nIn/n
17980 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20  InMul).  */.    
17990 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
179a0 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
179b0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ;.    if( pNew->
179c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
179d0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
179e0 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
179f0 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 34  nOut using stat4
17a00 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68   data. Or, if th
17a10 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 34 0a  ere is no stat4.
17a20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75        ** data, u
17a30 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20  sing some other 
17a40 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20  estimate.  */.  
17a50 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63      whereRangeSc
17a60 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
17a70 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54  uilder, pBtm, pT
17a80 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d  op, pNew);.    }
17a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
17aa0 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e  nEq = ++pNew->u.
17ab0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20  btree.nEq;.     
17ac0 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
17ad0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c  WO_ISNULL|WO_EQ|
17ae0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a  WO_IN|WO_IS) );.
17af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17b00 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
17b10 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69  _nOut );.      i
17b20 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
17b30 72 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65  rob<=0 && pProbe
17b40 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64  ->aiColumn[saved
17b50 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20  _nEq]>=0 ){.    
17b60 20 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70      assert( (eOp
17b70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e   & WO_IN) || nIn
17b80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
17b90 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
17ba0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IN );.        
17bb0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54  pNew->nOut += pT
17bc0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
17bd0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
17be0 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20  ut -= nIn;.     
17bf0 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
17c00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17c10 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63  T4.        tRowc
17c20 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20  nt nOut = 0;.   
17c30 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d       if( nInMul=
17c40 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
17c50 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20  pProbe->nSample 
17c60 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65  .         && pNe
17c70 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d  w->u.btree.nEq<=
17c80 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43  pProbe->nSampleC
17c90 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ol.         && (
17ca0 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  (eOp & WO_IN)==0
17cb0 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
17cc0 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
17cd0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
17ce0 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  ).         && Op
17cf0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
17d00 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61  d(db, SQLITE_Sta
17d10 74 34 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  t4).        ){. 
17d20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
17d30 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
17d40 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
17d50 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51  f( (eOp & (WO_EQ
17d60 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
17d70 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
17d80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
17d90 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  Op & WO_EQ );.  
17da0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
17db0 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20  se( eOp & WO_IS 
17dc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
17dd0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
17de0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
17df0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
17e00 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
17e10 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
17e20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
17e30 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &nOut);.        
17e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17e50 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49       rc = whereI
17e60 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  nScanEst(pParse,
17e70 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
17e80 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74  ->x.pList, &nOut
17e90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
17ea0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
17eb0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
17ec0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
17ed0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
17ee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17ef0 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20   break;         
17f00 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20   /* Jump out of 
17f10 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a  the pTerm loop *
17f20 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
17f30 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  nOut ){.        
17f40 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
17f50 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e   sqlite3LogEst(n
17f60 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
17f70 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74    if( pNew->nOut
17f80 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e  >saved_nOut ) pN
17f90 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
17fa0 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  _nOut;.         
17fb0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
17fc0 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   nIn;.          
17fd0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17fe0 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20      if( nOut==0 
17ff0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ).#endif.       
18000 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65   {.          pNe
18010 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f  w->nOut += (pPro
18020 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
18030 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
18040 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31  iRowLogEst[nEq-1
18050 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
18060 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
18070 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
18080 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74   /* TUNING: If t
18090 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c  here is no likel
180a0 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61  ihood() value, a
180b0 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20  ssume that a .  
180c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f            ** "co
180d0 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65  l IS NULL" expre
180e0 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77  ssion matches tw
180f0 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73  ice as many rows
18100 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
18110 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a   as (col=?). */.
18120 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
18130 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20  ->nOut += 10;.  
18140 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18150 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18160 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43  }..    /* Set rC
18170 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f  ostIdx to the co
18180 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73  st of visiting s
18190 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20  elected rows in 
181a0 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a  index. Add.    *
181b0 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52  * it to pNew->rR
181c0 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75 72  un, which is cur
181d0 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68  rently set to th
181e0 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e  e cost of the in
181f0 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20  dex.    ** seek 
18200 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74  only. Then, if t
18210 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76  his is a non-cov
18220 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64  ering index, add
18230 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20   the cost of.   
18240 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65   ** visiting the
18250 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
18260 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  n table.  */.   
18270 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 70   assert( pSrc->p
18280 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3e 30 20  Tab->szTabRow>0 
18290 29 3b 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20  );.    rCostIdx 
182a0 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  = pNew->nOut + 1
182b0 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
182c0 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70  zIdxRow)/pSrc->p
182d0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
182e0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
182f0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
18300 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74  (rLogSize, rCost
18310 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70  Idx);.    if( (p
18320 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
18330 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
18340 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
18350 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
18360 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
18370 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
18380 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36   pNew->nOut + 16
18390 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70  );.    }.    App
183a0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
183b0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72  (pNew->rRun, pPr
183c0 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73  obe->pTable->cos
183d0 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75  tMult);..    nOu
183e0 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e  tUnadjusted = pN
183f0 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ew->nOut;.    pN
18400 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d  ew->rRun += nInM
18410 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e  ul + nIn;.    pN
18420 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d  ew->nOut += nInM
18430 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68  ul + nIn;.    wh
18440 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
18450 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
18460 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
18470 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
18480 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
18490 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
184a0 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
184b0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
184c0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
184d0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
184e0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
184f0 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
18500 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
18510 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
18520 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
18530 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
18540 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
18550 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
18560 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
18570 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
18580 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
18590 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
185a0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
185b0 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
185c0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
185d0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
185e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
185f0 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 20 20  NABLE_STAT4.    
18600 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
18610 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
18620 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e  .#endif.  }.  pN
18630 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76  ew->prereq = sav
18640 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65  ed_prereq;.  pNe
18650 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
18660 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e   saved_nEq;.  pN
18670 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
18680 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20   = saved_nBtm;. 
18690 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
186a0 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70  Top = saved_nTop
186b0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20  ;.  pNew->nSkip 
186c0 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
186d0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
186e0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
186f0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
18700 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
18710 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
18720 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20  d_nLTerm;..  /* 
18730 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61  Consider using a
18740 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68   skip-scan if th
18750 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
18760 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
18770 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  nts.  ** availab
18780 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d  le for the left-
18790 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68  most terms of th
187a0 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20  e index, and if 
187b0 74 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a  the average.  **
187c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61   number of repea
187d0 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ts in the left-m
187e0 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20  ost terms is at 
187f0 6c 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a  least 18. .  **.
18800 20 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e    ** The magic n
18810 75 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65  umber 18 is sele
18820 63 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69  cted on the basi
18830 73 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20  s that scanning 
18840 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20  17 rows.  ** is 
18850 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75  almost always qu
18860 69 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e  icker than an in
18870 64 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74  dex seek (even t
18880 68 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64  hough if the ind
18890 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  ex.  ** contains
188a0 20 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37   fewer than 2^17
188b0 20 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20   rows we assume 
188c0 6f 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68  otherwise in oth
188d0 65 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a  er parts of.  **
188e0 20 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c   the code). And,
188f0 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e   even if it is n
18900 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f  ot, it should no
18910 74 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c  t be too much sl
18920 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74  ower. .  ** On t
18930 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
18940 68 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63  he extra seeks c
18950 6f 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e  ould end up bein
18960 67 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  g significantly.
18970 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73    ** more expens
18980 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ive.  */.  asser
18990 74 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 42==sqlite3Lo
189a0 67 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66  gEst(18) );.  if
189b0 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76  ( saved_nEq==sav
189c0 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73  ed_nSkip.   && s
189d0 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62  aved_nEq+1<pProb
189e0 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26  e->nKeyCol.   &&
189f0 20 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53   pProbe->noSkipS
18a00 63 61 6e 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74  can==0.   && Opt
18a10 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
18a20 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 6b 69 70  (db, SQLITE_Skip
18a30 53 63 61 6e 29 0a 20 20 20 26 26 20 70 50 72 6f  Scan).   && pPro
18a40 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
18a50 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32  saved_nEq+1]>=42
18a60 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e    /* TUNING: Min
18a70 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63  imum for skip-sc
18a80 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20  an */.   && (rc 
18a90 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  = whereLoopResiz
18aa0 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
18ab0 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51  ->nLTerm+1))==SQ
18ac0 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
18ad0 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20   LogEst nIter;. 
18ae0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
18af0 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  .nEq++;.    pNew
18b00 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70  ->nSkip++;.    p
18b10 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
18b20 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b  ->nLTerm++] = 0;
18b30 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
18b40 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50  gs |= WHERE_SKIP
18b50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20  SCAN;.    nIter 
18b60 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
18b70 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d  ogEst[saved_nEq]
18b80 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
18b90 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
18ba0 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  +1];.    pNew->n
18bb0 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20  Out -= nIter;.  
18bc0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65    /* TUNING:  Be
18bd0 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74  cause uncertaint
18be0 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d  ies in the estim
18bf0 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63  ates for skip-sc
18c00 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20  an queries,.    
18c10 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66  ** add a 1.375 f
18c20 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d  udge factor to m
18c30 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c  ake skip-scan sl
18c40 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65  ightly less like
18c50 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72  ly. */.    nIter
18c60 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65   += 5;.    where
18c70 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
18c80 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
18c90 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
18ca0 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
18cb0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
18cc0 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77  d_nOut;.    pNew
18cd0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
18ce0 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
18cf0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
18d00 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e  ed_nSkip;.    pN
18d10 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
18d20 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d  ved_wsFlags;.  }
18d30 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ..  WHERETRACE(0
18d40 78 38 30 30 2c 20 28 22 45 4e 44 20 25 73 2e 61  x800, ("END %s.a
18d50 64 64 42 74 72 65 65 49 64 78 28 25 73 29 2c 20  ddBtreeIdx(%s), 
18d60 6e 45 71 3d 25 64 2c 20 72 63 3d 25 64 5c 6e 22  nEq=%d, rc=%d\n"
18d70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18d80 20 20 20 20 20 20 20 20 70 50 72 6f 62 65 2d 3e          pProbe->
18d90 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 70  pTable->zName, p
18da0 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 73 61  Probe->zName, sa
18db0 76 65 64 5f 6e 45 71 2c 20 72 63 29 29 3b 0a 20  ved_nEq, rc));. 
18dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18dd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65  *.** Return True
18de0 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
18df0 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d  le that pIndex m
18e00 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69  ight be useful i
18e10 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  n.** implementin
18e20 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
18e30 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65  lause in pBuilde
18e40 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
18e50 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65  False if pBuilde
18e60 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  r does not conta
18e70 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
18e80 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74  lause or.** if t
18e90 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
18ea0 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20  or pIndex to be 
18eb0 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d  useful in implem
18ec0 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f  enting that.** O
18ed0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
18ee0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
18ef0 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
18f00 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
18f10 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
18f20 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a  ilder,.  Index *
18f30 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43  pIndex,.  int iC
18f40 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c  ursor.){.  ExprL
18f50 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72  ist *pOB;.  Expr
18f60 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a  List *aColExpr;.
18f70 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
18f80 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
18f90 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
18fa0 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
18fb0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
18fc0 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
18fd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
18fe0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
18ff0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
19000 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
19010 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
19020 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28  ollateAndLikely(
19030 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pOB->a[ii].pExpr
19040 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
19050 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
19060 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
19070 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
19080 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
19090 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
190a0 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   1;.      for(jj
190b0 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
190c0 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  KeyCol; jj++){. 
190d0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
190e0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ->iColumn==pInde
190f0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20  x->aiColumn[jj] 
19100 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
19110 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
19120 28 20 28 61 43 6f 6c 45 78 70 72 20 3d 20 70 49  ( (aColExpr = pI
19130 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21  ndex->aColExpr)!
19140 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
19150 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
19160 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b  >nKeyCol; jj++){
19170 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
19180 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
19190 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e  ]!=XN_EXPR ) con
191a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
191b0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
191c0 6d 70 61 72 65 53 6b 69 70 28 70 45 78 70 72 2c  mpareSkip(pExpr,
191d0 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e  aColExpr->a[jj].
191e0 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d  pExpr,iCursor)==
191f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
19200 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
19210 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
19220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
19230 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
19240 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
19250 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
19260 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
19270 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
19280 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
19290 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
192a0 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
192b0 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
192c0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
192d0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
192e0 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
192f0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
19300 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
19310 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
19320 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 50 61 72  rm *pTerm;.  Par
19330 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
19340 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
19350 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72  ;.  while( pWher
19360 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  e->op==TK_AND ){
19370 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65 55  .    if( !whereU
19380 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
19390 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72  x(iTab,pWC,pWher
193a0 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  e->pLeft) ) retu
193b0 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65  rn 0;.    pWhere
193c0 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68   = pWhere->pRigh
193d0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  t;.  }.  if( pPa
193e0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
193f0 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
19400 53 47 20 29 20 70 50 61 72 73 65 20 3d 20 30 3b  SG ) pParse = 0;
19410 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
19420 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
19430 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
19440 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
19450 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
19460 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28  pExpr;.    if( (
19470 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
19480 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
19490 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69  oin) || pExpr->i
194a0 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
194b0 69 54 61 62 29 0a 20 20 20 20 20 26 26 20 73 71  iTab).     && sq
194c0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
194d0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
194e0 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
194f0 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
19500 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
19510 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
19520 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
19530 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
19540 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ts for a single 
19550 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
19560 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  n where the tabl
19570 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69 66 69  e.** is identifi
19580 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
19590 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
195a0 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
195b0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
195c0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
195d0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
195e0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
195f0 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
19600 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
19610 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
19620 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
19630 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
19640 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
19650 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
19660 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
19670 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
19680 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
19690 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
196a0 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
196b0 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
196c0 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
196d0 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
196e0 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
19710 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
19720 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
19730 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
19740 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
19750 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
19760 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
19770 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
19780 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
19790 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
197a0 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
197b0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
197c0 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
197d0 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
197e0 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
197f0 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
19800 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
19810 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19820 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
19830 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
19840 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
19850 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19860 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
19870 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
19880 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
19890 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
198a0 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
198b0 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
198c0 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
198d0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
198e0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
198f0 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
19900 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
19910 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
19920 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
19930 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
19940 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
19950 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
19960 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
19970 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
19980 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
19990 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
199a0 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
199b0 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
199c0 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
199d0 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
199e0 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
199f0 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
19a00 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
19a10 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
19a20 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
19a30 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
19a40 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
19a50 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
19a60 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
19a70 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
19a80 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
19a90 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
19aa0 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
19ab0 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
19ac0 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
19ad0 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
19ae0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
19af0 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
19b00 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
19b10 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
19b20 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
19b30 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
19b40 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
19b50 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
19b60 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
19b70 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
19b80 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
19b90 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
19ba0 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
19bb0 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
19bc0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
19bd0 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
19be0 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
19bf0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
19c00 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
19c10 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
19c20 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
19c30 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
19c40 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   */.  Bitmask mP
19c50 72 65 72 65 71 20 20 20 20 20 20 20 20 20 20 20  rereq           
19c60 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
19c70 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
19c80 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
19c90 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
19ca0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
19cb0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
19cc0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
19cd0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19cf0 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
19d00 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
19d10 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
19d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19d30 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
19d40 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
19d50 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
19d60 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
19d70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
19d80 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
19d90 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
19da0 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
19db0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
19dc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
19dd0 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
19de0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
19df0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
19e00 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
19e10 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
19e20 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
19e30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
19e40 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
19e50 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
19e60 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
19e70 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
19e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
19e90 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
19ea0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
19eb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
19ec0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
19ed0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
19ee0 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
19ef0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19f00 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
19f10 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
19f20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
19f30 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
19f40 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f60 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
19f70 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
19f80 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
19f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19fa0 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
19fb0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
19fc0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
19fd0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
19fe0 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
19ff0 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
1a000 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
1a010 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
1a020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1a030 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
1a040 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
1a050 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
1a060 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
1a070 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
1a080 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1a090 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
1a0a0 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
1a0b0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
1a0c0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
1a0d0 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
1a0e0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
1a0f0 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
1a100 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
1a110 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49    if( pSrc->pIBI
1a120 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
1a130 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
1a140 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
1a150 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
1a160 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
1a170 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
1a180 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  BIndex;.  }else 
1a190 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
1a1a0 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
1a1b0 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
1a1c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1a1d0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
1a1e0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
1a1f0 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
1a200 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
1a210 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
1a220 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
1a230 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
1a240 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
1a250 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
1a260 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
1a270 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
1a280 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
1a290 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
1a2a0 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
1a2b0 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
1a2c0 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
1a2d0 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a2f0 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
1a300 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
1a310 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
1a320 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
1a330 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
1a340 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
1a350 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
1a360 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
1a370 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
1a380 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
1a390 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
1a3a0 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
1a3b0 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
1a3c0 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
1a3d0 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
1a3e0 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
1a3f0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
1a400 20 73 50 6b 2e 69 64 78 54 79 70 65 20 3d 20 53   sPk.idxType = S
1a410 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 49 50  QLITE_IDXTYPE_IP
1a420 4b 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  K;.    aiRowEstP
1a430 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  k[0] = pTab->nRo
1a440 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52  wLogEst;.    aiR
1a450 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a  owEstPk[1] = 0;.
1a460 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
1a470 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
1a480 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 66  .    if( pSrc->f
1a490 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
1a4a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1a4b0 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20  real indices of 
1a4c0 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e  the table are on
1a4d0 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66  ly considered if
1a4e0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f   the.      ** NO
1a4f0 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66  T INDEXED qualif
1a500 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ier is omitted f
1a510 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  rom the FROM cla
1a520 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b  use */.      sPk
1a530 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b  .pNext = pFirst;
1a540 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62  .    }.    pProb
1a550 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20  e = &sPk;.  }.  
1a560 72 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52  rSize = pTab->nR
1a570 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67  owLogEst;.  rLog
1a580 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
1a590 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ize);..#ifndef S
1a5a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
1a5b0 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20  ATIC_INDEX.  /* 
1a5c0 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  Automatic indexe
1a5d0 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69  s */.  if( !pBui
1a5e0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 20 20 20  lder->pOrSet    
1a5f0 20 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66    /* Not part of
1a600 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74   an OR optimizat
1a610 69 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57  ion */.   && (pW
1a620 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1a630 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
1a640 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20 26 26 20  LAUSE)==0.   && 
1a650 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
1a660 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1a670 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d  ITE_AutoIndex)!=
1a680 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49  0.   && pSrc->pI
1a690 42 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 2f  BIndex==0      /
1a6a0 2a 20 48 61 73 20 6e 6f 20 49 4e 44 45 58 45 44  * Has no INDEXED
1a6b0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1a6c0 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f   && !pSrc->fg.no
1a6d0 74 49 6e 64 65 78 65 64 20 20 20 2f 2a 20 48 61  tIndexed   /* Ha
1a6e0 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44  s no NOT INDEXED
1a6f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26   clause */.   &&
1a700 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1a710 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57          /* Not W
1a720 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
1a730 6c 65 2e 20 28 46 49 58 4d 45 3a 20 57 68 79 20  le. (FIXME: Why 
1a740 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21  not?) */.   && !
1a750 70 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65  pSrc->fg.isCorre
1a760 6c 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63  lated /* Not a c
1a770 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
1a780 72 79 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72  ry */.   && !pSr
1a790 63 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  c->fg.isRecursiv
1a7a0 65 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75  e  /* Not a recu
1a7b0 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62  rsive common tab
1a7c0 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a  le expression. *
1a7d0 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65  /.  ){.    /* Ge
1a7e0 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65  nerate auto-inde
1a7f0 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a  x WhereLoops */.
1a800 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1a810 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54  Term;.    WhereT
1a820 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57  erm *pWCEnd = pW
1a830 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
1a840 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  m;.    for(pTerm
1a850 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c  =pWC->a; rc==SQL
1a860 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c  ITE_OK && pTerm<
1a870 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
1a880 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
1a890 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
1a8a0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
1a8b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1a8c0 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
1a8d0 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
1a8e0 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Src, 0) ){.     
1a8f0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
1a900 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
1a910 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
1a920 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
1a930 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
1a940 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
1a950 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
1a960 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
1a970 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
1a980 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
1a990 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74  G: One-time cost
1a9a0 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74   for computing t
1a9b0 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
1a9c0 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  ex is.        **
1a9d0 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65   estimated to be
1a9e0 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65   X*N*log2(N) whe
1a9f0 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
1aa00 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20  er of rows in.  
1aa10 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62        ** the tab
1aa20 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
1aa30 20 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20   and where X is 
1aa40 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f  7 (LogEst=28) fo
1aa50 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20  r normal.       
1aa60 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 30 2e   ** tables or 0.
1aa70 35 20 28 4c 6f 67 45 73 74 3d 2d 31 30 29 20 66  5 (LogEst=-10) f
1aa80 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  or views and sub
1aa90 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61  queries.  The va
1aaa0 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  lue.        ** o
1aab0 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66  f X is smaller f
1aac0 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  or views and sub
1aad0 71 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20  queries so that 
1aae0 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
1aaf0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c  r.        ** wil
1ab00 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73  l be more aggres
1ab10 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72  sive about gener
1ab20 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20  ating automatic 
1ab30 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20  indexes for.    
1ab40 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a      ** those obj
1ab50 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72  ects, since ther
1ab60 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e  e is no opportun
1ab70 69 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d  ity to add schem
1ab80 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  a.        ** ind
1ab90 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69  exes on subqueri
1aba0 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f  es and views. */
1abb0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
1abc0 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65  Setup = rLogSize
1abd0 20 2b 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20   + rSize;.      
1abe0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
1abf0 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d  ect==0 && (pTab-
1ac00 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
1ac10 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a  phemeral)==0 ){.
1ac20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1ac30 72 53 65 74 75 70 20 2b 3d 20 32 38 3b 0a 20 20  rSetup += 28;.  
1ac40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ac50 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
1ac60 74 75 70 20 2d 3d 20 31 30 3b 0a 20 20 20 20 20  tup -= 10;.     
1ac70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
1ac80 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
1ac90 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70  (pNew->rSetup, p
1aca0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
1acb0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1acc0 2d 3e 72 53 65 74 75 70 3c 30 20 29 20 70 4e 65  ->rSetup<0 ) pNe
1acd0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1ace0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
1acf0 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f  : Each index loo
1ad00 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f  kup yields 20 ro
1ad10 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
1ad20 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a    This.        *
1ad30 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74  * is more than t
1ad40 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f  he usual guess o
1ad50 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65  f 10 rows, since
1ad60 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a   we have no way.
1ad70 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e          ** of kn
1ad80 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74  owing how select
1ad90 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ive the index wi
1ada0 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
1adb0 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20  .  It would.    
1adc0 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e      ** not be un
1add0 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61  reasonable to ma
1ade0 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75  ke this value mu
1adf0 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20  ch larger. */.  
1ae00 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
1ae10 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28 20   = 43;  assert( 
1ae20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  43==sqlite3LogEs
1ae30 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20  t(20) );.       
1ae40 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
1ae50 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
1ae60 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f  LogSize,pNew->nO
1ae70 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ut);.        pNe
1ae80 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
1ae90 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20  RE_AUTO_INDEX;. 
1aea0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
1aeb0 72 65 71 20 3d 20 6d 50 72 65 72 65 71 20 7c 20  req = mPrereq | 
1aec0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
1aed0 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
1aee0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
1aef0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
1af00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1af10 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1af20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
1af30 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20  TIC_INDEX */..  
1af40 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
1af50 20 69 6e 64 69 63 65 73 2e 20 49 66 20 74 68 65   indices. If the
1af60 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
1af70 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
1af80 6e 20 6f 6e 6c 79 20 0a 20 20 2a 2a 20 63 6f 6e  n only .  ** con
1af90 73 69 64 65 72 20 69 6e 64 65 78 20 70 50 72 6f  sider index pPro
1afa0 62 65 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  be.  */.  for(; 
1afb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1afc0 20 70 50 72 6f 62 65 3b 20 0a 20 20 20 20 20 20   pProbe; .      
1afd0 70 50 72 6f 62 65 3d 28 70 53 72 63 2d 3e 70 49  pProbe=(pSrc->pI
1afe0 42 49 6e 64 65 78 20 3f 20 30 20 3a 20 70 50 72  BIndex ? 0 : pPr
1aff0 6f 62 65 2d 3e 70 4e 65 78 74 29 2c 20 69 53 6f  obe->pNext), iSo
1b000 72 74 49 64 78 2b 2b 0a 20 20 29 7b 0a 20 20 20  rtIdx++.  ){.   
1b010 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61   if( pProbe->pPa
1b020 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
1b030 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62     && !whereUsab
1b040 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70  lePartialIndex(p
1b050 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57  Src->iCursor, pW
1b060 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74  C, pProbe->pPart
1b070 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20  IdxWhere) ){.   
1b080 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 65     testcase( pNe
1b090 77 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e 69  w->iTab!=pSrc->i
1b0a0 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65  Cursor );  /* Se
1b0b0 65 20 74 69 63 6b 65 74 20 5b 39 38 64 39 37 33  e ticket [98d973
1b0c0 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63  b8f5] */.      c
1b0d0 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72  ontinue;  /* Par
1b0e0 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70  tial index inapp
1b0f0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69  ropriate for thi
1b100 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d  s query */.    }
1b110 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
1b120 3e 62 4e 6f 51 75 65 72 79 20 29 20 63 6f 6e 74  >bNoQuery ) cont
1b130 69 6e 75 65 3b 0a 20 20 20 20 72 53 69 7a 65 20  inue;.    rSize 
1b140 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
1b150 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e  ogEst[0];.    pN
1b160 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
1b170 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  = 0;.    pNew->u
1b180 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 30 3b  .btree.nBtm = 0;
1b190 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
1b1a0 65 65 2e 6e 54 6f 70 20 3d 20 30 3b 0a 20 20 20  ee.nTop = 0;.   
1b1b0 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30   pNew->nSkip = 0
1b1c0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
1b1d0 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rm = 0;.    pNew
1b1e0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
1b1f0 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1b200 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1b210 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71  prereq = mPrereq
1b220 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
1b230 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e   = rSize;.    pN
1b240 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
1b250 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  ex = pProbe;.   
1b260 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48   b = indexMightH
1b270 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70  elpWithOrderBy(p
1b280 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c  Builder, pProbe,
1b290 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b   pSrc->iCursor);
1b2a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50  .    /* The ONEP
1b2b0 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67  ASS_DESIRED flag
1b2c0 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74  s never occurs t
1b2d0 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44  ogether with ORD
1b2e0 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73  ER BY */.    ass
1b2f0 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63  ert( (pWInfo->wc
1b300 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1b310 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
1b320 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a  )==0 || b==0 );.
1b330 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
1b340 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  idxType==SQLITE_
1b350 49 44 58 54 59 50 45 5f 49 50 4b 20 29 7b 0a 20  IDXTYPE_IPK ){. 
1b360 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
1b370 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
1b380 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  x */.      pNew-
1b390 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
1b3a0 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  _IPK;..      /* 
1b3b0 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  Full table scan 
1b3c0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  */.      pNew->i
1b3d0 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
1b3e0 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20  ortIdx : 0;.    
1b3f0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
1b400 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20  t of full table 
1b410 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e  scan is (N*3.0).
1b420 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
1b430 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31  rRun = rSize + 1
1b440 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f  6;.      ApplyCo
1b450 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
1b460 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
1b470 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
1b480 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
1b490 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c  djust(pWC, pNew,
1b4a0 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72   rSize);.      r
1b4b0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1b4c0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1b4d0 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ew);.      pNew-
1b4e0 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
1b4f0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
1b500 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
1b510 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b        Bitmask m;
1b520 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62  .      if( pProb
1b530 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b  e->isCovering ){
1b540 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
1b550 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
1b560 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
1b570 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20  INDEXED;.       
1b580 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   m = 0;.      }e
1b590 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d  lse{.        m =
1b5a0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
1b5b0 20 70 50 72 6f 62 65 2d 3e 63 6f 6c 4e 6f 74 49   pProbe->colNotI
1b5c0 64 78 65 64 3b 0a 20 20 20 20 20 20 20 20 70 4e  dxed;.        pN
1b5d0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d  ew->wsFlags = (m
1b5e0 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44  ==0) ? (WHERE_ID
1b5f0 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44  X_ONLY|WHERE_IND
1b600 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e  EXED) : WHERE_IN
1b610 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a  DEXED;.      }..
1b620 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63        /* Full sc
1b630 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a  an via index */.
1b640 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20        if( b.    
1b650 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28     || !HasRowid(
1b660 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20  pTab).       || 
1b670 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
1b680 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 20 20  Where!=0.       
1b690 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20  || ( m==0.      
1b6a0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55     && pProbe->bU
1b6b0 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
1b6c0 20 20 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d       && (pProbe-
1b6d0 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
1b6e0 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20  szTabRow).      
1b6f0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
1b700 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1b710 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
1b720 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  D)==0.         &
1b730 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
1b740 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20  onfig.bUseCis.  
1b750 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
1b760 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57  zationEnabled(pW
1b770 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1b780 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64  , SQLITE_CoverId
1b790 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20  xScan).         
1b7a0 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20   ).      ){.    
1b7b0 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
1b7c0 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64  dx = b ? iSortId
1b7d0 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  x : 0;..        
1b7e0 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 76  /* The cost of v
1b7f0 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  isiting the inde
1b800 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77  x rows is N*K, w
1b810 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20 20  here K is.      
1b820 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e 31    ** between 1.1
1b830 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e 64   and 3.0, depend
1b840 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61 74  ing on the relat
1b850 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65  ive sizes of the
1b860 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
1b870 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77 73  x and table rows
1b880 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
1b890 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
1b8a0 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65  + 1 + (15*pProbe
1b8b0 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62  ->szIdxRow)/pTab
1b8c0 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
1b8d0 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
1b8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1b8f0 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
1b900 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
1b910 6e 2c 20 61 64 64 20 69 6e 20 74 68 65 20 63 6f  n, add in the co
1b920 73 74 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20  st of.          
1b930 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c 65 20 6c  ** doing table l
1b940 6f 6f 6b 75 70 73 2e 20 20 54 68 65 20 63 6f 73  ookups.  The cos
1b950 74 20 77 69 6c 6c 20 62 65 20 33 78 20 74 68 65  t will be 3x the
1b960 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
1b970 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e       ** lookups.
1b980 20 20 54 61 6b 65 20 69 6e 74 6f 20 61 63 63 6f    Take into acco
1b990 75 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65  unt WHERE clause
1b9a0 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20   terms that can 
1b9b0 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
1b9c0 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
1b9d0 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 2c 20  just the index, 
1b9e0 61 6e 64 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  and that do not 
1b9f0 72 65 71 75 69 72 65 20 61 0a 20 20 20 20 20 20  require a.      
1ba00 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f      ** table loo
1ba10 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  kup. */.        
1ba20 20 20 4c 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75 70    LogEst nLookup
1ba30 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 20 20   = rSize + 16;  
1ba40 2f 2a 20 42 61 73 65 20 63 6f 73 74 3a 20 20 4e  /* Base cost:  N
1ba50 2a 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  *3 */.          
1ba60 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
1ba70 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72    int iCur = pSr
1ba80 63 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  c->iCursor;.    
1ba90 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
1baa0 65 20 2a 70 57 43 32 20 3d 20 26 70 57 49 6e 66  e *pWC2 = &pWInf
1bab0 6f 2d 3e 73 57 43 3b 0a 20 20 20 20 20 20 20 20  o->sWC;.        
1bac0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1bad0 57 43 32 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  WC2->nTerm; ii++
1bae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 57  ){.            W
1baf0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
1bb00 3d 20 26 70 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a  = &pWC2->a[ii];.
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1bb20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65  !sqlite3ExprCove
1bb30 72 65 64 42 79 49 6e 64 65 78 28 70 54 65 72 6d  redByIndex(pTerm
1bb40 2d 3e 70 45 78 70 72 2c 20 69 43 75 72 2c 20 70  ->pExpr, iCur, p
1bb50 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20  Probe) ){.      
1bb60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1bb70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1bb80 20 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 72           /* pTer
1bb90 6d 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74  m can be evaluat
1bba0 65 64 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68  ed using just th
1bbb0 65 20 69 6e 64 65 78 2e 20 20 53 6f 20 72 65 64  e index.  So red
1bbc0 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  uce.            
1bbd0 2a 2a 20 74 68 65 20 65 78 70 65 63 74 65 64 20  ** the expected 
1bbe0 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 20  number of table 
1bbf0 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72 64 69 6e  lookups accordin
1bc00 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  gly */.         
1bc10 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
1bc20 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f              nLoo
1bc40 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  kup += pTerm->tr
1bc50 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20  uthProb;.       
1bc60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bc70 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75            nLooku
1bc80 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p--;.           
1bc90 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
1bca0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
1bcb0 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b 75  |WO_IS) ) nLooku
1bcc0 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20 20 20 20  p -= 19;.       
1bcd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1bce0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20   }.          .  
1bcf0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
1bd00 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
1bd10 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
1bd20 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20 20  , nLookup);.    
1bd30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70      }.        Ap
1bd40 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
1bd50 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54  r(pNew->rRun, pT
1bd60 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
1bd70 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
1bd80 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43  OutputAdjust(pWC
1bd90 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a  , pNew, rSize);.
1bda0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1bdb0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
1bdc0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
1bdd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
1bde0 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20   = rSize;.      
1bdf0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
1be00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1be10 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62  .    pBuilder->b
1be20 6c 64 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ldFlags = 0;.   
1be30 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1be40 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
1be50 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
1be60 6f 62 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  obe, 0);.    if(
1be70 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
1be80 61 67 73 3d 3d 53 51 4c 49 54 45 5f 42 4c 44 46  ags==SQLITE_BLDF
1be90 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
1bea0 20 20 2f 2a 20 49 66 20 61 20 6e 6f 6e 2d 75 6e    /* If a non-un
1beb0 69 71 75 65 20 69 6e 64 65 78 20 69 73 20 75 73  ique index is us
1bec0 65 64 2c 20 6f 72 20 69 66 20 61 20 70 72 65 66  ed, or if a pref
1bed0 69 78 20 6f 66 20 74 68 65 20 6b 65 79 20 66 6f  ix of the key fo
1bee0 72 0a 20 20 20 20 20 20 2a 2a 20 75 6e 69 71 75  r.      ** uniqu
1bef0 65 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20  e index is used 
1bf00 28 6d 61 6b 69 6e 67 20 74 68 65 20 69 6e 64 65  (making the inde
1bf10 78 20 66 75 6e 63 74 69 6f 6e 61 6c 6c 79 20 6e  x functionally n
1bf20 6f 6e 2d 75 6e 69 71 75 65 29 0a 20 20 20 20 20  on-unique).     
1bf30 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 71 6c   ** then the sql
1bf40 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 20 62  ite_stat1 data b
1bf50 65 63 6f 6d 65 73 20 69 6d 70 6f 72 74 61 6e 74  ecomes important
1bf60 20 66 6f 72 20 73 63 6f 72 69 6e 67 20 74 68 65   for scoring the
1bf70 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 6e 20 2a  .      ** plan *
1bf80 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  /.      pTab->ta
1bf90 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 74 61  bFlags |= TF_Sta
1bfa0 74 73 55 73 65 64 3b 0a 20 20 20 20 7d 0a 23 69  tsUsed;.    }.#i
1bfb0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1bfc0 4c 45 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c  LE_STAT4.    sql
1bfd0 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72  ite3Stat4ProbeFr
1bfe0 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  ee(pBuilder->pRe
1bff0 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  c);.    pBuilder
1c000 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b  ->nRecValid = 0;
1c010 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
1c020 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Rec = 0;.#endif.
1c030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1c040 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1c050 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1c060 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  ABLE../*.** Argu
1c070 6d 65 6e 74 20 70 49 64 78 49 6e 66 6f 20 69 73  ment pIdxInfo is
1c080 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
1c090 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73  ed with all cons
1c0a0 74 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61 79  traints that may
1c0b0 0a 2a 2a 20 62 65 20 75 73 65 64 20 62 79 20 74  .** be used by t
1c0c0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
1c0d0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1c0e0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
1c0f0 54 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  Tab. This.** fun
1c100 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75  ction marks a su
1c110 62 73 65 74 20 6f 66 20 74 68 6f 73 65 20 63 6f  bset of those co
1c120 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65  nstraints usable
1c130 2c 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a  , invokes the.**
1c140 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
1c150 6f 64 20 61 6e 64 20 61 64 64 73 20 74 68 65 20  od and adds the 
1c160 72 65 74 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f  returned plan to
1c170 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a   pBuilder..**.**
1c180 20 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73   A constraint is
1c190 20 6d 61 72 6b 65 64 20 75 73 61 62 6c 65 20 69   marked usable i
1c1a0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67  f:.**.**   * Arg
1c1b0 75 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e  ument mUsable in
1c1c0 64 69 63 61 74 65 73 20 74 68 61 74 20 69 74 73  dicates that its
1c1d0 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61   prerequisites a
1c1e0 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e  re available, an
1c1f0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69  d.**.**   * It i
1c200 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65  s not one of the
1c210 20 6f 70 65 72 61 74 6f 72 73 20 73 70 65 63 69   operators speci
1c220 66 69 65 64 20 69 6e 20 74 68 65 20 6d 45 78 63  fied in the mExc
1c230 6c 75 64 65 20 6d 61 73 6b 20 70 61 73 73 65 64  lude mask passed
1c240 0a 2a 2a 20 20 20 20 20 61 73 20 74 68 65 20 66  .**     as the f
1c250 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 28  ourth argument (
1c260 77 68 69 63 68 20 69 6e 20 70 72 61 63 74 69 63  which in practic
1c270 65 20 69 73 20 65 69 74 68 65 72 20 57 4f 5f 49  e is either WO_I
1c280 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41  N or 0)..**.** A
1c290 72 67 75 6d 65 6e 74 20 6d 50 72 65 72 65 71 20  rgument mPrereq 
1c2a0 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 74 61 62  is a mask of tab
1c2b0 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1c2c0 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
1c2d0 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  the.** virtual t
1c2e0 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e  able in question
1c2f0 2e 20 54 68 65 73 65 20 61 72 65 20 61 64 64 65  . These are adde
1c300 64 20 74 6f 20 74 68 65 20 70 6c 61 6e 73 20 70  d to the plans p
1c310 72 65 72 65 71 75 69 73 69 74 65 73 0a 2a 2a 20  rerequisites.** 
1c320 62 65 66 6f 72 65 20 69 74 20 69 73 20 61 64 64  before it is add
1c330 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a  ed to pBuilder..
1c340 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72  **.** Output par
1c350 61 6d 65 74 65 72 20 2a 70 62 49 6e 20 69 73 20  ameter *pbIn is 
1c360 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74  set to true if t
1c370 68 65 20 70 6c 61 6e 20 61 64 64 65 64 20 74 6f  he plan added to
1c380 20 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65   pBuilder.** use
1c390 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f  s one or more WO
1c3a0 5f 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66 61  _IN terms, or fa
1c3b0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
1c3c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
1c3d0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1c3e0 4f 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  One(.  WhereLoop
1c3f0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1c400 72 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  r,.  Bitmask mPr
1c410 65 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20  ereq,           
1c420 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1c430 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  tables that must
1c440 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42   be used. */.  B
1c450 69 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20  itmask mUsable, 
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c470 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c 65  * Mask of usable
1c480 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36   tables */.  u16
1c490 20 6d 45 78 63 6c 75 64 65 2c 20 20 20 20 20 20   mExclude,      
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4b0 45 78 63 6c 75 64 65 20 74 65 72 6d 73 20 75 73  Exclude terms us
1c4c0 69 6e 67 20 74 68 65 73 65 20 6f 70 65 72 61 74  ing these operat
1c4d0 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ors */.  sqlite3
1c4e0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
1c4f0 78 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75  xInfo,   /* Popu
1c500 6c 61 74 65 64 20 6f 62 6a 65 63 74 20 66 6f 72  lated object for
1c510 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20   xBestIndex */. 
1c520 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 2c 20 20 20   u16 mNoOmit,   
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c540 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 6d 69 74 20   /* Do not omit 
1c550 74 68 65 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  these constraint
1c560 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 49 6e  s */.  int *pbIn
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
1c590 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65 73  rue if plan uses
1c5a0 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a   an IN(...) op *
1c5b0 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  /.){.  WhereClau
1c5c0 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69 6c 64  se *pWC = pBuild
1c5d0 65 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72 75 63  er->pWC;.  struc
1c5e0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
1c5f0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
1c600 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
1c610 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
1c620 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
1c630 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
1c640 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
1c650 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ge;.  int i;.  i
1c660 6e 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  nt mxTerm;.  int
1c670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c680 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
1c690 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1c6a0 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  New;.  Parse *pP
1c6b0 61 72 73 65 20 3d 20 70 42 75 69 6c 64 65 72 2d  arse = pBuilder-
1c6c0 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
1c6d0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1c6e0 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 26  t_item *pSrc = &
1c6f0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1c700 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e  ->pTabList->a[pN
1c710 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69 6e 74  ew->iTab];.  int
1c720 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
1c730 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
1c740 61 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  aint;..  assert(
1c750 20 28 6d 55 73 61 62 6c 65 20 26 20 6d 50 72 65   (mUsable & mPre
1c760 72 65 71 29 3d 3d 6d 50 72 65 72 65 71 20 29 3b  req)==mPrereq );
1c770 0a 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a 20 20  .  *pbIn = 0;.  
1c780 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
1c790 50 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20 53 65  Prereq;..  /* Se
1c7a0 74 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61  t the usable fla
1c7b0 67 20 6f 6e 20 74 68 65 20 73 75 62 73 65 74 20  g on the subset 
1c7c0 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  of constraints i
1c7d0 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 20 20  dentified by .  
1c7e0 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d 55 73  ** arguments mUs
1c7f0 61 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c 75 64  able and mExclud
1c800 65 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  e. */.  pIdxCons
1c810 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
1c820 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
1c830 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
1c840 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
1c850 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
1c860 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
1c870 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 57  dxCons++){.    W
1c880 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
1c890 3d 20 26 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f  = &pWC->a[pIdxCo
1c8a0 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 5d  ns->iTermOffset]
1c8b0 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
1c8c0 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  usable = 0;.    
1c8d0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
1c8e0 65 71 52 69 67 68 74 20 26 20 6d 55 73 61 62 6c  eqRight & mUsabl
1c8f0 65 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65  e)==pTerm->prere
1c900 71 52 69 67 68 74 20 0a 20 20 20 20 20 26 26 20  qRight .     && 
1c910 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
1c920 72 20 26 20 6d 45 78 63 6c 75 64 65 29 3d 3d 30  r & mExclude)==0
1c930 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 49  .    ){.      pI
1c940 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
1c950 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
1c960 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1c970 68 65 20 6f 75 74 70 75 74 20 66 69 65 6c 64 73  he output fields
1c980 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
1c990 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
1c9a0 74 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ture */.  memset
1c9b0 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65  (pUsage, 0, size
1c9c0 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 6e 43  of(pUsage[0])*nC
1c9d0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 61 73  onstraint);.  as
1c9e0 73 65 72 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e  sert( pIdxInfo->
1c9f0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1ca00 3d 3d 30 20 29 3b 0a 20 20 70 49 64 78 49 6e 66  ==0 );.  pIdxInf
1ca10 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
1ca20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
1ca30 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  m = 0;.  pIdxInf
1ca40 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
1ca50 65 64 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  ed = 0;.  pIdxIn
1ca60 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
1ca70 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
1ca80 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a  BL / (double)2;.
1ca90 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
1caa0 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a  matedRows = 25;.
1cab0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46    pIdxInfo->idxF
1cac0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 49 64 78  lags = 0;.  pIdx
1cad0 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Info->colUsed = 
1cae0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
1caf0 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20  Src->colUsed;.. 
1cb00 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 76   /* Invoke the v
1cb10 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 42 65  irtual table xBe
1cb20 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64  stIndex() method
1cb30 20 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61 62 42   */.  rc = vtabB
1cb40 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  estIndex(pParse,
1cb50 20 70 53 72 63 2d 3e 70 54 61 62 2c 20 70 49 64   pSrc->pTab, pId
1cb60 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63  xInfo);.  if( rc
1cb70 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
1cb80 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1cb90 54 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  T ){.      /* If
1cba0 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
1cbb0 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73 20 53  method returns S
1cbc0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1cbd0 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
1cbe0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 70     ** that the p
1cbf0 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
1cc00 61 74 69 6f 6e 20 6f 66 20 70 61 72 61 6d 65 74  ation of paramet
1cc10 65 72 73 20 70 72 6f 76 69 64 65 64 20 69 73 20  ers provided is 
1cc20 75 6e 75 73 61 62 6c 65 2e 0a 20 20 20 20 20 20  unusable..      
1cc30 2a 2a 20 4d 61 6b 65 20 6e 6f 20 65 6e 74 72 69  ** Make no entri
1cc40 65 73 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 74  es in the loop t
1cc50 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  able..      */. 
1cc60 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1cc70 30 78 66 66 66 66 2c 20 28 22 20 20 5e 5e 5e 5e  0xffff, ("  ^^^^
1cc80 2d 2d 2d 20 6e 6f 6e 2d 76 69 61 62 6c 65 20 70  --- non-viable p
1cc90 6c 61 6e 20 72 65 6a 65 63 74 65 64 21 5c 6e 22  lan rejected!\n"
1cca0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1ccb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ccc0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
1ccd0 0a 20 20 7d 0a 0a 20 20 6d 78 54 65 72 6d 20 3d  .  }..  mxTerm =
1cce0 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70   -1;.  assert( p
1ccf0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
1cd00 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f  nstraint );.  fo
1cd10 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
1cd20 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
1cd30 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
1cd40 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
1cd50 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  mitMask = 0;.  p
1cd60 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
1cd70 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1cd80 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
1cd90 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1cda0 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
1cdb0 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1cdc0 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
1cdd0 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b  {.    int iTerm;
1cde0 0a 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20  .    if( (iTerm 
1cdf0 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
1ce00 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
1ce10 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1ce20 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69   *pTerm;.      i
1ce30 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d  nt j = pIdxCons-
1ce40 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
1ce50 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e      if( iTerm>=n
1ce60 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  Constraint.     
1ce70 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20    || j<0.       
1ce80 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
1ce90 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d  .       || pNew-
1cea0 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d  >aLTerm[iTerm]!=
1ceb0 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78  0.       || pIdx
1cec0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a  Cons->usable==0.
1ced0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1cee0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1cef0 28 70 50 61 72 73 65 2c 22 25 73 2e 78 42 65 73  (pParse,"%s.xBes
1cf00 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69  tIndex malfuncti
1cf10 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e  on",pSrc->pTab->
1cf20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1cf30 74 65 73 74 63 61 73 65 28 20 70 49 64 78 49 6e  testcase( pIdxIn
1cf40 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1cf50 78 53 74 72 20 29 3b 0a 20 20 20 20 20 20 20 20  xStr );.        
1cf60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1cf70 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
1cf80 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1cf90 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
1cfa0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
1cfb0 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20  ase( j==0 );.   
1cfc0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1cfd0 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
1cfe0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
1cff0 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
1d000 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
1d010 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
1d020 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
1d030 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c  ( iTerm<pNew->nL
1d040 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Slot );.      pN
1d050 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
1d060 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
1d070 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72   if( iTerm>mxTer
1d080 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65  m ) mxTerm = iTe
1d090 72 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  rm;.      testca
1d0a0 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
1d0b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d0c0 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20   iTerm==16 );.  
1d0d0 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
1d0e0 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
1d0f0 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
1d100 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
1d110 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66  <iTerm;.      if
1d120 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1d130 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
1d140 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
1d150 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
1d160 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
1d170 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73  d by an IN claus
1d180 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20  e may not.      
1d190 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65    ** consume the
1d1a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1d1b0 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65   because (1) the
1d1c0 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72   order of IN ter
1d1d0 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ms.        ** is
1d1e0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1d1f0 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
1d200 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
1d210 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
1d220 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c    ** (2) Multipl
1d230 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61  e outputs from a
1d240 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65   single IN value
1d250 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a   will not merge.
1d260 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
1d270 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
1d280 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
1d290 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
1d2a0 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
1d2b0 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e 53  ->idxFlags &= ~S
1d2c0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e  QLITE_INDEX_SCAN
1d2d0 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20  _UNIQUE;.       
1d2e0 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73 73 65   *pbIn = 1; asse
1d2f0 72 74 28 20 28 6d 45 78 63 6c 75 64 65 20 26 20  rt( (mExclude & 
1d300 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  WO_IN)==0 );.   
1d310 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1d320 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1d330 69 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d  itMask &= ~mNoOm
1d340 69 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  it;..  pNew->nLT
1d350 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
1d360 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78    for(i=0; i<=mx
1d370 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
1d380 69 66 28 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d  if( pNew->aLTerm
1d390 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
1d3a0 2f 2a 20 54 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20  /* The non-zero 
1d3b0 61 72 67 76 49 64 78 20 76 61 6c 75 65 73 20 6d  argvIdx values m
1d3c0 75 73 74 20 62 65 20 63 6f 6e 74 69 67 75 6f 75  ust be contiguou
1d3d0 73 2e 20 20 52 61 69 73 65 20 61 6e 0a 20 20 20  s.  Raise an.   
1d3e0 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 66 20 74     ** error if t
1d3f0 68 65 79 20 61 72 65 20 6e 6f 74 20 2a 2f 0a 20  hey are not */. 
1d400 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1d410 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 2e  rMsg(pParse,"%s.
1d420 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c 66 75  xBestIndex malfu
1d430 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e 70 54  nction",pSrc->pT
1d440 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
1d450 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
1d460 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1d470 49 64 78 53 74 72 20 29 3b 0a 20 20 20 20 20 20  IdxStr );.      
1d480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1d490 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
1d4a0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
1d4b0 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53  LTerm<=pNew->nLS
1d4c0 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75  lot );.  pNew->u
1d4d0 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70  .vtab.idxNum = p
1d4e0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b  IdxInfo->idxNum;
1d4f0 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1d500 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
1d510 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1d520 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49 6e 66  dxStr;.  pIdxInf
1d530 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
1d540 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  Str = 0;.  pNew-
1d550 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
1d560 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
1d570 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  r;.  pNew->u.vta
1d580 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69  b.isOrdered = (i
1d590 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  8)(pIdxInfo->ord
1d5a0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20  erByConsumed ?. 
1d5b0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
1d5c0 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20  OrderBy : 0);.  
1d5d0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1d5e0 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d  ;.  pNew->rRun =
1d5f0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72   sqlite3LogEstFr
1d600 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
1d610 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
1d620 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  );.  pNew->nOut 
1d630 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
1d640 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1d650 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20  tedRows);..  /* 
1d660 53 65 74 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  Set the WHERE_ON
1d670 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74 68 65  EROW flag if the
1d680 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65   xBestIndex() me
1d690 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64 0a 20  thod indicated. 
1d6a0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61   ** that the sca
1d6b0 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20  n will visit at 
1d6c0 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c  most one row. Cl
1d6d0 65 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65  ear it otherwise
1d6e0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 49  . */.  if( pIdxI
1d6f0 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 20  nfo->idxFlags & 
1d700 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
1d710 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20  N_UNIQUE ){.    
1d720 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
1d730 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20   WHERE_ONEROW;. 
1d740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
1d750 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  ->wsFlags &= ~WH
1d760 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a  ERE_ONEROW;.  }.
1d770 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1d780 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
1d790 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e   pNew);.  if( pN
1d7a0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
1d7b0 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
1d7c0 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e  e3_free(pNew->u.
1d7d0 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
1d7e0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1d7f0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
1d800 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
1d810 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d 25 64  ffff, ("  bIn=%d
1d820 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78   prereqIn=%04llx
1d830 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c   prereqOut=%04ll
1d840 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
1d850 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 62 49              *pbI
1d860 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74  n, (sqlite3_uint
1d870 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20 20 20  64)mPrereq,.    
1d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d890 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36    (sqlite3_uint6
1d8a0 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  4)(pNew->prereq 
1d8b0 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a  & ~mPrereq)));..
1d8c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d8d0 2f 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  /*.** If this fu
1d8e0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1d8f0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e  d from within an
1d900 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 63 61   xBestIndex() ca
1d910 6c 6c 62 61 63 6b 2c 20 69 74 0a 2a 2a 20 72 65  llback, it.** re
1d920 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
1d930 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1d940 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
1d950 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  of the collation
1d960 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 73 73  .** sequence ass
1d970 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 6c 65  ociated with ele
1d980 6d 65 6e 74 20 69 43 6f 6e 73 20 6f 66 20 74 68  ment iCons of th
1d990 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
1d9a0 69 6e 66 6f 2e 61 43 6f 6e 73 74 72 61 69 6e 74  info.aConstraint
1d9b0 0a 2a 2a 20 61 72 72 61 79 2e 20 4f 72 2c 20 69  .** array. Or, i
1d9c0 66 20 69 43 6f 6e 73 20 69 73 20 6f 75 74 20 6f  f iCons is out o
1d9d0 66 20 72 61 6e 67 65 20 6f 72 20 74 68 65 72 65  f range or there
1d9e0 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 78 42   is no active xB
1d9f0 65 73 74 49 6e 64 65 78 0a 2a 2a 20 63 61 6c 6c  estIndex.** call
1da00 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
1da10 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1da20 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6c 6c 61  lite3_vtab_colla
1da30 74 69 6f 6e 28 73 71 6c 69 74 65 33 5f 69 6e 64  tion(sqlite3_ind
1da40 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
1da50 6f 2c 20 69 6e 74 20 69 43 6f 6e 73 29 7b 0a 20  o, int iCons){. 
1da60 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f   HiddenIndexInfo
1da70 20 2a 70 48 69 64 64 65 6e 20 3d 20 28 48 69 64   *pHidden = (Hid
1da80 64 65 6e 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70  denIndexInfo*)&p
1da90 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 63 6f  IdxInfo[1];.  co
1daa0 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
1dab0 20 30 3b 0a 20 20 69 66 28 20 69 43 6f 6e 73 3e   0;.  if( iCons>
1dac0 3d 30 20 26 26 20 69 43 6f 6e 73 3c 70 49 64 78  =0 && iCons<pIdx
1dad0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
1dae0 74 20 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  t ){.    CollSeq
1daf0 20 2a 70 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e   *pC = 0;.    in
1db00 74 20 69 54 65 72 6d 20 3d 20 70 49 64 78 49 6e  t iTerm = pIdxIn
1db10 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
1db20 69 43 6f 6e 73 5d 2e 69 54 65 72 6d 4f 66 66 73  iCons].iTermOffs
1db30 65 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  et;.    Expr *pX
1db40 20 3d 20 70 48 69 64 64 65 6e 2d 3e 70 57 43 2d   = pHidden->pWC-
1db50 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b  >a[iTerm].pExpr;
1db60 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65  .    if( pX->pLe
1db70 66 74 20 29 7b 0a 20 20 20 20 20 20 70 43 20 3d  ft ){.      pC =
1db80 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1db90 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 48 69  mpareCollSeq(pHi
1dba0 64 64 65 6e 2d 3e 70 50 61 72 73 65 2c 20 70 58  dden->pParse, pX
1dbb0 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
1dbc0 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
1dbd0 7a 52 65 74 20 3d 20 28 70 43 20 3f 20 70 43 2d  zRet = (pC ? pC-
1dbe0 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65 33  >zName : sqlite3
1dbf0 53 74 72 42 49 4e 41 52 59 29 3b 0a 20 20 7d 0a  StrBINARY);.  }.
1dc00 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
1dc10 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
1dc20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1dc30 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66  s for a table of
1dc40 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69   the join identi
1dc50 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c  fied by.** pBuil
1dc60 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
1dc70 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
1dc80 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1dc90 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
1dca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
1dcb0 20 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72 20   are no LEFT or 
1dcc0 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73  CROSS JOIN joins
1dcd0 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20 62   in the query, b
1dce0 6f 74 68 20 6d 50 72 65 72 65 71 20 61 6e 64 0a  oth mPrereq and.
1dcf0 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72 65  ** mUnusable are
1dd00 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65 72   set to 0. Other
1dd10 77 69 73 65 2c 20 6d 50 72 65 72 65 71 20 69 73  wise, mPrereq is
1dd20 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 46   a mask of all F
1dd30 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65 6e  ROM clause.** en
1dd40 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72  tries that occur
1dd50 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72 74   before the virt
1dd60 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ual table in the
1dd70 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64   FROM clause and
1dd80 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74 65   are.** separate
1dd90 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20  d from it by at 
1dda0 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f  least one LEFT o
1ddb0 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53 69  r CROSS JOIN. Si
1ddc0 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a 20  milarly, the.** 
1ddd0 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20 63  mUnusable mask c
1dde0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f 4d  ontains all FROM
1ddf0 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 20   clause entries 
1de00 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65 72  that occur after
1de10 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
1de20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73 65  table and are se
1de30 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20  parated from it 
1de40 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  by at least one 
1de50 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f 53  LEFT or .** CROS
1de60 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46  S JOIN. .**.** F
1de70 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1de80 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a 2a  he query were:.*
1de90 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
1dea0 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e  t1, t2 LEFT JOIN
1deb0 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f 53   t3, t4, vt CROS
1dec0 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a 2a  S JOIN t5, t6;.*
1ded0 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72 65  *.** then mPrere
1dee0 71 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  q corresponds to
1def0 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55   (t1, t2) and mU
1df00 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20  nusable to (t5, 
1df10 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  t6)..**.** All t
1df20 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 50 72  he tables in mPr
1df30 65 72 65 71 20 6d 75 73 74 20 62 65 20 73 63 61  ereq must be sca
1df40 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  nned before the 
1df50 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20  current virtual 
1df60 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e  .** table. So an
1df70 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
1df80 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69  h all prerequisi
1df90 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69 65  tes are satisfie
1dfa0 64 20 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65 71  d by .** mPrereq
1dfb0 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69 65   may be specifie
1dfc0 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e  d as "usable" in
1dfd0 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42   all calls to xB
1dfe0 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f  estIndex. .** Co
1dff0 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61  nversely, all ta
1e000 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c  bles in mUnusabl
1e010 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  e must be scanne
1e020 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  d after the curr
1e030 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  ent.** virtual t
1e040 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72  able, so any ter
1e050 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ms for which the
1e060 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 6f   prerequisites o
1e070 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d  verlap with.** m
1e080 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20  Unusable should 
1e090 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67  always be config
1e0a0 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61  ured as "not-usa
1e0b0 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e  ble" for xBestIn
1e0c0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dex..*/.static i
1e0d0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
1e0e0 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c  irtual(.  WhereL
1e0f0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1e100 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20  lder,  /* WHERE 
1e110 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
1e120 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
1e130 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 20 20  mPrereq,        
1e140 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
1e150 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e  hat must be scan
1e160 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ned before this 
1e170 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  one */.  Bitmask
1e180 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20   mUnusable      
1e190 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
1e1a0 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
1e1b0 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73 20  nned after this 
1e1c0 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  one */.){.  int 
1e1d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1e1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e1f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65  rn code */.  Whe
1e200 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
1e210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
1e220 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
1e230 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
1e240 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1e250 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1e260 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1e270 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1e280 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
1e290 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1e2a0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
1e2b0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
1e2c0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
1e2d0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
1e2e0 73 65 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c 69  search */.  sqli
1e2f0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
1e300 70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65  p;       /* Obje
1e310 63 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  ct to pass to xB
1e320 65 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20  estIndex() */.  
1e330 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e350 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72  Number of constr
1e360 61 69 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20 20  aints in p */.  
1e370 69 6e 74 20 62 49 6e 3b 20 20 20 20 20 20 20 20  int bIn;        
1e380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e390 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65  True if plan use
1e3a0 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  s IN(...) operat
1e3b0 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  or */.  WhereLoo
1e3c0 70 20 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d 61  p *pNew;.  Bitma
1e3d0 73 6b 20 6d 42 65 73 74 3b 20 20 20 20 20 20 20  sk mBest;       
1e3e0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1e3f0 73 20 75 73 65 64 20 62 79 20 62 65 73 74 20 70  s used by best p
1e400 6f 73 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a  ossible plan */.
1e410 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 3b 0a 0a    u16 mNoOmit;..
1e420 20 20 61 73 73 65 72 74 28 20 28 6d 50 72 65 72    assert( (mPrer
1e430 65 71 20 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d  eq & mUnusable)=
1e440 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  =0 );.  pWInfo =
1e450 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1e460 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
1e470 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1e480 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
1e490 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
1e4a0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1e4b0 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
1e4c0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
1e4d0 2d 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73 65 72  ->iTab];.  asser
1e4e0 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72  t( IsVirtual(pSr
1e4f0 63 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20 70 20  c->pTab) );.  p 
1e500 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
1e510 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
1e520 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72 63   mUnusable, pSrc
1e530 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  , pBuilder->pOrd
1e540 65 72 42 79 2c 20 0a 20 20 20 20 20 20 26 6d 4e  erBy, .      &mN
1e550 6f 4f 6d 69 74 29 3b 0a 20 20 69 66 28 20 70 3d  oOmit);.  if( p=
1e560 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1e570 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
1e580 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1e590 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
1e5a0 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
1e5b0 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
1e5c0 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
1e5d0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1e5e0 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f 6e  Free = 0;.  nCon
1e5f0 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43 6f  straint = p->nCo
1e600 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20  nstraint;.  if( 
1e610 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
1e620 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77  pParse->db, pNew
1e630 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29  , nConstraint) )
1e640 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1e650 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1e660 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
1e670 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1e680 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
1e690 74 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64 65  t call xBestInde
1e6a0 78 28 29 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e  x() with all con
1e6b0 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2e  straints usable.
1e6c0 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45   */.  WHERETRACE
1e6d0 28 30 78 38 30 30 2c 20 28 22 42 45 47 49 4e 20  (0x800, ("BEGIN 
1e6e0 25 73 2e 61 64 64 56 69 72 74 75 61 6c 28 29 5c  %s.addVirtual()\
1e6f0 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  n", pSrc->pTab->
1e700 7a 4e 61 6d 65 29 29 3b 0a 20 20 57 48 45 52 45  zName));.  WHERE
1e710 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1e720 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1e730 75 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 72  usable\n"));.  r
1e740 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1e750 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c  VirtualOne(pBuil
1e760 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c  der, mPrereq, AL
1e770 4c 42 49 54 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f  LBITS, 0, p, mNo
1e780 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 0a 20 20  Omit, &bIn);..  
1e790 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  /* If the call t
1e7a0 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77  o xBestIndex() w
1e7b0 69 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e  ith all terms en
1e7c0 61 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20 61  abled produced a
1e7d0 20 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20   plan.  ** that 
1e7e0 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
1e7f0 20 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62 6c   any source tabl
1e800 65 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20  es (IOW: a plan 
1e810 77 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 0a 20  with mBest==0). 
1e820 20 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74   ** and does not
1e830 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e 2e 29 20   use an IN(...) 
1e840 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 74  operator, then t
1e850 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1e860 20 69 6e 20 6d 61 6b 69 6e 67 20 0a 20 20 2a 2a   in making .  **
1e870 20 61 6e 79 20 66 75 72 74 68 65 72 20 63 61 6c   any further cal
1e880 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
1e890 28 29 20 73 69 6e 63 65 20 74 68 65 79 20 77 69  () since they wi
1e8a0 6c 6c 20 61 6c 6c 20 72 65 74 75 72 6e 20 74 68  ll all return th
1e8b0 65 20 73 61 6d 65 0a 20 20 2a 2a 20 72 65 73 75  e same.  ** resu
1e8c0 6c 74 20 28 69 66 20 74 68 65 20 78 42 65 73 74  lt (if the xBest
1e8d0 49 6e 64 65 78 28 29 20 69 6d 70 6c 65 6d 65 6e  Index() implemen
1e8e0 74 61 74 69 6f 6e 20 69 73 20 73 61 6e 65 29 2e  tation is sane).
1e8f0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1e900 4c 49 54 45 5f 4f 4b 20 26 26 20 28 28 6d 42 65  LITE_OK && ((mBe
1e910 73 74 20 3d 20 28 70 4e 65 77 2d 3e 70 72 65 72  st = (pNew->prer
1e920 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29 21  eq & ~mPrereq))!
1e930 3d 30 20 7c 7c 20 62 49 6e 29 20 29 7b 0a 20 20  =0 || bIn) ){.  
1e940 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 20 3d    int seenZero =
1e950 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e960 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70 6c 61  /* True if a pla
1e970 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71  n with no prereq
1e980 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  s seen */.    in
1e990 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d  t seenZeroNoIN =
1e9a0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50   0;         /* P
1e9b0 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72  lan with no prer
1e9c0 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e  eqs and no IN(..
1e9d0 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 42  .) seen */.    B
1e9e0 69 74 6d 61 73 6b 20 6d 50 72 65 76 20 3d 20 30  itmask mPrev = 0
1e9f0 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 42  ;.    Bitmask mB
1ea00 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20  estNoIn = 0;..  
1ea10 20 20 2f 2a 20 49 66 20 74 68 65 20 70 6c 61 6e    /* If the plan
1ea20 20 70 72 6f 64 75 63 65 64 20 62 79 20 74 68 65   produced by the
1ea30 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 75 73   earlier call us
1ea40 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 74 65  es an IN(...) te
1ea50 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rm, call.    ** 
1ea60 78 42 65 73 74 49 6e 64 65 78 20 61 67 61 69 6e  xBestIndex again
1ea70 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69 74 68  , this time with
1ea80 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 73 20 64   IN(...) terms d
1ea90 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20  isabled. */.    
1eaa0 69 66 28 20 62 49 6e 20 29 7b 0a 20 20 20 20 20  if( bIn ){.     
1eab0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1eac0 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1ead0 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20 77 2f 6f  : all usable w/o
1eae0 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20   IN\n"));.      
1eaf0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1eb00 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20  dVirtualOne(.   
1eb10 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c         pBuilder,
1eb20 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54   mPrereq, ALLBIT
1eb30 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f  S, WO_IN, p, mNo
1eb40 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20  Omit, &bIn);.   
1eb50 20 20 20 61 73 73 65 72 74 28 20 62 49 6e 3d 3d     assert( bIn==
1eb60 30 20 29 3b 0a 20 20 20 20 20 20 6d 42 65 73 74  0 );.      mBest
1eb70 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72 65  NoIn = pNew->pre
1eb80 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 3b 0a  req & ~mPrereq;.
1eb90 20 20 20 20 20 20 69 66 28 20 6d 42 65 73 74 4e        if( mBestN
1eba0 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oIn==0 ){.      
1ebb0 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a    seenZero = 1;.
1ebc0 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f          seenZero
1ebd0 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  NoIN = 1;.      
1ebe0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1ebf0 43 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 20  Call xBestIndex 
1ec00 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 64 69  once for each di
1ec10 73 74 69 6e 63 74 20 76 61 6c 75 65 20 6f 66 20  stinct value of 
1ec20 28 70 72 65 72 65 71 52 69 67 68 74 20 26 20 7e  (prereqRight & ~
1ec30 6d 50 72 65 72 65 71 29 20 0a 20 20 20 20 2a 2a  mPrereq) .    **
1ec40 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 74   in the set of t
1ec50 65 72 6d 73 20 74 68 61 74 20 61 70 70 6c 79 20  erms that apply 
1ec60 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  to the current v
1ec70 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a  irtual table.  *
1ec80 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  /.    while( rc=
1ec90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1eca0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1ecb0 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d   Bitmask mNext =
1ecc0 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20 20   ALLBITS;.      
1ecd0 61 73 73 65 72 74 28 20 6d 4e 65 78 74 3e 30 20  assert( mNext>0 
1ece0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1ecf0 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
1ed00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42   i++){.        B
1ed10 69 74 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20 28  itmask mThis = (
1ed20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57 43  .            pWC
1ed30 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61 69  ->a[p->aConstrai
1ed40 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
1ed50 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74 20 26  t].prereqRight &
1ed60 20 7e 6d 50 72 65 72 65 71 0a 20 20 20 20 20 20   ~mPrereq.      
1ed70 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
1ed80 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26 26 20   mThis>mPrev && 
1ed90 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d 4e  mThis<mNext ) mN
1eda0 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20 20  ext = mThis;.   
1edb0 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72 65 76     }.      mPrev
1edc0 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20 20   = mNext;.      
1edd0 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49  if( mNext==ALLBI
1ede0 54 53 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  TS ) break;.    
1edf0 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42 65    if( mNext==mBe
1ee00 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65  st || mNext==mBe
1ee10 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e 75  stNoIn ) continu
1ee20 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  e;.      WHERETR
1ee30 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1ee40 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d  rtualOne: mPrev=
1ee50 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30 34  %04llx mNext=%04
1ee60 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llx\n",.        
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ee80 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d  sqlite3_uint64)m
1ee90 50 72 65 76 2c 20 28 73 71 6c 69 74 65 33 5f 75  Prev, (sqlite3_u
1eea0 69 6e 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a 20  int64)mNext));. 
1eeb0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1eec0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1eed0 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69  (.          pBui
1eee0 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1eef0 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c 20 30 2c  Next|mPrereq, 0,
1ef00 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49   p, mNoOmit, &bI
1ef10 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  n);.      if( pN
1ef20 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d 50 72 65  ew->prereq==mPre
1ef30 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 73  req ){.        s
1ef40 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20  eenZero = 1;.   
1ef50 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20       if( bIn==0 
1ef60 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d  ) seenZeroNoIN =
1ef70 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1ef80 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1ef90 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1efa0 6e 64 65 78 28 29 20 69 6e 20 74 68 65 20 61 62  ndex() in the ab
1efb0 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20 6e 6f 74  ove loop did not
1efc0 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20   find a plan.   
1efd0 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72 65   ** that require
1efe0 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c  s no source tabl
1eff0 65 73 20 61 74 20 61 6c 6c 20 28 69 2e 65 2e 20  es at all (i.e. 
1f000 6f 6e 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  one guaranteed t
1f010 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 73 61 62  o be.    ** usab
1f020 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63 61 6c 6c  le), make a call
1f030 20 68 65 72 65 20 77 69 74 68 20 61 6c 6c 20 73   here with all s
1f040 6f 75 72 63 65 20 74 61 62 6c 65 73 20 64 69 73  ource tables dis
1f050 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  abled */.    if(
1f060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1f070 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b  & seenZero==0 ){
1f080 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1f090 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1f0a0 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61  ualOne: all disa
1f0b0 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20  bled\n"));.     
1f0c0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1f0d0 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1f0e0 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1f0f0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72  , mPrereq, mPrer
1f100 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69  eq, 0, p, mNoOmi
1f110 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20  t, &bIn);.      
1f120 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65  if( bIn==0 ) see
1f130 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20  nZeroNoIN = 1;. 
1f140 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1f150 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65  the calls to xBe
1f160 73 74 49 6e 64 65 78 28 29 20 68 61 76 65 20 73  stIndex() have s
1f170 6f 20 66 61 72 20 66 61 69 6c 65 64 20 74 6f 20  o far failed to 
1f180 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20  find a plan.    
1f190 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ** that requires
1f1a0 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65   no source table
1f1b0 73 20 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65  s at all and doe
1f1c0 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e 28  s not use an IN(
1f1d0 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72  ...).    ** oper
1f1e0 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e  ator, make a fin
1f1f0 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69  al call to obtai
1f200 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a  n one here.  */.
1f210 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f220 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72  TE_OK && seenZer
1f230 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20  oNoIN==0 ){.    
1f240 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34    WHERETRACE(0x4
1f250 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e  0, ("  VirtualOn
1f260 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 20  e: all disabled 
1f270 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b  and w/o IN\n"));
1f280 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1f290 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1f2a0 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42  ne(.          pB
1f2b0 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1f2c0 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f 49 4e 2c   mPrereq, WO_IN,
1f2d0 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49   p, mNoOmit, &bI
1f2e0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
1f2f0 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72   if( p->needToFr
1f300 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
1f310 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74  e3_free(p->idxSt
1f320 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  r);.  sqlite3DbF
1f330 72 65 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  reeNN(pParse->db
1f340 2c 20 70 29 3b 0a 20 20 57 48 45 52 45 54 52 41  , p);.  WHERETRA
1f350 43 45 28 30 78 38 30 30 2c 20 28 22 45 4e 44 20  CE(0x800, ("END 
1f360 25 73 2e 61 64 64 56 69 72 74 75 61 6c 28 29 2c  %s.addVirtual(),
1f370 20 72 63 3d 25 64 5c 6e 22 2c 20 70 53 72 63 2d   rc=%d\n", pSrc-
1f380 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 72 63  >pTab->zName, rc
1f390 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
1f3a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1f3b0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1f3c0 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
1f3d0 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
1f3e0 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
1f3f0 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
1f400 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
1f410 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
1f420 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
1f430 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1f440 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57 68  eLoopAddOr(.  Wh
1f450 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1f460 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42 69 74  pBuilder, .  Bit
1f470 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 0a 20  mask mPrereq, . 
1f480 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1f490 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  le.){.  WhereInf
1f4a0 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
1f4b0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
1f4c0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1f4d0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
1f4e0 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
1f4f0 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
1f500 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1f510 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
1f520 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
1f530 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
1f540 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
1f550 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
1f560 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b  rSet sSum, sCur;
1f570 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1f580 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1f590 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64   .  pWC = pBuild
1f5a0 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e  er->pWC;.  pWCEn
1f5b0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
1f5c0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
1f5d0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1f5e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
1f5f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
1f600 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
1f610 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1f620 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
1f630 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
1f640 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28  iCursor;..  for(
1f650 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
1f660 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
1f670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
1f680 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
1f690 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1f6a0 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
1f6b0 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
1f6c0 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
1f6d0 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
1f6e0 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
1f6f0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
1f700 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
1f710 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
1f720 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
1f730 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
1f740 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
1f750 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
1f760 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
1f770 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
1f780 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
1f790 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
1f7a0 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75  ;.    .      sSu
1f7b0 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
1f7c0 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
1f7d0 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
1f7e0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
1f7f0 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72  d.pOrSet = &sCur
1f800 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ;..      WHERETR
1f810 41 43 45 28 30 78 32 30 30 2c 20 28 22 42 65 67  ACE(0x200, ("Beg
1f820 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  in processing OR
1f830 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1f840 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f  Term));.      fo
1f850 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
1f860 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
1f870 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
1f880 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
1f890 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
1f8a0 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
1f8b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
1f8c0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
1f8d0 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
1f8e0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
1f8f0 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
1f900 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1f910 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
1f920 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
1f930 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
1f940 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
1f950 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
1f960 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
1f970 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
1f980 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
1f990 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
1f9a0 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
1f9b0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
1f9c0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
1f9d0 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
1f9e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
1f9f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1fa00 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
1fa10 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48  n = 0;.#ifdef WH
1fa20 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1fa30 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
1fa40 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d  ACE(0x200, ("OR-
1fa50 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61  term %d of %p ha
1fa60 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e  s %d subterms:\n
1fa70 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
1fa80 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72         (int)(pOr
1fa90 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20  Term-pOrWC->a), 
1faa0 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64  pTerm, sSubBuild
1fab0 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20  .pWC->nTerm));. 
1fac0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1fad0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
1fae0 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x400 ){.        
1faf0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
1fb00 61 75 73 65 50 72 69 6e 74 28 73 53 75 62 42 75  ausePrint(sSubBu
1fb10 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20 20 20 20  ild.pWC);.      
1fb20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
1fb30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1fb40 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1fb50 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1fb60 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
1fb70 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1fb80 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1fb90 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c  tual(&sSubBuild,
1fba0 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61   mPrereq, mUnusa
1fbb0 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ble);.        }e
1fbc0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
1fbd0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
1fbe0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1fbf0 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
1fc00 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20  , mPrereq);.    
1fc10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1fc20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fc30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1fc40 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1fc50 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72  (&sSubBuild, mPr
1fc60 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1fc70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fc80 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1fc90 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75  SQLITE_OK || sCu
1fca0 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  r.n==0 );.      
1fcb0 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20    if( sCur.n==0 
1fcc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
1fcd0 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
1fce0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1fcf0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65    }else if( once
1fd00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
1fd10 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c  ereOrMove(&sSum,
1fd20 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20   &sCur);.       
1fd30 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
1fd40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fd50 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65 74        WhereOrSet
1fd60 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20   sPrev;.        
1fd70 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1fd80 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20  Prev, &sSum);.  
1fd90 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
1fda0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
1fdb0 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e  r(i=0; i<sPrev.n
1fdc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1fdd0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
1fde0 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Cur.n; j++){.   
1fdf0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
1fe00 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20  OrInsert(&sSum, 
1fe10 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65  sPrev.a[i].prere
1fe20 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72  q | sCur.a[j].pr
1fe30 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20  ereq,.          
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1fe60 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52  dd(sPrev.a[i].rR
1fe70 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52  un, sCur.a[j].rR
1fe80 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un),.           
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1feb0 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75  d(sPrev.a[i].nOu
1fec0 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75  t, sCur.a[j].nOu
1fed0 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t));.           
1fee0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1fef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ff00 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
1ff10 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  erm = 1;.      p
1ff20 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
1ff30 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e   pTerm;.      pN
1ff40 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1ff50 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
1ff60 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1ff70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
1ff80 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
1ff90 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e        memset(&pN
1ffa0 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  ew->u, 0, sizeof
1ffb0 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20  (pNew->u));.    
1ffc0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
1ffd0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53  QLITE_OK && i<sS
1ffe0 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  um.n; i++){.    
1fff0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
20000 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b  urrently sSum.a[
20010 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74  i].rRun is set t
20020 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  o the sum of the
20030 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a   costs.        *
20040 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61  * of all sub-sca
20050 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ns required by t
20060 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65  he OR-scan. Howe
20070 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e  ver, due to roun
20080 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
20090 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62  errors, it may b
200a0 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  e that the cost 
200b0 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69  of the OR-scan i
200c0 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20  s equal to its. 
200d0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65         ** most e
200e0 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61  xpensive sub-sca
200f0 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c  n. Add the small
20100 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e  est possible pen
20110 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  alty .        **
20120 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20   (equivalent to 
20130 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20  multiplying the 
20140 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f  cost by 1.07) to
20150 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20   ensure that .  
20160 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f        ** this do
20170 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f  es not happen. O
20180 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48  therwise, for WH
20190 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63 68  ERE clauses such
201a0 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
201b0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65  ** following whe
201c0 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  re there is an i
201d0 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20  ndex on "y":.   
201e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
201f0 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b  **     WHERE lik
20200 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39  elihood(x=?, 0.9
20210 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20  9) OR y=?.      
20220 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
20230 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20  the planner may 
20240 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f  elect to "OR" to
20250 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61  gether a full-ta
20260 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a  ble scan and an.
20270 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
20280 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68   lookup. And oth
20290 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64  er similarly odd
202a0 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20   results.  */.  
202b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
202c0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75   = sSum.a[i].rRu
202d0 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n + 1;.        p
202e0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d  New->nOut = sSum
202f0 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20  .a[i].nOut;.    
20300 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
20310 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65   = sSum.a[i].pre
20320 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20  req;.        rc 
20330 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
20340 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
20350 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20360 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
20370 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73  0, ("End process
20380 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
20390 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
203a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
203b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
203c0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
203d0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
203e0 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
203f0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
20400 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
20410 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
20420 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
20430 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
20440 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
20450 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 3d 20 30  mask mPrereq = 0
20460 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
20470 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
20480 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
20490 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
204a0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
204b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
204c0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75  m *pItem;.  stru
204d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
204e0 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73  *pEnd = &pTabLis
204f0 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  t->a[pWInfo->nLe
20500 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  vel];.  sqlite3 
20510 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
20520 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
20530 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20540 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
20550 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  w;.  u8 priorJoi
20560 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ntype = 0;..  /*
20570 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
20580 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
20590 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
205a0 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
205b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
205c0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
205d0 74 28 70 4e 65 77 29 3b 0a 20 20 70 42 75 69 6c  t(pNew);.  pBuil
205e0 64 65 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69 74 20  der->iPlanLimit 
205f0 3d 20 53 51 4c 49 54 45 5f 51 55 45 52 59 5f 50  = SQLITE_QUERY_P
20600 4c 41 4e 4e 45 52 5f 4c 49 4d 49 54 3b 0a 20 20  LANNER_LIMIT;.  
20610 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65  for(iTab=0, pIte
20620 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70  m=pTabList->a; p
20630 49 74 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b  Item<pEnd; iTab+
20640 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
20650 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
20660 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  le = 0;.    pNew
20670 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ->iTab = iTab;. 
20680 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 69 50 6c     pBuilder->iPl
20690 61 6e 4c 69 6d 69 74 20 2b 3d 20 53 51 4c 49 54  anLimit += SQLIT
206a0 45 5f 51 55 45 52 59 5f 50 4c 41 4e 4e 45 52 5f  E_QUERY_PLANNER_
206b0 4c 49 4d 49 54 5f 49 4e 43 52 3b 0a 20 20 20 20  LIMIT_INCR;.    
206c0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  pNew->maskSelf =
206d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
206e0 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
206f0 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69  askSet, pItem->i
20700 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
20710 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69   ((pItem->fg.joi
20720 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74  ntype|priorJoint
20730 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c  ype) & (JT_LEFT|
20740 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b  JT_CROSS))!=0 ){
20750 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
20760 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65  ondition is true
20770 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74   when pItem is t
20780 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
20790 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  erm on the.     
207a0 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73   ** right-hand-s
207b0 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72  ide of a LEFT or
207c0 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f   CROSS JOIN.  */
207d0 0a 20 20 20 20 20 20 6d 50 72 65 72 65 71 20 3d  .      mPrereq =
207e0 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
207f0 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65     priorJointype
20800 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69   = pItem->fg.joi
20810 6e 74 79 70 65 3b 0a 23 69 66 6e 64 65 66 20 53  ntype;.#ifndef S
20820 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
20830 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
20840 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
20850 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
20860 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
20870 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  tem *p;.      fo
20880 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70  r(p=&pItem[1]; p
20890 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20  <pEnd; p++){.   
208a0 20 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62       if( mUnusab
208b0 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69  le || (p->fg.joi
208c0 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
208d0 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20  |JT_CROSS)) ){. 
208e0 20 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62           mUnusab
208f0 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  le |= sqlite3Whe
20900 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  reGetMask(&pWInf
20910 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  o->sMaskSet, p->
20920 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
20930 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20940 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
20950 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c  AddVirtual(pBuil
20960 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55  der, mPrereq, mU
20970 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65  nusable);.    }e
20980 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
20990 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
209a0 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a  LTABLE */.    {.
209b0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
209c0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
209d0 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 29 3b  ilder, mPrereq);
209e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
209f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20a00 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2d 3e 68  pBuilder->pWC->h
20a10 61 73 4f 72 20 29 7b 0a 20 20 20 20 20 20 72 63  asOr ){.      rc
20a20 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f   = whereLoopAddO
20a30 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  r(pBuilder, mPre
20a40 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  req, mUnusable);
20a50 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f  .    }.    mPrio
20a60 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  r |= pNew->maskS
20a70 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20  elf;.    if( rc 
20a80 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
20a90 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  led ){.      if(
20aa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
20ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
20ac0 65 20 68 69 74 20 74 68 65 20 71 75 65 72 79 20  e hit the query 
20ad0 70 6c 61 6e 6e 65 72 20 73 65 61 72 63 68 20 6c  planner search l
20ae0 69 6d 69 74 20 73 65 74 20 62 79 20 69 50 6c 61  imit set by iPla
20af0 6e 4c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20  nLimit */.      
20b00 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
20b10 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 61  LITE_WARNING, "a
20b20 62 62 72 65 76 69 61 74 65 64 20 71 75 65 72 79  bbreviated query
20b30 20 61 6c 67 6f 72 69 74 68 6d 20 73 65 61 72 63   algorithm searc
20b40 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  h");.        rc 
20b50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
20b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20b70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20b80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68  .    }.  }..  wh
20b90 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
20ba0 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
20bb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
20bc0 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
20bd0 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
20be0 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
20bf0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
20c00 68 65 20 36 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 6th.** parame
20c10 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
20c20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
20c30 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
20c40 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
20c50 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
20c60 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
20c70 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65  eparate sort ope
20c80 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ration.  Return 
20c90 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a  N:.** .**   N>0:
20ca0 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68     N terms of th
20cb0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
20cc0 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
20cd0 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74  **   N==0:  No t
20ce0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
20cf0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
20d00 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
20d10 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65  <0:   Unknown ye
20d20 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73  t how many terms
20d30 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67   of ORDER BY mig
20d40 68 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e  ht be satisfied.
20d50 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74     .**.** Note t
20d60 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66  hat processing f
20d70 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  or WHERE_GROUPBY
20d80 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49   and WHERE_DISTI
20d90 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a  NCTBY is not as.
20da0 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68  ** strict.  With
20db0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
20dc0 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20  STINCT the only 
20dd0 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74  requirement is t
20de0 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  hat.** equivalen
20df0 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d  t rows appear im
20e00 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65  mediately adjace
20e10 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65  nt to one anothe
20e20 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20  r.  GROUP BY.** 
20e30 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20  and DISTINCT do 
20e40 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73  not require rows
20e50 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e   to appear in an
20e60 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  y particular ord
20e70 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73  er as long.** as
20e80 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
20e90 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
20ea0 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72  ether.  Thus for
20eb0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
20ec0 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f  STINCT.** the pO
20ed0 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e  rderBy terms can
20ee0 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61   be matched in a
20ef0 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20  ny order.  With 
20f00 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a  ORDER BY, the .*
20f10 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  * pOrderBy terms
20f20 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64   must be matched
20f30 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d   in strict left-
20f40 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a  to-right order..
20f50 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65  */.static i8 whe
20f60 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
20f70 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49  rderBy(.  WhereI
20f80 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20  nfo *pWInfo,    
20f90 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
20fa0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
20fb0 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
20fc0 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  * ORDER BY or GR
20fd0 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e  OUP BY or DISTIN
20fe0 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65  CT clause to che
20ff0 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  ck */.  WherePat
21000 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a  h *pPath,     /*
21010 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74   The WherePath t
21020 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36  o check */.  u16
21030 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
21040 20 20 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55     /* WHERE_GROU
21050 50 42 59 20 6f 72 20 5f 44 49 53 54 49 4e 43 54  PBY or _DISTINCT
21060 42 59 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c  BY or _ORDERBY_L
21070 49 4d 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  IMIT */.  u16 nL
21080 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
21090 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
210a0 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
210b0 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
210c0 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
210d0 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
210e0 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
210f0 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
21100 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
21110 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
21120 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
21130 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
21140 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
21150 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
21160 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
21170 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
21180 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
21190 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
211a0 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
211b0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
211c0 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
211d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
211e0 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
211f0 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
21200 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
21210 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
21220 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
21230 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
21240 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
21250 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
21260 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
21270 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
21280 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
21290 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
212a0 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
212b0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
212c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
212d0 20 65 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20   eqOpMask;      
212e0 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71     /* Allowed eq
212f0 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73  uality operators
21300 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f   */.  u16 nKeyCo
21310 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  l;          /* N
21320 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c  umber of key col
21330 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a  umns in pIndex *
21340 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b  /.  u16 nColumn;
21350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
21360 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64  al number of ord
21370 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ered columns in 
21380 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75  the index */.  u
21390 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  16 nOrderBy;    
213a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
213b0 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
213c0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
213d0 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
213e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
213f0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20  of WhereLoop in 
21400 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63  pPath being proc
21410 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  essed */.  int i
21420 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
21430 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21440 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
21450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21460 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
21470 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c  r current WhereL
21480 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  oop */.  int iCo
21490 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
214a0 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  * A column numbe
214b0 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69  r within table i
214c0 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  Cur */.  WhereLo
214d0 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f  op *pLoop = 0; /
214e0 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c  * Current WhereL
214f0 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73  oop being proces
21500 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54  sed. */.  WhereT
21510 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
21520 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
21530 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
21540 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
21550 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20  pOBExpr;        
21560 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
21570 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
21580 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43  BY clause */.  C
21590 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
215a0 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20       /* COLLATE 
215b0 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e  function from an
215c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
215d0 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78   term */.  Index
215e0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
215f0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73   /* The index as
21600 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c  sociated with pL
21610 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
21620 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
21630 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
21640 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21650 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
21660 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a  obSat = 0;    /*
21670 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42   Mask of ORDER B
21680 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65  Y terms satisfie
21690 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69  d so far */.  Bi
216a0 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20  tmask obDone;   
216b0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
216c0 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
216d0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  s */.  Bitmask o
216e0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
216f0 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c  ;  /* Mask of al
21700 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c  l well-ordered l
21710 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  oops */.  Bitmas
21720 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20  k ready;        
21730 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
21740 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   inner loops */.
21750 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  /*.  ** We sa
21760 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
21770 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20  is "one-row" if 
21780 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20  it generates no 
21790 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20  more than one.  
217a0 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  ** row of output
217b0 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69  .  A WhereLoop i
217c0 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c  s one-row if all
217d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
217e0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  g are true:.  **
217f0 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20    (a) All index 
21800 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69  columns match wi
21810 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  th WHERE_COLUMN_
21820 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68  EQ..  **  (b) Th
21830 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75  e index is uniqu
21840 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65  e.  ** Any Where
21850 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45  Loop with an WHE
21860 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e  RE_COLUMN_EQ con
21870 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72  straint on the r
21880 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e  owid is one-row.
21890 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d  .  ** Every one-
218a0 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  row WhereLoop wi
218b0 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52  ll have the WHER
218c0 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74  E_ONEROW bit set
218d0 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a   in wsFlags..  *
218e0 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
218f0 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
21900 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20  order-distinct" 
21910 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  if the set of co
21920 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  lumns from.  ** 
21930 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  that WhereLoop t
21940 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f  hat are in the O
21950 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
21960 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  re different for
21970 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20   every.  ** row 
21980 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
21990 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  .  Every one-row
219a0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75   WhereLoop is au
219b0 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
219c0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
219d0 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74     A WhereLoop t
219e0 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d  hat has no colum
219f0 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ns in the ORDER 
21a00 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69  BY clause.  ** i
21a10 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74  s not order-dist
21a20 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65  inct. To be orde
21a30 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f  r-distinct is no
21a40 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65  t quite the same
21a50 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55   as being.  ** U
21a60 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e  NIQUE since a UN
21a70 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69  IQUE column or i
21a80 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75  ndex can have mu
21a90 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74  ltiple rows that
21aa0 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20   .  ** are NULL 
21ab0 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  and NULL values 
21ac0 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  are equivalent f
21ad0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
21ae0 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  f order-distinct
21af0 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64  ..  ** To be ord
21b00 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65  er-distinct, the
21b10 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65   columns must be
21b20 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
21b30 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  NULL..  **.  ** 
21b40 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20  The rowid for a 
21b50 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  table is always 
21b60 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
21b70 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20  ULL so whenever 
21b80 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61  the.  ** rowid a
21b90 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52  ppears in the OR
21ba0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
21bb0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
21bc0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20   WhereLoop is.  
21bd0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
21be0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
21bf0 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  .  */..  assert(
21c00 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
21c10 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f    if( nLoop && O
21c20 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
21c30 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
21c40 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29  rderByIdxJoin) )
21c50 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f   return 0;..  nO
21c60 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
21c70 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74  y->nExpr;.  test
21c80 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d  case( nOrderBy==
21c90 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  BMS-1 );.  if( n
21ca0 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20  OrderBy>BMS-1 ) 
21cb0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
21cc0 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76  nnot optimize ov
21cd0 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52  erly large ORDER
21ce0 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65   BYs */.  isOrde
21cf0 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
21d00 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49   obDone = MASKBI
21d10 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20  T(nOrderBy)-1;. 
21d20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
21d30 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20  sk = 0;.  ready 
21d40 3d 20 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20  = 0;.  eqOpMask 
21d50 3d 20 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20  = WO_EQ | WO_IS 
21d60 7c 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69  | WO_ISNULL;.  i
21d70 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
21d80 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
21d90 4d 49 54 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c  MIT ) eqOpMask |
21da0 3d 20 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69  = WO_IN;.  for(i
21db0 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
21dc0 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
21dd0 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
21de0 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
21df0 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
21e00 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
21e10 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
21e20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f     if( iLoop<nLo
21e30 6f 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f  op ){.      pLoo
21e40 70 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  p = pPath->aLoop
21e50 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69  [iLoop];.      i
21e60 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
21e70 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
21e80 4d 49 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  MIT ) continue;.
21e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21ea0 20 70 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a   pLoop = pLast;.
21eb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
21ec0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21ed0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
21ee0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
21ef0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
21f00 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
21f10 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
21f20 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  reak;.    }else 
21f30 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
21f40 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
21f50 59 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  Y ){.      pLoop
21f60 2d 3e 75 2e 62 74 72 65 65 2e 6e 44 69 73 74 69  ->u.btree.nDisti
21f70 6e 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  nctCol = 0;.    
21f80 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49  }.    iCur = pWI
21f90 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
21fa0 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43  [pLoop->iTab].iC
21fb0 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d  ursor;..    /* M
21fc0 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45  ark off any ORDE
21fd0 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74  R BY term X that
21fe0 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
21ff0 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
22000 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
22010 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74  loop for which t
22020 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20  here is term in 
22030 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a  the WHERE.    **
22040 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
22050 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72  orm X IS NULL or
22060 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65   X=? that refere
22070 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20  nce only outer. 
22080 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20     ** loops..   
22090 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
220a0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
220b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53  ){.      if( MAS
220c0 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
220d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
220e0 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
220f0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
22100 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 4f 72 64  teAndLikely(pOrd
22110 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
22120 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  );.      if( pOB
22130 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
22140 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
22150 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
22160 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
22170 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22180 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
22190 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 26  3WhereFindTerm(&
221a0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75  pWInfo->sWC, iCu
221b0 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  r, pOBExpr->iCol
221c0 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
221d0 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65 61              ~rea
221e0 64 79 2c 20 65 71 4f 70 4d 61 73 6b 2c 20 30 29  dy, eqOpMask, 0)
221f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
22200 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
22210 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
22220 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
22230 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  IN ){.        /*
22240 20 49 4e 20 74 65 72 6d 73 20 61 72 65 20 6f 6e   IN terms are on
22250 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 73 6f 72  ly valid for sor
22260 74 69 6e 67 20 69 6e 20 74 68 65 20 4f 52 44 45  ting in the ORDE
22270 52 20 42 59 20 4c 49 4d 49 54 20 0a 20 20 20 20  R BY LIMIT .    
22280 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74      ** optimizat
22290 69 6f 6e 2c 20 61 6e 64 20 74 68 65 6e 20 6f 6e  ion, and then on
222a0 6c 79 20 69 66 20 74 68 65 79 20 61 72 65 20 61  ly if they are a
222b0 63 74 75 61 6c 6c 79 20 75 73 65 64 0a 20 20 20  ctually used.   
222c0 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 71       ** by the q
222d0 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 20  uery plan */.   
222e0 20 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74       assert( wct
222f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22300 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 3b  ORDERBY_LIMIT );
22310 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
22320 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  ; j<pLoop->nLTer
22330 6d 20 26 26 20 70 54 65 72 6d 21 3d 70 4c 6f 6f  m && pTerm!=pLoo
22340 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b  p->aLTerm[j]; j+
22350 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28  +){}.        if(
22360 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72   j>=pLoop->nLTer
22370 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  m ) continue;.  
22380 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22390 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
223a0 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29  r&(WO_EQ|WO_IS))
223b0 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e  !=0 && pOBExpr->
223c0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
223d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
223e0 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
223f0 68 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  h(pWInfo->pParse
22400 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
22410 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
22420 5b 69 5d 2e 70 45 78 70 72 2c 20 70 54 65 72 6d  [i].pExpr, pTerm
22430 2d 3e 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20  ->pExpr)==0 ){. 
22440 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
22450 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
22460 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
22470 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Term->pExpr->op=
22480 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
22490 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d  }.      obSat |=
224a0 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
224b0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f   }..    if( (pLo
224c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
224d0 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29  ERE_ONEROW)==0 )
224e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  {.      if( pLoo
224f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
22500 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20  RE_IPK ){.      
22510 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
22520 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
22530 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  0;.        nColu
22540 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  mn = 1;.      }e
22550 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20  lse if( (pIndex 
22560 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
22570 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70  .pIndex)==0 || p
22580 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
22590 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
225a0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
225b0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79  se{.        nKey
225c0 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b  Col = pIndex->nK
225d0 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e  eyCol;.        n
225e0 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
225f0 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
22600 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
22610 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20  n==nKeyCol+1 || 
22620 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
22630 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20  ->pTable) );.   
22640 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
22650 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
22660 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57  olumn-1]==XN_ROW
22670 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ID.             
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
22690 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
226a0 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  ->pTable));.    
226b0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
226c0 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e  nct = IsUniqueIn
226d0 64 65 78 28 70 49 6e 64 65 78 29 0a 20 20 20 20  dex(pIndex).    
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
22700 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
22710 5f 53 4b 49 50 53 43 41 4e 29 3d 3d 30 3b 0a 20  _SKIPSCAN)==0;. 
22720 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
22730 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
22740 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
22750 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20   index and deal 
22760 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20  with the ones.  
22770 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
22780 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  not constrained 
22790 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20  by == or IN..   
227a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20     */.      rev 
227b0 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20  = revSet = 0;.  
227c0 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
227d0 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  mns = 0;.      f
227e0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d  or(j=0; j<nColum
227f0 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
22800 20 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b 20 2f   u8 bOnce = 1; /
22810 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68  * True to run th
22820 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63  e ORDER BY searc
22830 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20  h loop */..     
22840 20 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 70 4c     assert( j>=pL
22850 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
22860 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
22870 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b   (pLoop->aLTerm[
22880 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f 6f 70  j]==0)==(j<pLoop
22890 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20 20 20  ->nSkip).       
228a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
228b0 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
228c0 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70  .nEq && j>=pLoop
228d0 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  ->nSkip ){.     
228e0 20 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70       u16 eOp = p
228f0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
22900 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20 20 20  >eOperator;..   
22910 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f         /* Skip o
22920 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 61 6e  ver == and IS an
22930 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73 2e 20  d ISNULL terms. 
22940 20 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e 20 74   (Also skip IN t
22950 65 72 6d 73 20 77 68 65 6e 0a 20 20 20 20 20 20  erms when.      
22960 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57 48 45      ** doing WHE
22970 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  RE_ORDERBY_LIMIT
22980 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 20 20 45   processing).  E
22990 78 63 65 70 74 2c 20 49 53 20 61 6e 64 20 49 53  xcept, IS and IS
229a0 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 2a  NULL.          *
229b0 2a 20 74 65 72 6d 73 20 69 6d 70 6c 79 20 74 68  * terms imply th
229c0 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
229d0 6e 6f 74 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  not UNIQUE NOT N
229e0 55 4c 4c 20 69 6e 20 77 68 69 63 68 20 63 61 73  ULL in which cas
229f0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
22a00 68 65 20 6c 6f 6f 70 20 6e 65 65 64 20 74 6f 20  he loop need to 
22a10 62 65 20 6d 61 72 6b 65 64 20 61 73 20 6e 6f 74  be marked as not
22a20 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
22a30 62 65 63 61 75 73 65 20 69 74 20 63 61 6e 0a 20  because it can. 
22a40 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65           ** have
22a50 20 72 65 70 65 61 74 65 64 20 4e 55 4c 4c 20 72   repeated NULL r
22a60 6f 77 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ows..          *
22a70 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
22a80 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  f the current te
22a90 72 6d 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6f  rm is a column o
22aa0 66 20 61 6e 20 28 28 3f 2c 3f 29 20 49 4e 20 28  f an ((?,?) IN (
22ab0 53 45 4c 45 43 54 2e 2e 2e 29 29 20 0a 20 20 20  SELECT...)) .   
22ac0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
22ad0 73 69 6f 6e 20 66 6f 72 20 77 68 69 63 68 20 74  sion for which t
22ae0 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
22af0 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
22b00 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  column,.        
22b10 20 20 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20    ** check that 
22b20 69 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63  it is the only c
22b30 6f 6c 75 6d 6e 20 75 73 65 64 20 62 79 20 74 68  olumn used by th
22b40 69 73 20 6c 6f 6f 70 2e 20 4f 74 68 65 72 77 69  is loop. Otherwi
22b50 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  se,.          **
22b60 20 69 66 20 69 74 20 69 73 20 6f 6e 65 20 6f 66   if it is one of
22b70 20 74 77 6f 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f   two or more, no
22b80 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ne of the column
22b90 73 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20  s can be.       
22ba0 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
22bb0 20 74 6f 20 6d 61 74 63 68 20 61 6e 20 4f 52 44   to match an ORD
22bc0 45 52 20 42 59 20 74 65 72 6d 2e 0a 20 20 20 20  ER BY term..    
22bd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22be0 20 20 20 69 66 28 20 28 65 4f 70 20 26 20 65 71     if( (eOp & eq
22bf0 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  OpMask)!=0 ){.  
22c00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f            if( eO
22c10 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  p & (WO_ISNULL|W
22c20 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 20  O_IS) ){.       
22c30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22c40 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
22c50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
22c60 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
22c70 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
22c80 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
22c90 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
22ca0 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ct );.          
22cb0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
22cc0 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
22cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22ce0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
22cf0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
22d00 66 28 20 41 4c 57 41 59 53 28 65 4f 70 20 26 20  f( ALWAYS(eOp & 
22d10 57 4f 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20  WO_IN) ){.      
22d20 20 20 20 20 20 20 2f 2a 20 41 4c 57 41 59 53 28        /* ALWAYS(
22d30 29 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 3a  ) justification:
22d40 20 65 4f 70 20 69 73 20 61 6e 20 65 71 75 61 6c   eOp is an equal
22d50 69 74 79 20 6f 70 65 72 61 74 6f 72 20 64 75 65  ity operator due
22d60 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
22d70 20 20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d 3e      ** j<pLoop->
22d80 75 2e 62 74 72 65 65 2e 6e 45 71 20 63 6f 6e 73  u.btree.nEq cons
22d90 74 72 61 69 6e 74 20 61 62 6f 76 65 2e 20 20 41  traint above.  A
22da0 6e 79 20 65 71 75 61 6c 69 74 79 20 6f 74 68 65  ny equality othe
22db0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
22dc0 20 74 68 61 6e 20 57 4f 5f 49 4e 20 69 73 20 63   than WO_IN is c
22dd0 61 70 74 75 72 65 64 20 62 79 20 74 68 65 20 70  aptured by the p
22de0 72 65 76 69 6f 75 73 20 22 69 66 22 2e 20 20 53  revious "if".  S
22df0 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20 20 20 20  o this one.     
22e00 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
22e10 20 68 61 73 20 74 6f 20 62 65 20 57 4f 5f 49 4e   has to be WO_IN
22e20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
22e30 20 45 78 70 72 20 2a 70 58 20 3d 20 70 4c 6f 6f   Expr *pX = pLoo
22e40 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70 45  p->aLTerm[j]->pE
22e50 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
22e60 20 66 6f 72 28 69 3d 6a 2b 31 3b 20 69 3c 70 4c   for(i=j+1; i<pL
22e70 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
22e80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
22e90 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
22ea0 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70  >aLTerm[i]->pExp
22eb0 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20  r==pX ){.       
22ec0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22ed0 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b   (pLoop->aLTerm[
22ee0 69 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  i]->eOperator & 
22ef0 57 4f 5f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20  WO_IN) );.      
22f00 20 20 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20            bOnce 
22f10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
22f20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22f30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22f50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22f60 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
22f70 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
22f80 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28  r in the table (
22f90 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72  iColumn) and sor
22fa0 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  t order.        
22fb0 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72 20  ** (revIdx) for 
22fc0 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20  the j-th column 
22fd0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
22fe0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22ff0 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
23000 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
23010 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
23020 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
23030 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65    revIdx = pInde
23040 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  x->aSortOrder[j]
23050 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52   & KEYINFO_ORDER
23060 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 20 20 20  _DESC;.         
23070 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
23080 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  ndex->pTable->iP
23090 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20  Key ) iColumn = 
230a0 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  XN_ROWID;.      
230b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
230c0 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f     iColumn = XN_
230d0 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20 20  ROWID;.         
230e0 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20   revIdx = 0;.   
230f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
23100 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69  /* An unconstrai
23110 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ned column that 
23120 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65  might be NULL me
23130 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20  ans that this.  
23140 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f        ** WhereLo
23150 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f  op is not well-o
23160 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
23170 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
23180 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20  OrderDistinct.  
23190 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d         && iColum
231a0 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  n>=0.         &&
231b0 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   j>=pLoop->u.btr
231c0 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
231d0 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  && pIndex->pTabl
231e0 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
231f0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20  .notNull==0.    
23200 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
23210 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
23220 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
23230 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  .        /* Find
23240 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
23250 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  rm that correspo
23260 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20  nds to the j-th 
23270 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a  column.        *
23280 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  * of the index a
23290 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44  nd mark that ORD
232a0 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a  ER BY term off .
232b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
232c0 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
232d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
232e0 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64   bOnce && i<nOrd
232f0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
23300 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
23310 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
23320 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23330 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
23340 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
23350 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 4f 72  ateAndLikely(pOr
23360 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
23370 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
23380 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
23390 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
233a0 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
233b0 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
233c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
233d0 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
233e0 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
233f0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
23400 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
23410 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
23420 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
23430 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
23440 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  XN_ROWID ){.    
23450 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
23460 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
23470 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
23480 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
23490 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
234a0 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
234b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
234c0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
234d0 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  n!=iColumn ) con
234e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
234f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23500 20 20 20 20 45 78 70 72 20 2a 70 49 64 78 45 78      Expr *pIdxEx
23510 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f  pr = pIndex->aCo
23520 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70  lExpr->a[j].pExp
23530 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  r;.            i
23540 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
23550 6d 70 61 72 65 53 6b 69 70 28 70 4f 42 45 78 70  mpareSkip(pOBExp
23560 72 2c 20 70 49 64 78 45 78 70 72 2c 20 69 43 75  r, pIdxExpr, iCu
23570 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
23580 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
23590 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
235a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
235b0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 21 3d 58    if( iColumn!=X
235c0 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  N_ROWID ){.     
235d0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
235e0 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
235f0 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
23600 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
23610 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
23620 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
23630 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
23640 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e  >zName, pIndex->
23650 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20  azColl[j])!=0 ) 
23660 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23680 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
23690 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
236a0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
236b0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
236c0 6e 44 69 73 74 69 6e 63 74 43 6f 6c 20 3d 20 6a  nDistinctCol = j
236d0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  +1;.          }.
236e0 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63            isMatc
236f0 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
23700 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23710 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
23720 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46  Match && (wctrlF
23730 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
23740 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  UPBY)==0 ){.    
23750 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
23760 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  re the sort orde
23770 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  r is compatible 
23780 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
23790 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20  lause..         
237a0 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69   ** Sort order i
237b0 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
237c0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
237d0 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
237e0 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20   if( revSet ){. 
237f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
23800 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 28  rev ^ revIdx)!=(
23810 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
23820 6f 72 74 46 6c 61 67 73 26 4b 45 59 49 4e 46 4f  ortFlags&KEYINFO
23830 5f 4f 52 44 45 52 5f 44 45 53 43 29 20 29 7b 0a  _ORDER_DESC) ){.
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
23850 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
23860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23880 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49        rev = revI
23890 64 78 20 5e 20 28 70 4f 72 64 65 72 42 79 2d 3e  dx ^ (pOrderBy->
238a0 61 5b 69 5d 2e 73 6f 72 74 46 6c 61 67 73 20 26  a[i].sortFlags &
238b0 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 44   KEYINFO_ORDER_D
238c0 45 53 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ESC);.          
238d0 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65    if( rev ) *pRe
238e0 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  vMask |= MASKBIT
238f0 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  (iLoop);.       
23900 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b       revSet = 1;
23910 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23930 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 70  f( isMatch && (p
23940 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
23950 72 74 46 6c 61 67 73 20 26 20 4b 45 59 49 4e 46  rtFlags & KEYINF
23960 4f 5f 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 29  O_ORDER_BIGNULL)
23970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
23980 28 20 6a 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ( j==pLoop->u.bt
23990 72 65 65 2e 6e 45 71 20 29 7b 0a 20 20 20 20 20  ree.nEq ){.     
239a0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73         pLoop->ws
239b0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42  Flags |= WHERE_B
239c0 49 47 4e 55 4c 4c 5f 53 4f 52 54 3b 0a 20 20 20  IGNULL_SORT;.   
239d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
239e0 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63            isMatc
239f0 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
23a00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23a10 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
23a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
23a30 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f  ( iColumn==XN_RO
23a40 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  WID ){.         
23a50 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73     testcase( dis
23a60 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20  tinctColumns==0 
23a70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  );.            d
23a80 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
23a90 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
23aa0 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
23ab0 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
23ac0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23ad0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61          /* No ma
23ae0 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20  tch found */.   
23af0 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
23b00 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a  || j<nKeyCol ){.
23b10 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
23b20 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
23b30 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  tinct!=0 );.    
23b40 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
23b50 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
23b60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23b70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23b80 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65    }.      } /* e
23b90 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  nd Loop over all
23ba0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a   index columns *
23bb0 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74  /.      if( dist
23bc0 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20  inctColumns ){. 
23bd0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23be0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
23bf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
23c00 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
23c10 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
23c20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20  } /* end-if not 
23c30 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20  one-row */..    
23c40 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20  /* Mark off any 
23c50 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74  other ORDER BY t
23c60 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65  erms that refere
23c70 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20  nce pLoop */.   
23c80 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
23c90 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72  inct ){.      or
23ca0 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
23cb0 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
23cc0 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lf;.      for(i=
23cd0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
23ce0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
23cf0 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69  r *p;.        Bi
23d00 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20  tmask mTerm;.   
23d10 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
23d20 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
23d30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
23d40 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  p = pOrderBy->a[
23d50 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
23d60 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    mTerm = sqlite
23d70 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28  3WhereExprUsage(
23d80 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
23d90 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  t,p);.        if
23da0 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73  ( mTerm==0 && !s
23db0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
23dc0 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e  tant(p) ) contin
23dd0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
23de0 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73  (mTerm&~orderDis
23df0 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b  tinctMask)==0 ){
23e00 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
23e10 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
23e20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23e30 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45  }.    }.  } /* E
23e40 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72  nd the loop over
23e50 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20   all WhereLoops 
23e60 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20  from outer-most 
23e70 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f  down to inner-mo
23e80 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61  st */.  if( obSa
23e90 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75  t==obDone ) retu
23ea0 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b  rn (i8)nOrderBy;
23eb0 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 44  .  if( !isOrderD
23ec0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66  istinct ){.    f
23ed0 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b  or(i=nOrderBy-1;
23ee0 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
23ef0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41    Bitmask m = MA
23f00 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20  SKBIT(i) - 1;.  
23f10 20 20 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d      if( (obSat&m
23f20 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b  )==m ) return i;
23f30 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
23f40 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
23f50 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n -1;.}.../*.** 
23f60 49 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  If the WHERE_GRO
23f70 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
23f80 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73   in the mask pas
23f90 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
23fa0 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74  ereBegin(),.** t
23fb0 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d  he planner assum
23fc0 65 73 20 74 68 61 74 20 74 68 65 20 73 70 65 63  es that the spec
23fd0 69 66 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c  ified pOrderBy l
23fe0 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ist is actually 
23ff0 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c  a GROUP.** BY cl
24000 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e  ause - and so an
24010 79 20 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f  y order that gro
24020 75 70 73 20 72 6f 77 73 20 61 73 20 72 65 71 75  ups rows as requ
24030 69 72 65 64 20 73 61 74 69 73 66 69 65 73 20 74  ired satisfies t
24040 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a  he.** request..*
24050 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
24060 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
24070 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
24080 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  or the caller to
24090 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68   determine.** wh
240a0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
240b0 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79   rows are really
240c0 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64   being delivered
240d0 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
240e0 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20  , or.** just in 
240f0 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72  some other order
24100 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 74   that provides t
24110 68 65 20 72 65 71 75 69 72 65 64 20 67 72 6f 75  he required grou
24120 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a  ping. However,.*
24130 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 53  * if the WHERE_S
24140 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20  ORTBYGROUP flag 
24150 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74  is also passed t
24160 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
24170 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  gin(), then.** t
24180 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
24190 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   be called on th
241a0 65 20 72 65 74 75 72 6e 65 64 20 57 68 65 72 65  e returned Where
241b0 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20  Info object. It 
241c0 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20  returns.** true 
241d0 69 66 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c  if the rows real
241e0 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65  ly will be sorte
241f0 64 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  d in the specifi
24200 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c  ed order, or fal
24210 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  se.** otherwise.
24220 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
24230 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a  le, assuming:.**
24240 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
24250 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59  EX i1 ON t1(x, Y
24260 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a  );.**.** then.**
24270 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
24280 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
24290 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79  x,y ORDER BY x,y
242a0 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28  ;   -- IsSorted(
242b0 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54  )==1.**   SELECT
242c0 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50   * FROM t1 GROUP
242d0 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59   BY y,x ORDER BY
242e0 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72   y,x;   -- IsSor
242f0 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20  ted()==0.*/.int 
24300 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f  sqlite3WhereIsSo
24310 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a  rted(WhereInfo *
24320 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72  pWInfo){.  asser
24330 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  t( pWInfo->wctrl
24340 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
24350 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72  OUPBY );.  asser
24360 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  t( pWInfo->wctrl
24370 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f  Flags & WHERE_SO
24380 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72  RTBYGROUP );.  r
24390 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f  eturn pWInfo->so
243a0 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rted;.}..#ifdef 
243b0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
243c0 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67  ED./* For debugg
243d0 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f  ing use only: */
243e0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
243f0 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d  ar *wherePathNam
24400 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61  e(WherePath *pPa
24410 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57  th, int nLoop, W
24420 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29  hereLoop *pLast)
24430 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
24440 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74  zName[65];.  int
24450 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
24460 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e  <nLoop; i++){ zN
24470 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e  ame[i] = pPath->
24480 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d  aLoop[i]->cId; }
24490 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a  .  if( pLast ) z
244a0 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73  Name[i++] = pLas
244b0 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b  t->cId;.  zName[
244c0 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  i] = 0;.  return
244d0 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66   zName;.}.#endif
244e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
244f0 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  he cost of sorti
24500 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73  ng nRow rows, as
24510 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20  suming that the 
24520 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f  keys have .** nO
24530 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61  rderby columns a
24540 6e 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  nd that the firs
24550 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e  t nSorted column
24560 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
24570 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  .** order..*/.st
24580 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
24590 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20  eSortingCost(.  
245a0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
245b0 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77  o,.  LogEst nRow
245c0 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ,.  int nOrderBy
245d0 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a  ,.  int nSorted.
245e0 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  ){.  /* TUNING: 
245f0 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f  Estimated cost o
24600 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61  f a full externa
24610 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20  l sort, where N 
24620 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d  is .  ** the num
24630 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73  ber of rows to s
24640 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ort is:.  **.  *
24650 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20  *   cost = (3.0 
24660 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20  * N * log(N)).. 
24670 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66   ** .  ** Or, if
24680 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c   the order-by cl
24690 61 75 73 65 20 68 61 73 20 58 20 74 65 72 6d 73  ause has X terms
246a0 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61   but only the la
246b0 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73  st Y .  ** terms
246c0 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65   are out of orde
246d0 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f  r, then block-so
246e0 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63  rting will reduc
246f0 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74  e the .  ** sort
24700 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a  ing cost to:.  *
24710 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
24720 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
24730 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a  )) * (Y/X).  **.
24740 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74    ** The (Y/X) t
24750 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  erm is implement
24760 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76  ed using stack v
24770 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20  ariable rScale. 
24780 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20   ** below.  */. 
24790 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20   LogEst rScale, 
247a0 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73  rSortCost;.  ass
247b0 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20  ert( nOrderBy>0 
247c0 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  && 66==sqlite3Lo
247d0 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72  gEst(100) );.  r
247e0 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c  Scale = sqlite3L
247f0 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d  ogEst((nOrderBy-
24800 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72  nSorted)*100/nOr
24810 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72  derBy) - 66;.  r
24820 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20  SortCost = nRow 
24830 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a  + rScale + 16;..
24840 20 20 2f 2a 20 4d 75 6c 74 69 70 6c 65 20 62 79    /* Multiple by
24850 20 6c 6f 67 28 4d 29 20 77 68 65 72 65 20 4d 20   log(M) where M 
24860 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
24870 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a 20 20   output rows..  
24880 2a 2a 20 55 73 65 20 74 68 65 20 4c 49 4d 49 54  ** Use the LIMIT
24890 20 66 6f 72 20 4d 20 69 66 20 69 74 20 69 73 20   for M if it is 
248a0 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28  smaller */.  if(
248b0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
248c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45  lags & WHERE_USE
248d0 5f 4c 49 4d 49 54 29 21 3d 30 20 26 26 20 70 57  _LIMIT)!=0 && pW
248e0 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f  Info->iLimit<nRo
248f0 77 20 29 7b 0a 20 20 20 20 6e 52 6f 77 20 3d 20  w ){.    nRow = 
24900 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a  pWInfo->iLimit;.
24910 20 20 7d 0a 20 20 72 53 6f 72 74 43 6f 73 74 20    }.  rSortCost 
24920 2b 3d 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b  += estLog(nRow);
24930 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43  .  return rSortC
24940 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ost;.}../*.** Gi
24950 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ven the list of 
24960 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
24970 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  s at pWInfo->pLo
24980 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ops, this routin
24990 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  e.** attempts to
249a0 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   find the lowest
249b0 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20   cost path that 
249c0 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72  visits each Wher
249d0 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20  eLoop.** once.  
249e0 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65  This path is the
249f0 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68  n loaded into th
24a00 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57  e pWInfo->a[].pW
24a10 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a  Loop fields..**.
24a20 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74  ** Assume that t
24a30 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
24a40 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74  of output rows t
24a50 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  hat will need to
24a60 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69   be sorted.** wi
24a70 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69  ll be nRowEst (i
24a80 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65  n the 10*log2 re
24a90 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20  presentation).  
24aa0 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69  Or, ignore sorti
24ab0 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e  ng.** costs if n
24ac0 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  RowEst==0..**.**
24ad0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
24ae0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
24af0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20  SQLITE_NOMEM of 
24b00 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
24b10 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  ion.** error occ
24b20 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
24b30 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76  nt wherePathSolv
24b40 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  er(WhereInfo *pW
24b50 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f  Info, LogEst nRo
24b60 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43  wEst){.  int mxC
24b70 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20  hoice;          
24b80 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
24b90 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e  mber of simultan
24ba0 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b  eous paths track
24bb0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ed */.  int nLoo
24bc0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
24bd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
24be0 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  erms in the join
24bf0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
24c00 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
24c10 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
24c20 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
24c30 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
24c40 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
24c50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
24c60 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
24c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
24c80 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72  oop counter over
24c90 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
24ca0 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  e join */.  int 
24cb0 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20  ii, jj;         
24cc0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
24cd0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
24ce0 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mxI = 0;        
24cf0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
24d00 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20  f next entry to 
24d10 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74  replace */.  int
24d20 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
24d30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24d40 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61   of ORDER BY cla
24d50 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c  use terms */.  L
24d60 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30  ogEst mxCost = 0
24d70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  ;        /* Maxi
24d80 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65  mum cost of a se
24d90 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20  t of paths */.  
24da0 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65  LogEst mxUnsorte
24db0 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78  d = 0;    /* Max
24dc0 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f  imum unsorted co
24dd0 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
24de0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  ath */.  int nTo
24df0 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  , nFrom;        
24e00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24e10 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e  valid entries in
24e20 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d   aTo[] and aFrom
24e30 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  [] */.  WherePat
24e40 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *aFrom;       
24e50 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70    /* All nFrom p
24e60 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76  aths at the prev
24e70 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  ious level */.  
24e80 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20  WherePath *aTo; 
24e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24ea0 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20   nTo best paths 
24eb0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
24ec0 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
24ed0 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20  ath *pFrom;     
24ee0 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
24ef0 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61  t of aFrom[] tha
24f00 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
24f10 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61   on */.  WherePa
24f20 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20  th *pTo;        
24f30 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
24f40 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77   of aTo[] that w
24f50 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
24f60 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
24f70 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  *pWLoop;        
24f80 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68  /* One of the Wh
24f90 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
24fa0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
24fb0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *pX;           /
24fc0 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75  * Used to divy u
24fd0 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d  p the pSpace mem
24fe0 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ory */.  LogEst 
24ff0 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20  *aSortCost = 0; 
25000 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e     /* Sorting an
25010 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e  d partial sortin
25020 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61  g costs */.  cha
25030 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  r *pSpace;      
25040 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
25050 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ary memory used 
25060 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
25070 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b  */.  int nSpace;
25080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25090 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
250a0 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53   allocated at pS
250b0 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73  pace */..  pPars
250c0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
250d0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
250e0 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d  e->db;.  nLoop =
250f0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
25100 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f  .  /* TUNING: Fo
25110 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73  r simple queries
25120 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20  , only the best 
25130 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e  path is tracked.
25140 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20  .  ** For 2-way 
25150 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73  joins, the 5 bes
25160 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c  t paths are foll
25170 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a  owed..  ** For j
25180 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72  oins of 3 or mor
25190 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20  e tables, track 
251a0 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68  the 10 best path
251b0 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20  s */.  mxChoice 
251c0 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31  = (nLoop<=1) ? 1
251d0 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35   : (nLoop==2 ? 5
251e0 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74   : 10);.  assert
251f0 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d  ( nLoop<=pWInfo-
25200 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  >pTabList->nSrc 
25210 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
25220 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65  0x002, ("---- be
25230 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52  gin solver.  (nR
25240 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52  owEst=%d)\n", nR
25250 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49  owEst));..  /* I
25260 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72  f nRowEst is zer
25270 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  o and there is a
25280 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
25290 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e  e, ignore it. In
252a0 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20   this.  ** case 
252b0 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74  the purpose of t
252c0 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65  his call is to e
252d0 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
252e0 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72  er of rows retur
252f0 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  ned.  ** by the 
25300 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f  overall query. O
25310 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74  nce this estimat
25320 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  e has been obtai
25330 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a  ned, the caller.
25340 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65    ** will invoke
25350 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
25360 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61   second time, pa
25370 73 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61  ssing the estima
25380 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e  te as the.  ** n
25390 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72  RowEst parameter
253a0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  .  */.  if( pWIn
253b0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
253c0 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b  || nRowEst==0 ){
253d0 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
253e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
253f0 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66  nOrderBy = pWInf
25400 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
25410 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  pr;.  }..  /* Al
25420 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
25430 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20  alize space for 
25440 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61  aTo, aFrom and a
25450 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20  SortCost[] */.  
25460 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66  nSpace = (sizeof
25470 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65  (WherePath)+size
25480 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e  of(WhereLoop*)*n
25490 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32  Loop)*mxChoice*2
254a0 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69  ;.  nSpace += si
254b0 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e  zeof(LogEst) * n
254c0 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63  OrderBy;.  pSpac
254d0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
254e0 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70  locRawNN(db, nSp
254f0 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61  ace);.  if( pSpa
25500 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
25510 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
25520 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65  ;.  aTo = (Where
25530 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20  Path*)pSpace;.  
25540 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68  aFrom = aTo+mxCh
25550 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61  oice;.  memset(a
25560 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  From, 0, sizeof(
25570 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58  aFrom[0]));.  pX
25580 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29   = (WhereLoop**)
25590 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29  (aFrom+mxChoice)
255a0 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f  ;.  for(ii=mxCho
255b0 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f  ice*2, pFrom=aTo
255c0 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46  ; ii>0; ii--, pF
255d0 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f  rom++, pX += nLo
255e0 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  op){.    pFrom->
255f0 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a  aLoop = pX;.  }.
25600 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29    if( nOrderBy )
25610 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
25620 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
25630 20 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69   clause and it i
25640 73 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f  s not being igno
25650 72 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20  red, set up.    
25660 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
25670 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72   aSortCost[] arr
25680 61 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74  ay. Each element
25690 20 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73   of the aSortCos
256a0 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69  t array.    ** i
256b0 73 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20  s either zero - 
256c0 6d 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e  meaning it has n
256d0 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74  ot yet been init
256e0 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65  ialized - or the
256f0 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20  .    ** cost of 
25700 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20  sorting nRowEst 
25710 72 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68 65  rows of data whe
25720 72 65 20 74 68 65 20 66 69 72 73 74 20 58 20 74  re the first X t
25730 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  erms of.    ** t
25740 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
25750 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  se are already i
25760 6e 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58  n order, where X
25770 20 69 73 20 74 68 65 20 61 72 72 61 79 20 0a 20   is the array . 
25780 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f     ** index.  */
25790 0a 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d  .    aSortCost =
257a0 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20   (LogEst*)pX;.  
257b0 20 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f    memset(aSortCo
257c0 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f  st, 0, sizeof(Lo
257d0 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79  gEst) * nOrderBy
257e0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
257f0 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c   aSortCost==0 ||
25800 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d   &pSpace[nSpace]
25810 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43  ==(char*)&aSortC
25820 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b  ost[nOrderBy] );
25830 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74  .  assert( aSort
25840 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61  Cost!=0 || &pSpa
25850 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61  ce[nSpace]==(cha
25860 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53  r*)pX );..  /* S
25870 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77  eed the search w
25880 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65  ith a single Whe
25890 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e  rePath containin
258a0 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70  g zero WhereLoop
258b0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e  s..  **.  ** TUN
258c0 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20  ING: Do not let 
258d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74  the number of it
258e0 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76  erations go abov
258f0 65 20 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f  e 28.  If the co
25900 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75  st.  ** of compu
25910 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ting an automati
25920 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70  c index is not p
25930 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20  aid back within 
25940 74 68 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a  the first 28.  *
25950 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20  * rows, then do 
25960 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f  not use the auto
25970 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a  matic index. */.
25980 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20    aFrom[0].nRow 
25990 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51  = MIN(pParse->nQ
259a0 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20  ueryLoop, 48);  
259b0 61 73 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69  assert( 48==sqli
259c0 74 65 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b  te3LogEst(28) );
259d0 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20  .  nFrom = 1;.  
259e0 61 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d  assert( aFrom[0]
259f0 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b  .isOrdered==0 );
25a00 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20  .  if( nOrderBy 
25a10 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f  ){.    /* If nLo
25a20 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  op is zero, then
25a30 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52   there are no FR
25a40 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  OM terms in the 
25a50 71 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20  query. Since.   
25a60 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65   ** in this case
25a70 20 74 68 65 20 71 75 65 72 79 20 6d 61 79 20 72   the query may r
25a80 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20  eturn a maximum 
25a90 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20  of one row, the 
25aa0 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61  results.    ** a
25ab0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
25ac0 65 20 72 65 71 75 65 73 74 65 64 20 6f 72 64 65  e requested orde
25ad0 72 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65 64  r. Set isOrdered
25ae0 20 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a   to nOrderBy to.
25af0 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20      ** indicate 
25b00 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f  this. Or, if nLo
25b10 6f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  op is greater th
25b20 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f  an zero, set isO
25b30 72 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a  rdered to.    **
25b40 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20   -1, indicating 
25b50 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
25b60 73 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  set may or may n
25b70 6f 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a  ot be ordered, .
25b80 20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67      ** depending
25b90 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64   on the loops ad
25ba0 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
25bb0 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20  nt plan.  */.   
25bc0 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
25bd0 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20  red = nLoop>0 ? 
25be0 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20  -1 : nOrderBy;. 
25bf0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
25c00 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f   successively lo
25c10 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20  nger WherePaths 
25c20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f  using the previo
25c30 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  us generation.  
25c40 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73  ** of WherePaths
25c50 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f   as the basis fo
25c60 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65  r the next.  Kee
25c70 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d  p track of the m
25c80 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73  xChoice.  ** bes
25c90 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20  t paths at each 
25ca0 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
25cb0 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
25cc0 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
25cd0 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b  +){.    nTo = 0;
25ce0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  .    for(ii=0, p
25cf0 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e  From=aFrom; ii<n
25d00 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f  From; ii++, pFro
25d10 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  m++){.      for(
25d20 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70  pWLoop=pWInfo->p
25d30 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70  Loops; pWLoop; p
25d40 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e  WLoop=pWLoop->pN
25d50 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20  extLoop){.      
25d60 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20    LogEst nOut;  
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d80 20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69      /* Rows visi
25d90 74 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57  ted by (pFrom+pW
25da0 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
25db0 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20   LogEst rCost;  
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61     /* Cost of pa
25de0 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  th (pFrom+pWLoop
25df0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67  ) */.        Log
25e00 45 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20  Est rUnsorted;  
25e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e20 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20  * Unsorted cost 
25e30 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  of (pFrom+pWLoop
25e40 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20  ) */.        i8 
25e50 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f  isOrdered = pFro
25e60 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f  m->isOrdered;  /
25e70 2a 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20  * isOrdered for 
25e80 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
25e90 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  /.        Bitmas
25ea0 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20  k maskNew;      
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
25ec0 61 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74  ask of src visit
25ed0 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20  ed by (..) */.  
25ee0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65        Bitmask re
25ef0 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20  vMask = 0;      
25f00 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
25f10 6f 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f  of rev-order loo
25f20 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a  ps for (..) */..
25f30 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
25f40 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70  oop->prereq & ~p
25f50 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
25f60 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
25f70 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
25f80 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70  op->maskSelf & p
25f90 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
25fa0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
25fb0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
25fc0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
25fd0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
25fe0 3d 30 20 26 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f  =0 && pFrom->nRo
25ff0 77 3c 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20  w<3 ){.         
26000 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 61   /* Do not use a
26010 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
26020 78 20 69 66 20 74 68 65 20 74 68 69 73 20 6c 6f  x if the this lo
26030 6f 70 20 69 73 20 65 78 70 65 63 74 65 64 0a 20  op is expected. 
26040 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72           ** to r
26050 75 6e 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 32  un less than 1.2
26060 35 20 74 69 6d 65 73 2e 20 20 49 74 20 69 73 20  5 times.  It is 
26070 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c 73 6f  tempting to also
26080 20 65 78 63 6c 75 64 65 0a 20 20 20 20 20 20 20   exclude.       
26090 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
260a0 69 6e 64 65 78 20 75 73 61 67 65 20 6f 6e 20 61  index usage on a
260b0 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 62 75  n outer loop, bu
260c0 74 20 73 6f 6d 65 74 69 6d 65 73 20 61 6e 20 61  t sometimes an a
260d0 75 74 6f 6d 61 74 69 63 0a 20 20 20 20 20 20 20  utomatic.       
260e0 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 75     ** index is u
260f0 73 65 66 75 6c 20 69 6e 20 74 68 65 20 6f 75 74  seful in the out
26100 65 72 20 6c 6f 6f 70 20 6f 66 20 61 20 63 6f 72  er loop of a cor
26110 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
26120 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
26130 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
26140 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
26150 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
26160 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  e;.        }..  
26170 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
26180 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
26190 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
261a0 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
261b0 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
261c0 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
261d0 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f  */.        rUnso
261e0 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rted = sqlite3Lo
261f0 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e  gEstAdd(pWLoop->
26200 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72  rSetup,pWLoop->r
26210 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Run + pFrom->nRo
26220 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73  w);.        rUns
26230 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
26240 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
26250 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f  ed, pFrom->rUnso
26260 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e  rted);.        n
26270 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
26280 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w + pWLoop->nOut
26290 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
262a0 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
262b0 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
262c0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
262d0 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20  if( isOrdered<0 
262e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
262f0 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61  rdered = wherePa
26300 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
26310 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26330 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
26340 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
26350 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26370 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
26380 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a  oop, &revMask);.
26390 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
263a0 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
263b0 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
263c0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
263d0 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
263e0 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72  ed>=0 && isOrder
263f0 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  ed<nOrderBy ){. 
26400 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 6f           if( aSo
26410 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
26420 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
26430 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
26440 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65  Ordered] = where
26450 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20  SortingCost(.   
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
26470 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f  nfo, nRowEst, nO
26480 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65  rderBy, isOrdere
26490 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  d.            );
264a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
264b0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
264c0 3a 20 20 41 64 64 20 61 20 73 6d 61 6c 6c 20 65  :  Add a small e
264d0 78 74 72 61 20 70 65 6e 61 6c 74 79 20 28 35 29  xtra penalty (5)
264e0 20 74 6f 20 73 6f 72 74 69 6e 67 20 61 73 20 61   to sorting as a
264f0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  n.          ** e
26500 78 74 72 61 20 65 6e 63 6f 75 72 61 67 6d 65 6e  xtra encouragmen
26510 74 20 74 6f 20 74 68 65 20 71 75 65 72 79 20 70  t to the query p
26520 6c 61 6e 6e 65 72 20 74 6f 20 73 65 6c 65 63 74  lanner to select
26530 20 61 20 70 6c 61 6e 0a 20 20 20 20 20 20 20 20   a plan.        
26540 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 72    ** where the r
26550 6f 77 73 20 65 6d 65 72 67 65 20 69 6e 20 74 68  ows emerge in th
26560 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20  e correct order 
26570 77 69 74 68 6f 75 74 20 61 6e 79 20 73 6f 72 74  without any sort
26580 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
26590 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
265a0 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
265b0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
265c0 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72  (rUnsorted, aSor
265d0 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
265e0 29 20 2b 20 35 3b 0a 0a 20 20 20 20 20 20 20 20  ) + 5;..        
265f0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
26600 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  02,.            
26610 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f    ("---- sort co
26620 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20  st=%-3d (%d/%d) 
26630 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 25  increases cost %
26640 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20  3d to %-3d\n",. 
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
26660 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
26670 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73  d], (nOrderBy-is
26680 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72  Ordered), nOrder
26690 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  By, .           
266a0 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72      rUnsorted, r
266b0 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20  Cost));.        
266c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
266d0 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74   rCost = rUnsort
266e0 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 72 55  ed;.          rU
266f0 6e 73 6f 72 74 65 64 20 2d 3d 20 32 3b 20 20 2f  nsorted -= 2;  /
26700 2a 20 54 55 4e 49 4e 47 3a 20 20 53 6c 69 67 68  * TUNING:  Sligh
26710 74 20 62 69 61 73 20 69 6e 20 66 61 76 6f 72 20  t bias in favor 
26720 6f 66 20 6e 6f 2d 73 6f 72 74 20 70 6c 61 6e 73  of no-sort plans
26730 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   */.        }.. 
26740 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
26750 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70  to see if pWLoop
26760 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64   should be added
26770 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20   to the set of. 
26780 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69         ** mxChoi
26790 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ce best-so-far p
267a0 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  aths..        **
267b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73  .        ** Firs
267c0 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78  t look for an ex
267d0 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e  isting path amon
267e0 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  g best-so-far pa
267f0 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ths.        ** t
26800 68 61 74 20 63 6f 76 65 72 73 20 74 68 65 20 73  hat covers the s
26810 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73  ame set of loops
26820 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
26830 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20  e isOrdered.    
26840 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61      ** setting a
26850 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  s the current pa
26860 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20  th candidate..  
26870 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26880 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28   ** The term "((
26890 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
268a0 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
268b0 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e  =0" is equivalen
268c0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  t.        ** to 
268d0 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d  (pTo->isOrdered=
268e0 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72  =(-1))==(isOrder
268f0 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74  ed==(-1))" for t
26900 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20  he range.       
26910 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c   ** of legal val
26920 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65  ues for isOrdere
26930 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20  d, -1..64..     
26940 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f     */.        fo
26950 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(jj=0, pTo=aTo;
26960 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70   jj<nTo; jj++, p
26970 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
26980 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f   if( pTo->maskLo
26990 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20  op==maskNew.    
269a0 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d         && ((pTo-
269b0 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64  >isOrdered^isOrd
269c0 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20  ered)&0x80)==0. 
269d0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
269e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
269f0 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20  ( jj==nTo-1 );. 
26a00 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
26a10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26a30 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20  if( jj>=nTo ){. 
26a40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65           /* None
26a50 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67   of the existing
26a60 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
26a70 68 73 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e  hs match the can
26a80 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  didate. */.     
26a90 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
26aa0 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20  Choice.         
26ab0 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f    && (rCost>mxCo
26ac0 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78  st || (rCost==mx
26ad0 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65  Cost && rUnsorte
26ae0 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a  d>=mxUnsorted)).
26af0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
26b00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26b10 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74  current candidat
26b20 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74  e is no better t
26b30 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d  han any of the m
26b40 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20  xChoice.        
26b50 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72      ** paths cur
26b60 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65  rently in the be
26b70 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72  st-so-far buffer
26b80 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20  .  So discard.  
26b90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
26ba0 73 20 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e  s candidate as n
26bb0 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69  ot viable. */.#i
26bc0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
26bd0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
26be0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
26bf0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
26c00 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
26c10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26c20 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69  DebugPrintf("Ski
26c30 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
26c40 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  ,%3d,%3d order=%
26c50 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
26c60 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
26c70 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
26c80 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
26c90 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72  st, nOut, rUnsor
26ca0 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
26cb0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
26cc0 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
26cd0 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
26ce0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
26cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
26d00 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
26d10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
26d20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
26d30 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73   points it means
26d40 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 61   that the new ca
26d50 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20 20 20  ndidate path.   
26d60 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20         ** needs 
26d70 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
26d80 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73  he set of best-s
26d90 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a  o-far paths. */.
26da0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
26db0 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  o<mxChoice ){.  
26dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
26dd0 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
26de0 66 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79  f the aTo set by
26df0 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20   one */.        
26e00 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a      jj = nTo++;.
26e10 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
26e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
26e30 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65  New path replace
26e40 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73  s the prior wors
26e50 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20  t to keep count 
26e60 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a  below mxChoice *
26e70 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
26e80 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20   = mxI;.        
26e90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54    }.          pT
26ea0 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69  o = &aTo[jj];.#i
26eb0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
26ec0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
26ed0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
26ee0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
26ef0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
26f00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
26f10 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20  gPrintf("New    
26f20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
26f30 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
26f40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26f50 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
26f60 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
26f70 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
26f80 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20  ut, rUnsorted,. 
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26fa0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
26fb0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
26fc0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
26fd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
26fe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26ff0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
27000 65 73 20 68 65 72 65 20 69 66 20 62 65 73 74 2d  es here if best-
27010 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d  so-far path pTo=
27020 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74  aTo[jj] covers t
27030 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
27040 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70  same set of loop
27050 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  s and has the sa
27060 6d 65 20 69 73 4f 72 64 65 72 65 64 20 73 65 74  me isOrdered set
27070 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20  ting as the.    
27080 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61        ** candida
27090 74 65 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20  te path.  Check 
270a0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 61  to see if the ca
270b0 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72  ndidate should r
270c0 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20  eplace.         
270d0 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68   ** pTo or if th
270e0 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75  e candidate shou
270f0 6c 64 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  ld be skipped.. 
27100 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20           ** .   
27110 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f         ** The co
27120 6e 64 69 74 69 6f 6e 61 6c 20 69 73 20 61 6e 20  nditional is an 
27130 65 78 70 61 6e 64 65 64 20 76 65 63 74 6f 72 20  expanded vector 
27140 63 6f 6d 70 61 72 69 73 6f 6e 20 65 71 75 69 76  comparison equiv
27150 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 20 20 20 20  alent to:.      
27160 20 20 20 20 2a 2a 20 20 20 28 70 54 6f 2d 3e 72      **   (pTo->r
27170 43 6f 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77 2c 70  Cost,pTo->nRow,p
27180 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 29 20 3c  To->rUnsorted) <
27190 3d 20 28 72 43 6f 73 74 2c 6e 4f 75 74 2c 72 55  = (rCost,nOut,rU
271a0 6e 73 6f 72 74 65 64 29 0a 20 20 20 20 20 20 20  nsorted).       
271b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
271c0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72  if( pTo->rCost<r
271d0 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  Cost .          
271e0 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d   || (pTo->rCost=
271f0 3d 72 43 6f 73 74 0a 20 20 20 20 20 20 20 20 20  =rCost.         
27200 20 20 20 20 20 20 26 26 20 28 70 54 6f 2d 3e 6e        && (pTo->n
27210 52 6f 77 3c 6e 4f 75 74 0a 20 20 20 20 20 20 20  Row<nOut.       
27220 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
27230 70 54 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75 74 20  pTo->nRow==nOut 
27240 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65  && pTo->rUnsorte
27250 64 3c 3d 72 55 6e 73 6f 72 74 65 64 29 0a 20 20  d<=rUnsorted).  
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27270 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
27280 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 23  ).          ){.#
27290 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
272a0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
272b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
272c0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
272d0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
272e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
272f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27310 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
27320 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
27330 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
27340 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
27350 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
27360 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
27370 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73  Cost, nOut, rUns
27380 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  orted,.         
27390 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
273a0 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
273b0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
273c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
273d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
273e0 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d     vs %s cost=%-
273f0 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
27400 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
27410 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
27420 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
27430 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
27440 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
27450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27460 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65     pTo->rUnsorte
27470 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  d, pTo->isOrdere
27480 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
27490 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
274a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
274b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
274c0 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
274d0 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  e candidate path
274e0 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f   from further co
274f0 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
27500 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
27510 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
27520 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20  =rCost );.      
27530 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
27540 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27550 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27560 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
27570 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  t+1 );.         
27580 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63   /* Control reac
27590 68 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20  hes here if the 
275a0 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69  candidate path i
275b0 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68  s better than th
275c0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  e.          ** p
275d0 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63  To path.  Replac
275e0 65 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63  e pTo with the c
275f0 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66  andidate. */.#if
27600 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
27610 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
27620 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
27630 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
27640 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
27650 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27660 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
27670 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20          "Update 
27680 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
27690 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276b0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
276c0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
276d0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
276e0 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20  , rUnsorted,.   
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
27700 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
27710 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
27720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
27730 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27740 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
27750 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
27760 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
27770 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
27780 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
27790 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
277a0 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
277b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
277c0 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 2c   pTo->rUnsorted,
277d0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
277e0 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
277f0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
27800 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
27810 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
27820 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
27830 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
27840 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
27850 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
27860 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
27870 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
27880 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
27890 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
278a0 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
278b0 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
278c0 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
278d0 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70   nOut;.        p
278e0 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
278f0 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
27900 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73  rUnsorted = rUns
27910 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70  orted;.        p
27920 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
27930 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
27940 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
27950 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
27960 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
27970 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
27980 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
27990 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
279a0 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
279b0 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
279c0 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
279d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43  0;.          mxC
279e0 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f  ost = aTo[0].rCo
279f0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78  st;.          mx
27a00 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30  Unsorted = aTo[0
27a10 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  ].nRow;.        
27a20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d    for(jj=1, pTo=
27a30 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68  &aTo[1]; jj<mxCh
27a40 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  oice; jj++, pTo+
27a50 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
27a60 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d  if( pTo->rCost>m
27a70 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20  xCost .         
27a80 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f      || (pTo->rCo
27a90 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54  st==mxCost && pT
27aa0 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55  o->rUnsorted>mxU
27ab0 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20  nsorted) .      
27ac0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27ad0 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
27ae0 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20  pTo->rCost;.    
27af0 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
27b00 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73  rted = pTo->rUns
27b10 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20  orted;.         
27b20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20       mxI = jj;. 
27b30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27b40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27b50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
27b60 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
27b70 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20  ACE_ENABLED  /* 
27b80 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  >=2 */.    if( s
27b90 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
27ba0 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20   & 0x02 ){.     
27bb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
27bc0 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20  ntf("---- after 
27bd0 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22  round %d ----\n"
27be0 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  , iLoop);.      
27bf0 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54  for(ii=0, pTo=aT
27c00 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c  o; ii<nTo; ii++,
27c10 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
27c20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
27c30 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d  ntf(" %s cost=%-
27c40 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64  3d nrow=%-3d ord
27c50 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
27c60 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
27c70 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
27c80 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
27c90 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
27ca0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
27cb0 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69  red>=0 ? (pTo->i
27cc0 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20  sOrdered+'0') : 
27cd0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
27ce0 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
27cf0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
27d00 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
27d10 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c  tf(" rev=0x%llx\
27d20 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70  n", pTo->revLoop
27d30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
27d40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
27d50 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
27d60 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
27d70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
27d80 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61  ndif..    /* Swa
27d90 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61  p the roles of a
27da0 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72  From and aTo for
27db0 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61   the next genera
27dc0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f  tion */.    pFro
27dd0 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f  m = aTo;.    aTo
27de0 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46   = aFrom;.    aF
27df0 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20  rom = pFrom;.   
27e00 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20   nFrom = nTo;.  
27e10 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d  }..  if( nFrom==
27e20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
27e30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
27e40 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74   "no query solut
27e50 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ion");.    sqlit
27e60 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
27e70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75  Space);.    retu
27e80 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
27e90 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e  .  }.  .  /* Fin
27ea0 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
27eb0 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77  t path.  pFrom w
27ec0 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
27ed0 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74  ting to that pat
27ee0 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61  h */.  pFrom = a
27ef0 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31  From;.  for(ii=1
27f00 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
27f10 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  ){.    if( pFrom
27f20 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69  ->rCost>aFrom[ii
27f30 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20  ].rCost ) pFrom 
27f40 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20  = &aFrom[ii];.  
27f50 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  }.  assert( pWIn
27f60 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f  fo->nLevel==nLoo
27f70 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  p );.  /* Load t
27f80 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
27f90 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20  ath into pWInfo 
27fa0 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
27fb0 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
27fc0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65  Loop++){.    Whe
27fd0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
27fe0 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c  = pWInfo->a + iL
27ff0 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  oop;.    pLevel-
28000 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70  >pWLoop = pWLoop
28010 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b   = pFrom->aLoop[
28020 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76  iLoop];.    pLev
28030 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f  el->iFrom = pWLo
28040 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c  op->iTab;.    pL
28050 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
28060 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
28070 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
28080 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a  m].iCursor;.  }.
28090 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
280a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
280b0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
280c0 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  !=0.   && (pWInf
280d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
280e0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
280f0 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66  )==0.   && pWInf
28100 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48  o->eDistinct==WH
28110 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
28120 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a  P.   && nRowEst.
28130 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
28140 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e   notUsed;.    in
28150 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
28160 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
28170 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
28180 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72  >pResultSet, pFr
28190 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
281a0 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49       WHERE_DISTI
281b0 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  NCTBY, nLoop-1, 
281c0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
281d0 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29  op-1], &notUsed)
281e0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57  ;.    if( rc==pW
281f0 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
28200 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
28210 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
28220 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
28230 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
28240 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d   }.  }.  pWInfo-
28250 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
28260 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57  op = 0;.  if( pW
28270 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
28280 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  {.    if( pWInfo
28290 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
282a0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
282b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  ){.      if( pFr
282c0 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70  om->isOrdered==p
282d0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
282e0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
282f0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
28300 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
28310 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
28320 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
28330 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
28340 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69  OBSat = pFrom->i
28350 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
28360 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
28370 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
28380 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
28390 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29 7b  fo->nOBSat<=0 ){
283a0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
283b0 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20  >nOBSat = 0;.   
283c0 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e 30       if( nLoop>0
283d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
283e0 32 20 77 73 46 6c 61 67 73 20 3d 20 70 46 72 6f  2 wsFlags = pFro
283f0 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
28400 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  ]->wsFlags;.    
28410 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61        if( (wsFla
28420 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
28430 57 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  W)==0 .         
28440 20 20 26 26 20 28 77 73 46 6c 61 67 73 26 28 57    && (wsFlags&(W
28450 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43  HERE_IPK|WHERE_C
28460 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57 48 45  OLUMN_IN))!=(WHE
28470 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c  RE_IPK|WHERE_COL
28480 55 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20 20 20  UMN_IN).        
28490 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
284a0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a   Bitmask m = 0;.
284b0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
284c0 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
284d0 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
284e0 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
284f0 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 0a  OrderBy, pFrom,.
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52 44 45        WHERE_ORDE
28520 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f 70  RBY_LIMIT, nLoop
28530 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
28540 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b 0a  [nLoop-1], &m);.
28550 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
28560 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20  case( wsFlags & 
28570 57 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20 20 20  WHERE_IPK );.   
28580 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
28590 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45  e( wsFlags & WHE
285a0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a  RE_COLUMN_IN );.
285b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
285c0 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  rc==pWInfo->pOrd
285d0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
285f0 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  nfo->bOrderedInn
28600 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20  erLoop = 1;.    
28610 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
28620 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20  ->revMask = m;. 
28630 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28650 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28660 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
28670 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
28680 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
28690 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57 49  ).        && pWI
286a0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49  nfo->nOBSat==pWI
286b0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
286c0 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a  Expr && nLoop>0.
286d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74      ){.      Bit
286e0 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30  mask revMask = 0
286f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
28700 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  er = wherePathSa
28710 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
28720 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
28730 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20  OrderBy, .      
28740 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c      pFrom, 0, nL
28750 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
28760 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72  oop[nLoop-1], &r
28770 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a  evMask.      );.
28780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
28790 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20  Info->sorted==0 
287a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72  );.      if( nOr
287b0 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  der==pWInfo->pOr
287c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
287d0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
287e0 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  sorted = 1;.    
287f0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
28800 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  ask = revMask;. 
28810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28820 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  ...  pWInfo->nRo
28830 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  wOut = pFrom->nR
28840 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  ow;..  /* Free t
28850 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
28860 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65  and return succe
28870 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  ss */.  sqlite3D
28880 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53 70 61  bFreeNN(db, pSpa
28890 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ce);.  return SQ
288a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
288b0 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75  * Most queries u
288c0 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  se only a single
288d0 20 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65   table (they are
288e0 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20   not joins) and 
288f0 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d  have.** simple =
28900 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67  = constraints ag
28910 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69  ainst indexed fi
28920 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74  elds.  This rout
28930 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ine attempts.** 
28940 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69  to plan those si
28950 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67  mple cases using
28960 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d   much less cerem
28970 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20  ony than the.** 
28980 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
28990 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61  query planner, a
289a0 6e 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64  nd thereby yield
289b0 20 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f   faster sqlite3_
289c0 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d  prepare().** tim
289d0 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  es for the commo
289e0 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  n case..**.** Re
289f0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e  turn non-zero on
28a00 20 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69   success, if thi
28a10 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68  s query can be h
28a20 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a  andled by this.*
28a30 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72  * no-frills quer
28a40 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75  y planner.  Retu
28a50 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  rn zero if this 
28a60 71 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20  query needs the 
28a70 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
28a80 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
28a90 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
28aa0 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57   whereShortCut(W
28ab0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
28ac0 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
28ad0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
28ae0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
28af0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
28b00 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
28b10 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  C;.  WhereTerm *
28b20 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f  pTerm;.  WhereLo
28b30 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74  op *pLoop;.  int
28b40 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a   iCur;.  int j;.
28b50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
28b60 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20   Index *pIdx;.. 
28b70 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
28b80 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66  er->pWInfo;.  if
28b90 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
28ba0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f  lags & WHERE_OR_
28bb0 53 55 42 43 4c 41 55 53 45 20 29 20 72 65 74 75  SUBCLAUSE ) retu
28bc0 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
28bd0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
28be0 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
28bf0 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
28c00 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
28c10 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
28c20 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
28c30 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
28c40 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
28c50 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
28c60 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
28c70 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
28c80 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
28c90 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
28ca0 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
28cb0 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
28cc0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f  Flags = 0;.  pLo
28cd0 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  op->nSkip = 0;. 
28ce0 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
28cf0 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
28d00 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
28d10 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b  WO_EQ|WO_IS, 0);
28d20 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
28d30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
28d40 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28d50 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c   WO_IS );.    pL
28d60 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
28d70 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
28d80 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f  HERE_IPK|WHERE_O
28d90 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70  NEROW;.    pLoop
28da0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
28db0 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  erm;.    pLoop->
28dc0 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
28dd0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
28de0 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54  Eq = 1;.    /* T
28df0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
28e00 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73   rowid lookup is
28e10 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70   10 */.    pLoop
28e20 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a  ->rRun = 33;  /*
28e30 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
28e40 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
28e50 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
28e60 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
28e70 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
28e80 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
28e90 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61   opMask;.      a
28ea0 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
28eb0 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70  TermSpace==pLoop
28ec0 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20  ->aLTerm );.    
28ed0 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
28ee0 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20  ndex(pIdx).     
28ef0 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74    || pIdx->pPart
28f00 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20  IdxWhere!=0 .   
28f10 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65      || pIdx->nKe
28f20 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70  yCol>ArraySize(p
28f30 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
28f40 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74  e) .      ) cont
28f50 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61  inue;.      opMa
28f60 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e  sk = pIdx->uniqN
28f70 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c  otNull ? (WO_EQ|
28f80 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a  WO_IS) : WO_EQ;.
28f90 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
28fa0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
28fb0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
28fc0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
28fd0 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
28fe0 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61  iCur, j, 0, opMa
28ff0 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  sk, pIdx);.     
29000 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
29010 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
29020 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
29030 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
29040 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IS );.        p
29050 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20  Loop->aLTerm[j] 
29060 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
29070 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49  .      if( j!=pI
29080 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  dx->nKeyCol ) co
29090 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c  ntinue;.      pL
290a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
290b0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
290c0 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52  HERE_ONEROW|WHER
290d0 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
290e0 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76   if( pIdx->isCov
290f0 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d  ering || (pItem-
29100 3e 63 6f 6c 55 73 65 64 20 26 20 70 49 64 78 2d  >colUsed & pIdx-
29110 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 29 3d 3d 30  >colNotIdxed)==0
29120 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   ){.        pLoo
29130 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
29140 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
29150 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f      }.      pLoo
29160 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20  p->nLTerm = j;. 
29170 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
29180 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20  ree.nEq = j;.   
29190 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
291a0 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
291b0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
291c0 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71  : Cost of a uniq
291d0 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ue index lookup 
291e0 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70  is 15 */.      p
291f0 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b  Loop->rRun = 39;
29200 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33    /* 39==sqlite3
29210 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20  LogEst(15) */.  
29220 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
29230 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
29240 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20  ->wsFlags ){.   
29250 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
29260 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57  LogEst)1;.    pW
29270 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
29280 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 61  p = pLoop;.    a
29290 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73  ssert( pWInfo->s
292a0 4d 61 73 6b 53 65 74 2e 6e 3d 3d 31 20 26 26 20  MaskSet.n==1 && 
292b0 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73 4d  iCur==pWInfo->sM
292c0 61 73 6b 53 65 74 2e 69 78 5b 30 5d 20 29 3b 0a  askSet.ix[0] );.
292d0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53      pLoop->maskS
292e0 65 6c 66 20 3d 20 31 3b 20 2f 2a 20 73 71 6c 69  elf = 1; /* sqli
292f0 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
29300 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
29310 74 2c 20 69 43 75 72 29 3b 20 2a 2f 0a 20 20 20  t, iCur); */.   
29320 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54   pWInfo->a[0].iT
29330 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  abCur = iCur;.  
29340 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
29350 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  t = 1;.    if( p
29360 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
29370 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ) pWInfo->nOBSat
29380 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64   =  pWInfo->pOrd
29390 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
293a0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
293b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
293c0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
293d0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
293e0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
293f0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
29400 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
29410 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
29420 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27  pLoop->cId = '0'
29430 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
29440 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
29450 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29460 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
29470 66 6f 72 20 65 78 70 72 49 73 44 65 74 65 72 6d  for exprIsDeterm
29480 69 6e 69 73 74 69 63 28 29 2e 0a 2a 2f 0a 73 74  inistic()..*/.st
29490 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
294a0 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63  eIsDeterministic
294b0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
294c0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
294d0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
294e0 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20  =TK_FUNCTION && 
294f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29500 70 45 78 70 72 2c 20 45 50 5f 43 6f 6e 73 74 46  pExpr, EP_ConstF
29510 75 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  unc)==0 ){.    p
29520 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
29530 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  0;.    return WR
29540 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72  C_Abort;.  }.  r
29550 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
29560 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ue;.}../*.** Ret
29570 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
29580 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
29590 69 6e 73 20 6e 6f 20 6e 6f 6e 2d 64 65 74 65 72  ins no non-deter
295a0 6d 69 6e 69 73 74 69 63 20 53 51 4c 20 0a 2a 2a  ministic SQL .**
295b0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 44 6f 20 6e   functions. Do n
295c0 6f 74 20 63 6f 6e 73 69 64 65 72 20 6e 6f 6e 2d  ot consider non-
295d0 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 53 51  deterministic SQ
295e0 4c 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  L functions that
295f0 20 61 72 65 20 0a 2a 2a 20 70 61 72 74 20 6f 66   are .** part of
29600 20 73 75 62 2d 73 65 6c 65 63 74 20 73 74 61 74   sub-select stat
29610 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
29620 63 20 69 6e 74 20 65 78 70 72 49 73 44 65 74 65  c int exprIsDete
29630 72 6d 69 6e 69 73 74 69 63 28 45 78 70 72 20 2a  rministic(Expr *
29640 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
29650 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
29660 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
29670 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
29680 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
29690 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72 6d 69  xprNodeIsDetermi
296a0 6e 69 73 74 69 63 3b 0a 20 20 77 2e 78 53 65 6c  nistic;.  w.xSel
296b0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
296c0 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
296d0 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ail;.  sqlite3Wa
296e0 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
296f0 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b   return w.eCode;
29700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
29710 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
29720 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
29730 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
29740 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
29750 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
29760 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
29770 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
29780 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
29790 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
297a0 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
297b0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
297c0 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
297d0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
297e0 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
297f0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
29800 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
29810 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
29820 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
29830 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
29840 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
29850 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
29860 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
29870 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
29880 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
29890 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
298a0 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
298b0 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
298c0 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
298d0 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
298e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
298f0 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
29900 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
29910 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
29920 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
29930 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
29940 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
29950 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
29960 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
29970 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
29980 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
29990 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
299a0 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
299b0 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
299c0 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
299d0 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
299e0 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
299f0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
29a00 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
29a10 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
29a20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
29a30 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
29a40 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
29a50 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
29a60 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
29a70 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
29a80 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
29a90 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
29aa0 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
29ab0 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ad0 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
29ae0 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
29af0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
29b00 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
29b10 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
29b20 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
29b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b40 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
29b50 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
29b60 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
29b70 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
29b80 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
29b90 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
29ba0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
29bb0 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
29bc0 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
29bd0 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
29be0 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
29bf0 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
29c00 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
29c10 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
29c20 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
29c30 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
29c40 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
29c50 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
29c60 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
29c70 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
29c80 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
29c90 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
29ca0 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
29cb0 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
29cc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
29cd0 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
29ce0 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
29cf0 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
29d00 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
29d10 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
29d20 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
29d30 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
29d40 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
29d50 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
29d60 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
29d70 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
29d80 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
29d90 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
29da0 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
29db0 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
29dc0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
29dd0 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
29de0 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
29df0 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
29e00 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
29e10 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
29e20 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
29e30 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
29e40 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
29e50 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
29e60 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
29e70 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
29e80 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
29e90 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
29ea0 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
29eb0 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
29ec0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
29ed0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
29ee0 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
29ef0 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
29f00 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
29f10 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
29f20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
29f30 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
29f40 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
29f50 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
29f60 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
29f70 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
29f80 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
29f90 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
29fa0 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
29fb0 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
29fc0 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
29fd0 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
29fe0 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
29ff0 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
2a000 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
2a010 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
2a020 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
2a030 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
2a040 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
2a050 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
2a060 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
2a070 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
2a080 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2a090 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
2a0a0 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
2a0b0 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
2a0c0 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
2a0d0 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
2a0e0 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
2a0f0 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
2a100 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
2a110 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2a120 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
2a130 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
2a140 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
2a150 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
2a160 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
2a170 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
2a180 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
2a190 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
2a1a0 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
2a1b0 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
2a1c0 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
2a1d0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
2a1e0 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
2a1f0 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
2a200 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
2a210 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
2a220 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
2a230 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
2a240 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
2a250 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
2a260 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
2a270 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
2a280 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
2a290 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
2a2a0 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
2a2b0 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
2a2c0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
2a2d0 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
2a2e0 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
2a2f0 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
2a300 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
2a310 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
2a320 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
2a330 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
2a340 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
2a350 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
2a360 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
2a370 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  .**.** pOrderBy 
2a380 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2a390 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2a3a0 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55  use (or the GROU
2a3b0 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69  P BY clause.** i
2a3c0 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55  f the WHERE_GROU
2a3d0 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20  PBY flag is set 
2a3e0 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f  in wctrlFlags) o
2a3f0 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
2a400 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65  ment.** if there
2a410 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
2a420 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
2a430 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
2a440 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
2a450 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
2a460 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
2a470 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
2a480 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55  n pOrderBy is NU
2a490 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49  LL..**.** The iI
2a4a0 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72 20  dxCur parameter 
2a4b0 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
2a4c0 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
2a4d0 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f  .  If .** WHERE_
2a4e0 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20  OR_SUBCLAUSE is 
2a4f0 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73 20  set, iIdxCur is 
2a500 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
2a510 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  r of an index.**
2a520 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63   to use for OR c
2a530 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2a540 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  .  The WHERE cla
2a550 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74  use should use t
2a560 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  his.** specific 
2a570 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52  cursor.  If WHER
2a580 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2a590 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69  D is set, then i
2a5a0 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65  IdxCur is.** the
2a5b0 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e   first cursor in
2a5c0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72   an array of cur
2a5d0 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64  sors for all ind
2a5e0 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20 73  ices.  iIdxCur s
2a5f0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64  hould.** be used
2a600 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
2a610 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72 73  appropriate curs
2a620 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  or depending on 
2a630 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a  which index is.*
2a640 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  * used..*/.Where
2a650 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
2a660 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
2a670 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2a680 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
2a690 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
2a6a0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
2a6b0 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
2a6c0 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20  ause: A list of 
2a6d0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
2a6e0 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
2a6f0 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
2a700 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2a710 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
2a720 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2a730 79 2c 20 20 20 20 20 2f 2a 20 41 6e 20 4f 52 44  y,     /* An ORD
2a740 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
2a750 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  BY) clause, or N
2a760 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
2a770 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 20  t *pResultSet,  
2a780 20 2f 2a 20 51 75 65 72 79 20 72 65 73 75 6c 74   /* Query result
2a790 20 73 65 74 2e 20 20 52 65 71 27 64 20 66 6f 72   set.  Req'd for
2a7a0 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 75   DISTINCT */.  u
2a7b0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
2a7c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2a7d0 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
2a7e0 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
2a7f0 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41 75 78  .h */.  int iAux
2a800 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
2a810 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 52 5f 53  /* If WHERE_OR_S
2a820 55 42 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c  UBCLAUSE is set,
2a830 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75   index cursor nu
2a840 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  mber.           
2a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2a860 2a 20 49 66 20 57 48 45 52 45 5f 55 53 45 5f 4c  * If WHERE_USE_L
2a870 49 4d 49 54 2c 20 74 68 65 6e 20 74 68 65 20 6c  IMIT, then the l
2a880 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29  imit amount */.)
2a890 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e  {.  int nByteWIn
2a8a0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
2a8b0 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c  * Num. bytes all
2a8c0 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65  ocated for Where
2a8d0 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20  Info struct */. 
2a8e0 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20   int nTabList;  
2a8f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a900 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
2a910 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f  s in pTabList */
2a920 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2a930 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Info;         /*
2a940 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   Will become the
2a950 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
2a960 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
2a970 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
2a980 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f  arse->pVdbe;   /
2a990 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61  * The virtual da
2a9a0 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f  tabase engine */
2a9b0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
2a9c0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ady;          /*
2a9d0 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   Cursors that ar
2a9e0 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69  e not yet positi
2a9f0 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oned */.  WhereL
2aa00 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b  oopBuilder sWLB;
2aa10 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
2aa20 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f  eLoop builder */
2aa30 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
2aa40 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a  *pMaskSet;    /*
2aa50 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
2aa60 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68  mask set */.  Wh
2aa70 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2aa80 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69  ;        /* A si
2aa90 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57  ngle level in pW
2aaa0 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57  Info->a[] */.  W
2aab0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
2aac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2aad0 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65  nter to a single
2aae0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2aaf0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  t */.  int ii;  
2ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab10 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2ab20 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
2ab30 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
2ab40 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2ab50 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
2ab60 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2ab70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2ab80 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20  rn code */.  u8 
2ab90 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b 20  bFordelete = 0; 
2aba0 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46 4c 41          /* OPFLA
2abb0 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72 20 7a  G_FORDELETE or z
2abc0 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70 72 69  ero, as appropri
2abd0 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ate */..  assert
2abe0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2abf0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
2ac00 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a  LTIROW)==0 || (.
2ac10 20 20 20 20 20 20 20 20 28 77 63 74 72 6c 46 6c          (wctrlFl
2ac20 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2ac30 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
2ac40 0a 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46  .     && (wctrlF
2ac50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f  lags & WHERE_OR_
2ac60 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 0a 20  SUBCLAUSE)==0 . 
2ac70 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20   ));..  /* Only 
2ac80 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f 52 5f  one of WHERE_OR_
2ac90 53 55 42 43 4c 41 55 53 45 20 6f 72 20 57 48 45  SUBCLAUSE or WHE
2aca0 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a 2f 0a  RE_USE_LIMIT */.
2acb0 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
2acc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
2acd0 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20  _SUBCLAUSE)==0. 
2ace0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77             || (w
2acf0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2ad00 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_USE_LIMIT)==0 
2ad10 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  );..  /* Variabl
2ad20 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
2ad30 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
2ad40 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28  e->db;.  memset(
2ad50 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66  &sWLB, 0, sizeof
2ad60 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41  (sWLB));..  /* A
2ad70 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59  n ORDER/GROUP BY
2ad80 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20   clause of more 
2ad90 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61  than 63 terms ca
2ada0 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
2adb0 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  d */.  testcase(
2adc0 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
2add0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d  derBy->nExpr==BM
2ade0 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72  S-1 );.  if( pOr
2adf0 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42  derBy && pOrderB
2ae00 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20  y->nExpr>=BMS ) 
2ae10 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2ae20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWLB.pOrderBy = 
2ae30 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
2ae40 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
2ae50 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
2ae60 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
2ae70 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
2ae80 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
2ae90 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
2aea0 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
2aeb0 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
2aec0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
2aed0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
2aee0 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
2aef0 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46  t) ){.    wctrlF
2af00 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57  lags &= ~WHERE_W
2af10 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20  ANT_DISTINCT;.  
2af20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  }..  /* The numb
2af30 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
2af40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2af50 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
2af60 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
2af70 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
2af80 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  sk .  */.  testc
2af90 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ase( pTabList->n
2afa0 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66  Src==BMS );.  if
2afb0 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
2afc0 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
2afd0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2afe0 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
2aff0 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
2b000 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
2b010 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
2b020 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
2b030 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
2b040 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
2b050 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
2b060 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
2b070 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
2b080 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2b090 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
2b0a0 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
2b0b0 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
2b0c0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
2b0d0 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
2b0e0 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
2b0f0 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
2b100 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
2b110 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
2b120 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
2b130 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
2b140 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
2b150 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2b160 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 20 3f  _OR_SUBCLAUSE) ?
2b170 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
2b180 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
2b190 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2b1a0 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
2b1b0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2b1c0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
2b1d0 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
2b1e0 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
2b1f0 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
2b200 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
2b210 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
2b220 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
2b230 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
2b240 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
2b250 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
2b260 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
2b270 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
2b280 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
2b290 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
2b2a0 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
2b2b0 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
2b2c0 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
2b2d0 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
2b2e0 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
2b2f0 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
2b300 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
2b310 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
2b320 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f   */.  nByteWInfo
2b330 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
2b340 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61  (WhereInfo)+(nTa
2b350 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28  bList-1)*sizeof(
2b360 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
2b370 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
2b380 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
2b390 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73  , nByteWInfo + s
2b3a0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
2b3b0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
2b3c0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2b3d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2b3e0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  b, pWInfo);.    
2b3f0 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pWInfo = 0;.    
2b400 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2b410 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  rror;.  }.  pWIn
2b420 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
2b430 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
2b440 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
2b450 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  st;.  pWInfo->pO
2b460 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
2b470 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 68  y;.  pWInfo->pWh
2b480 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
2b490 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
2b4a0 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  et = pResultSet;
2b4b0 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  .  pWInfo->aiCur
2b4c0 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49  OnePass[0] = pWI
2b4d0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
2b4e0 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49  s[1] = -1;.  pWI
2b4f0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
2b500 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
2b510 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66  ->iBreak = pWInf
2b520 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  o->iContinue = s
2b530 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2b540 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  bel(pParse);.  p
2b550 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2b560 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
2b570 20 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74    pWInfo->iLimit
2b580 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 70 57   = iAuxArg;.  pW
2b590 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2b5a0 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
2b5b0 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d 65  nQueryLoop;.  me
2b5c0 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 6e 4f  mset(&pWInfo->nO
2b5d0 42 53 61 74 2c 20 30 2c 20 0a 20 20 20 20 20 20  BSat, 0, .      
2b5e0 20 20 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72     offsetof(Wher
2b5f0 65 49 6e 66 6f 2c 73 57 43 29 20 2d 20 6f 66 66  eInfo,sWC) - off
2b600 73 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c  setof(WhereInfo,
2b610 6e 4f 42 53 61 74 29 29 3b 0a 20 20 6d 65 6d 73  nOBSat));.  mems
2b620 65 74 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  et(&pWInfo->a[0]
2b630 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  , 0, sizeof(Wher
2b640 65 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69 73 74 2a  eLoop)+nTabList*
2b650 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
2b660 6c 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l));.  assert( p
2b670 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
2b680 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20  =ONEPASS_OFF ); 
2b690 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61   /* ONEPASS defa
2b6a0 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20  ults to OFF */. 
2b6b0 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
2b6c0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
2b6d0 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70   sWLB.pWInfo = p
2b6e0 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57  WInfo;.  sWLB.pW
2b6f0 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
2b700 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20  ;.  sWLB.pNew = 
2b710 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63  (WhereLoop*)(((c
2b720 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79  har*)pWInfo)+nBy
2b730 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  teWInfo);.  asse
2b740 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2b750 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e  LIGNMENT(sWLB.pN
2b760 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f  ew) );.  whereLo
2b770 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77  opInit(sWLB.pNew
2b780 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2b790 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e  _DEBUG.  sWLB.pN
2b7a0 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23  ew->cId = '*';.#
2b7b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69  endif..  /* Spli
2b7c0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
2b7d0 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
2b7e0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
2b7f0 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
2b800 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
2b810 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
2b820 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
2b830 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
2b840 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73  t(pMaskSet);.  s
2b850 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
2b860 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
2b870 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
2b880 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69 74  qlite3WhereSplit
2b890 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
2b8a0 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
2b8b0 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
2b8c0 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20  l case: No FROM 
2b8d0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
2b8e0 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b  ( nTabList==0 ){
2b8f0 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
2b900 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
2b910 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
2b920 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63  Expr;.    if( wc
2b930 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2b940 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
2b950 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
2b960 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
2b970 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
2b980 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 45 78 70  E;.    }.    Exp
2b990 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
2b9a0 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20  Parse, 0, "SCAN 
2b9b0 43 4f 4e 53 54 41 4e 54 20 52 4f 57 22 29 29 3b  CONSTANT ROW"));
2b9c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2b9d0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
2b9e0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
2b9f0 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
2ba00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
2ba10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2ba20 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20  he N-th term of 
2ba30 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2ba40 69 73 20 61 73 73 69 67 6e 65 64 20 61 20 62 69  is assigned a bi
2ba50 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20  tmask of 1<<N.. 
2ba60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2ba70 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70 72 65   rule of the pre
2ba80 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 65  vious sentence e
2ba90 6e 73 75 72 65 73 20 74 68 74 61 20 69 66 20 58  nsures thta if X
2baa0 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
2bab0 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 74 61 62  for.    ** a tab
2bac0 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69  le T, then X-1 i
2bad0 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
2bae0 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c  r all other tabl
2baf0 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
2bb00 66 20 54 2e 0a 20 20 20 20 2a 2a 20 4b 6e 6f 77  f T..    ** Know
2bb10 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ing the bitmask 
2bb20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
2bb30 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
2bb40 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 20  left join is.   
2bb50 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   ** important.  
2bb60 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
2bb70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
2bb80 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
2bb90 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
2bba0 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
2bbb0 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 20 20  c tables in.    
2bbc0 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
2bbd0 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
2bbe0 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
2bbf0 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
2bc00 72 6d 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 65 71  rmally.    ** eq
2bc10 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
2bc20 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
2bc30 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
2bc40 31 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  1 if the.    ** 
2bc50 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2bc60 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
2bc70 20 20 20 20 2a 2f 0a 20 20 20 20 69 69 20 3d 20      */.    ii = 
2bc80 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  0;.    do{.     
2bc90 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
2bca0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2bcb0 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
2bcc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2bcd0 72 65 54 61 62 46 75 6e 63 41 72 67 73 28 70 50  reTabFuncArgs(pP
2bce0 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d  arse, &pTabList-
2bcf0 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d  >a[ii], &pWInfo-
2bd00 3e 73 57 43 29 3b 0a 20 20 20 20 7d 77 68 69 6c  >sWC);.    }whil
2bd10 65 28 20 28 2b 2b 69 69 29 3c 70 54 61 62 4c 69  e( (++ii)<pTabLi
2bd20 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 23 69  st->nSrc );.  #i
2bd30 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2bd40 47 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 42 69  G.    {.      Bi
2bd50 74 6d 61 73 6b 20 6d 78 20 3d 20 30 3b 0a 20 20  tmask mx = 0;.  
2bd60 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2bd70 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2bd80 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
2bd90 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69  Bitmask m = sqli
2bda0 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
2bdb0 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
2bdc0 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
2bdd0 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
2bde0 72 74 28 20 6d 3e 3d 6d 78 20 29 3b 0a 20 20 20  rt( m>=mx );.   
2bdf0 20 20 20 20 20 6d 78 20 3d 20 6d 3b 0a 20 20 20       mx = m;.   
2be00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 23 65 6e     }.    }.  #en
2be10 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  dif.  }.  .  /* 
2be20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
2be30 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
2be40 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  s. */.  sqlite3W
2be50 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28  hereExprAnalyze(
2be60 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
2be70 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
2be80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2be90 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2bea0 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 70  nError;..  /* Sp
2beb0 65 63 69 61 6c 20 63 61 73 65 3a 20 57 48 45 52  ecial case: WHER
2bec0 45 20 74 65 72 6d 73 20 74 68 61 74 20 64 6f 20  E terms that do 
2bed0 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79  not refer to any
2bee0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
2bef0 6f 69 6e 0a 20 20 2a 2a 20 28 63 6f 6e 73 74 61  oin.  ** (consta
2bf00 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 29 2e  nt expressions).
2bf10 20 45 76 61 6c 75 61 74 65 20 65 61 63 68 20 73   Evaluate each s
2bf20 75 63 68 20 74 65 72 6d 2c 20 61 6e 64 20 6a 75  uch term, and ju
2bf30 6d 70 20 6f 76 65 72 20 61 6c 6c 20 74 68 65 0a  mp over all the.
2bf40 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 63    ** generated c
2bf50 6f 64 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ode if the resul
2bf60 74 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 20  t is not true.  
2bf70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f  .  **.  ** Do no
2bf80 74 20 64 6f 20 74 68 69 73 20 69 66 20 74 68 65  t do this if the
2bf90 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
2bfa0 61 69 6e 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  ains non-determi
2bfb0 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73  nistic functions
2bfc0 0a 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e  .  ** that are n
2bfd0 6f 74 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d  ot within a sub-
2bfe0 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20  select. This is 
2bff0 6e 6f 74 20 73 74 72 69 63 74 6c 79 20 72 65 71  not strictly req
2c000 75 69 72 65 64 2c 20 62 75 74 0a 20 20 2a 2a 20  uired, but.  ** 
2c010 70 72 65 73 65 72 76 65 73 20 53 51 4c 69 74 65  preserves SQLite
2c020 27 73 20 6c 65 67 61 63 79 20 62 65 68 61 76 69  's legacy behavi
2c030 6f 75 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  our in the follo
2c040 77 69 6e 67 20 74 77 6f 20 63 61 73 65 73 3a 0a  wing two cases:.
2c050 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 46 52 4f 4d    **.  **   FROM
2c060 20 2e 2e 2e 20 57 48 45 52 45 20 72 61 6e 64 6f   ... WHERE rando
2c070 6d 28 29 3e 30 3b 20 20 20 20 20 20 20 20 20 20  m()>0;          
2c080 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64 6f 6d 28   -- eval random(
2c090 29 20 6f 6e 63 65 20 70 65 72 20 72 6f 77 0a 20  ) once per row. 
2c0a0 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57   **   FROM ... W
2c0b0 48 45 52 45 20 28 53 45 4c 45 43 54 20 72 61 6e  HERE (SELECT ran
2c0c0 64 6f 6d 28 29 29 3e 30 3b 20 20 2d 2d 20 65 76  dom())>0;  -- ev
2c0d0 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65  al random() once
2c0e0 20 6f 76 65 72 61 6c 6c 0a 20 20 2a 2f 0a 20 20   overall.  */.  
2c0f0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c  for(ii=0; ii<sWL
2c100 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69  B.pWC->nTerm; ii
2c110 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  ++){.    WhereTe
2c120 72 6d 20 2a 70 54 20 3d 20 26 73 57 4c 42 2e 70  rm *pT = &sWLB.p
2c130 57 43 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 69  WC->a[ii];.    i
2c140 66 28 20 70 54 2d 3e 77 74 46 6c 61 67 73 20 26  f( pT->wtFlags &
2c150 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
2c160 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2c170 28 20 70 54 2d 3e 70 72 65 72 65 71 41 6c 6c 3d  ( pT->prereqAll=
2c180 3d 30 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d  =0 && (nTabList=
2c190 3d 30 20 7c 7c 20 65 78 70 72 49 73 44 65 74 65  =0 || exprIsDete
2c1a0 72 6d 69 6e 69 73 74 69 63 28 70 54 2d 3e 70 45  rministic(pT->pE
2c1b0 78 70 72 29 29 20 29 7b 0a 20 20 20 20 20 20 73  xpr)) ){.      s
2c1c0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
2c1d0 65 28 70 50 61 72 73 65 2c 20 70 54 2d 3e 70 45  e(pParse, pT->pE
2c1e0 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  xpr, pWInfo->iBr
2c1f0 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  eak, SQLITE_JUMP
2c200 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
2c210 54 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  T->wtFlags |= TE
2c220 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
2c230 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c    }..  if( wctrl
2c240 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2c250 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
2c260 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63     if( isDistinc
2c270 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
2c280 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57  e, pTabList, &pW
2c290 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75  Info->sWC, pResu
2c2a0 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ltSet) ){.      
2c2b0 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
2c2c0 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74  marking is point
2c2d0 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74  less.  Ignore it
2c2e0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  . */.      pWInf
2c2f0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
2c300 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2c310 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
2c320 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
2c330 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
2c340 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
2c350 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
2c360 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
2c370 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
2c380 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
2c390 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
2c3a0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
2c3b0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
2c3c0 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53  derBy = pResultS
2c3d0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  et;.    }.  }.. 
2c3e0 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
2c3f0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2c400 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  cts */.#if defin
2c410 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
2c420 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c  ABLED).  if( sql
2c430 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
2c440 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 73   0xffff ){.    s
2c450 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2c460 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  f("*** Optimizer
2c470 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74 72   Start *** (wctr
2c480 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c 77 63  lFlags: 0x%x",wc
2c490 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  trlFlags);.    i
2c4a0 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
2c4b0 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20  WHERE_USE_LIMIT 
2c4c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c4d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 6c  DebugPrintf(", l
2c4e0 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75 78 41  imit: %d", iAuxA
2c4f0 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  rg);.    }.    s
2c500 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2c510 66 28 22 29 5c 6e 22 29 3b 0a 20 20 20 20 69 66  f(")\n");.    if
2c520 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2c530 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
2c540 20 20 20 20 20 53 65 6c 65 63 74 20 73 53 65 6c       Select sSel
2c550 65 63 74 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ect;.      memse
2c560 74 28 26 73 53 65 6c 65 63 74 2c 20 30 2c 20 73  t(&sSelect, 0, s
2c570 69 7a 65 6f 66 28 73 53 65 6c 65 63 74 29 29 3b  izeof(sSelect));
2c580 0a 20 20 20 20 20 20 73 53 65 6c 65 63 74 2e 73  .      sSelect.s
2c590 65 6c 46 6c 61 67 73 20 3d 20 53 46 5f 57 68 65  elFlags = SF_Whe
2c5a0 72 65 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 73  reBegin;.      s
2c5b0 53 65 6c 65 63 74 2e 70 53 72 63 20 3d 20 70 54  Select.pSrc = pT
2c5c0 61 62 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 53  abList;.      sS
2c5d0 65 6c 65 63 74 2e 70 57 68 65 72 65 20 3d 20 70  elect.pWhere = p
2c5e0 57 68 65 72 65 3b 0a 20 20 20 20 20 20 73 53 65  Where;.      sSe
2c5f0 6c 65 63 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  lect.pOrderBy = 
2c600 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
2c610 73 53 65 6c 65 63 74 2e 70 45 4c 69 73 74 20 3d  sSelect.pEList =
2c620 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
2c630 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2c640 65 77 53 65 6c 65 63 74 28 30 2c 20 26 73 53 65  ewSelect(0, &sSe
2c650 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  lect, 0);.    }.
2c660 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
2c670 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
2c680 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61  100 ){ /* Displa
2c690 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  y all terms of t
2c6a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2c6b0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
2c6c0 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73  ereClausePrint(s
2c6d0 57 4c 42 2e 70 57 43 29 3b 0a 20 20 7d 0a 23 65  WLB.pWC);.  }.#e
2c6e0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 54 61 62  ndif..  if( nTab
2c6f0 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65  List!=1 || where
2c700 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d  ShortCut(&sWLB)=
2c710 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  =0 ){.    rc = w
2c720 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26  hereLoopAddAll(&
2c730 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72  sWLB);.    if( r
2c740 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  c ) goto whereBe
2c750 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66  ginError;.  .#if
2c760 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2c770 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
2c780 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2c790 20 29 7b 20 20 20 20 2f 2a 20 44 69 73 70 6c 61   ){    /* Displa
2c7a0 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65  y all of the Whe
2c7b0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
2c7c0 2f 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f  /.      WhereLoo
2c7d0 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  p *p;.      int 
2c7e0 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  i;.      static 
2c7f0 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c 61 62 65  const char zLabe
2c800 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  l[] = "012345678
2c810 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  9abcdefghijklmno
2c820 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20  pqrstuvwyxz".   
2c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c850 20 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45            "ABCDE
2c860 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
2c870 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f  VWYXZ";.      fo
2c880 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  r(p=pWInfo->pLoo
2c890 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d  ps, i=0; p; p=p-
2c8a0 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29  >pNextLoop, i++)
2c8b0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64  {.        p->cId
2c8c0 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 28 73 69 7a   = zLabel[i%(siz
2c8d0 65 6f 66 28 7a 4c 61 62 65 6c 29 2d 31 29 5d 3b  eof(zLabel)-1)];
2c8e0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
2c8f0 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e  opPrint(p, sWLB.
2c900 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pWC);.      }.  
2c910 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2c920 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
2c930 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20  r(pWInfo, 0);.  
2c940 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2c950 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
2c960 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2c970 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
2c980 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
2c990 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
2c9a0 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  r(pWInfo, pWInfo
2c9b0 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20  ->nRowOut+1);.  
2c9c0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
2c9d0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2c9e0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2c9f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2ca00 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
2ca10 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c  By==0 && (db->fl
2ca20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76  ags & SQLITE_Rev
2ca30 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b  erseOrder)!=0 ){
2ca40 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65  .     pWInfo->re
2ca50 76 4d 61 73 6b 20 3d 20 41 4c 4c 42 49 54 53 3b  vMask = ALLBITS;
2ca60 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
2ca70 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52  e->nErr || NEVER
2ca80 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
2ca90 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  d) ){.    goto w
2caa0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2cab0 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45    }.#ifdef WHERE
2cac0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2cad0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2cae0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c  Trace ){.    sql
2caf0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2cb00 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e  "---- Solution n
2cb10 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d  Row=%d", pWInfo-
2cb20 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69  >nRowOut);.    i
2cb30 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  f( pWInfo->nOBSa
2cb40 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t>0 ){.      sql
2cb50 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2cb60 22 20 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25  " ORDERBY=%d,0x%
2cb70 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f  llx", pWInfo->nO
2cb80 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65  BSat, pWInfo->re
2cb90 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  vMask);.    }.  
2cba0 20 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f    switch( pWInfo
2cbb0 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ->eDistinct ){. 
2cbc0 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
2cbd0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a  DISTINCT_UNIQUE:
2cbe0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2cbf0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
2cc00 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65   DISTINCT=unique
2cc10 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
2cc20 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2cc30 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
2cc40 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
2cc50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2cc60 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
2cc70 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29  STINCT=ordered")
2cc80 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2cc90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2cca0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
2ccb0 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a  CT_UNORDERED: {.
2ccc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2ccd0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
2cce0 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64  STINCT=unordered
2ccf0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
2cd00 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2cd10 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
2cd20 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
2cd30 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2cd40 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
2cd50 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65  ii++){.      whe
2cd60 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e  reLoopPrint(pWIn
2cd70 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70  fo->a[ii].pWLoop
2cd80 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
2cd90 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2cda0 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f   /* Attempt to o
2cdb0 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20  mit tables from 
2cdc0 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f  the join that do
2cdd0 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
2cde0 72 65 73 75 6c 74 2e 0a 20 20 2a 2a 20 46 6f 72  result..  ** For
2cdf0 20 61 20 74 61 62 6c 65 20 74 6f 20 6e 6f 74 20   a table to not 
2ce00 61 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c  affect the resul
2ce10 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t, the following
2ce20 20 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a 20   must be true:. 
2ce30 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 54 68   **.  **   1) Th
2ce40 65 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  e query must not
2ce50 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65   be an aggregate
2ce60 2e 0a 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20  ..  **   2) The 
2ce70 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 74 68  table must be th
2ce80 65 20 52 48 53 20 6f 66 20 61 20 4c 45 46 54 20  e RHS of a LEFT 
2ce90 4a 4f 49 4e 2e 0a 20 20 2a 2a 20 20 20 33 29 20  JOIN..  **   3) 
2cea0 45 69 74 68 65 72 20 74 68 65 20 71 75 65 72 79  Either the query
2ceb0 20 6d 75 73 74 20 62 65 20 44 49 53 54 49 4e 43   must be DISTINC
2cec0 54 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 4f  T, or else the O
2ced0 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2cee0 65 0a 20 20 2a 2a 20 20 20 20 20 20 6d 75 73 74  e.  **      must
2cef0 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6e 73 74   contain a const
2cf00 72 61 69 6e 74 20 74 68 61 74 20 6c 69 6d 69 74  raint that limit
2cf10 73 20 74 68 65 20 73 63 61 6e 20 6f 66 20 74 68  s the scan of th
2cf20 65 20 74 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a  e table to .  **
2cf30 20 20 20 20 20 20 61 74 20 6d 6f 73 74 20 61 20        at most a 
2cf40 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2a  single row..  **
2cf50 20 20 20 34 29 20 54 68 65 20 74 61 62 6c 65 20     4) The table 
2cf60 6d 75 73 74 20 6e 6f 74 20 62 65 20 72 65 66 65  must not be refe
2cf70 72 65 6e 63 65 64 20 62 79 20 61 6e 79 20 70 61  renced by any pa
2cf80 72 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  rt of the query 
2cf90 61 70 61 72 74 0a 20 20 2a 2a 20 20 20 20 20 20  apart.  **      
2cfa0 66 72 6f 6d 20 69 74 73 20 6f 77 6e 20 55 53 49  from its own USI
2cfb0 4e 47 20 6f 72 20 4f 4e 20 63 6c 61 75 73 65 2e  NG or ON clause.
2cfc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65  .  **.  ** For e
2cfd0 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e 3a 0a 20  xample, given:. 
2cfe0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
2cff0 41 54 45 20 54 41 42 4c 45 20 74 31 28 69 70 6b  ATE TABLE t1(ipk
2d000 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2d010 20 4b 45 59 2c 20 76 31 29 3b 0a 20 20 2a 2a 20   KEY, v1);.  ** 
2d020 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2d030 20 74 32 28 69 70 6b 20 49 4e 54 45 47 45 52 20   t2(ipk INTEGER 
2d040 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 32 29  PRIMARY KEY, v2)
2d050 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
2d060 45 20 54 41 42 4c 45 20 74 33 28 69 70 6b 20 49  E TABLE t3(ipk I
2d070 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2d080 45 59 2c 20 76 33 29 3b 0a 20 20 2a 2a 0a 20 20  EY, v3);.  **.  
2d090 2a 2a 20 74 68 65 6e 20 74 61 62 6c 65 20 74 32  ** then table t2
2d0a0 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20   can be omitted 
2d0b0 66 72 6f 6d 20 74 68 65 20 66 6f 6c 6c 6f 77 69  from the followi
2d0c0 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ng:.  **.  **   
2d0d0 20 20 53 45 4c 45 43 54 20 76 31 2c 20 76 33 20    SELECT v1, v3 
2d0e0 46 52 4f 4d 20 74 31 20 0a 20 20 2a 2a 20 20 20  FROM t1 .  **   
2d0f0 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32      LEFT JOIN t2
2d100 20 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74   USING (t1.ipk=t
2d110 32 2e 69 70 6b 29 0a 20 20 2a 2a 20 20 20 20 20  2.ipk).  **     
2d120 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20 55    LEFT JOIN t3 U
2d130 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33 2e  SING (t1.ipk=t3.
2d140 69 70 6b 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6f  ipk).  **.  ** o
2d150 72 20 66 72 6f 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  r from:.  **.  *
2d160 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  *     SELECT DIS
2d170 54 49 4e 43 54 20 76 31 2c 20 76 33 20 46 52 4f  TINCT v1, v3 FRO
2d180 4d 20 74 31 20 0a 20 20 2a 2a 20 20 20 20 20 20  M t1 .  **      
2d190 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 0a 20 20   LEFT JOIN t2.  
2d1a0 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f  **       LEFT JO
2d1b0 49 4e 20 74 33 20 55 53 49 4e 47 20 28 74 31 2e  IN t3 USING (t1.
2d1c0 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20 20 2a 2f  ipk=t3.ipk).  */
2d1d0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
2d1e0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 69 66 28  Bitmask)0;.  if(
2d1f0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
2d200 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74  =2.   && pResult
2d210 53 65 74 21 3d 30 20 20 20 20 20 20 20 20 20 20  Set!=0          
2d220 20 20 20 20 20 2f 2a 20 67 75 61 72 61 6e 74 65       /* guarante
2d230 65 73 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29  es condition (1)
2d240 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 26 26 20   above */.   && 
2d250 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2d260 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
2d270 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29  mitNoopJoin).  )
2d280 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2d290 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64   Bitmask tabUsed
2d2a0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
2d2b0 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61  xprListUsage(pMa
2d2c0 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65  skSet, pResultSe
2d2d0 74 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42  t);.    if( sWLB
2d2e0 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2d2f0 20 20 20 74 61 62 55 73 65 64 20 7c 3d 20 73 71     tabUsed |= sq
2d300 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69  lite3WhereExprLi
2d310 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  stUsage(pMaskSet
2d320 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29  , sWLB.pOrderBy)
2d330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
2d340 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i=pWInfo->nLevel
2d350 2d 31 3b 20 69 3e 3d 31 3b 20 69 2d 2d 29 7b 0a  -1; i>=1; i--){.
2d360 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
2d370 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20  *pTerm, *pEnd;. 
2d380 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
2d390 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2d3a0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  .      pLoop = p
2d3b0 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 57 4c 6f  WInfo->a[i].pWLo
2d3c0 6f 70 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 20  op;.      pItem 
2d3d0 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  = &pWInfo->pTabL
2d3e0 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
2d3f0 61 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ab];.      if( (
2d400 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
2d410 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30  pe & JT_LEFT)==0
2d420 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d430 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
2d440 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
2d450 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20  DISTINCT)==0.   
2d460 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
2d470 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2d480 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20  NEROW)==0.      
2d490 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  ){.        conti
2d4a0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2d4b0 20 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20     if( (tabUsed 
2d4c0 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
2d4d0 66 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)!=0 ) continue
2d4e0 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73  ;.      pEnd = s
2d4f0 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c  WLB.pWC->a + sWL
2d500 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  B.pWC->nTerm;.  
2d510 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57      for(pTerm=sW
2d520 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  LB.pWC->a; pTerm
2d530 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  <pEnd; pTerm++){
2d540 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
2d550 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
2d560 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2d570 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2d580 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
2d590 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
2d5a0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
2d5b0 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
2d5c0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 69 52  pTerm->pExpr->iR
2d5d0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70  ightJoinTable!=p
2d5e0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 0a 20 20  Item->iCursor.  
2d5f0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2d600 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2d610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d620 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d630 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64    if( pTerm<pEnd
2d640 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d650 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
2d660 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20  ffff, ("-> drop 
2d670 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64  loop %c not used
2d680 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29  \n", pLoop->cId)
2d690 29 3b 0a 20 20 20 20 20 20 6e 6f 74 52 65 61 64  );.      notRead
2d6a0 79 20 26 3d 20 7e 70 4c 6f 6f 70 2d 3e 6d 61 73  y &= ~pLoop->mas
2d6b0 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72  kSelf;.      for
2d6c0 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d  (pTerm=sWLB.pWC-
2d6d0 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20  >a; pTerm<pEnd; 
2d6e0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
2d6f0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
2d700 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
2d710 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 7b  >maskSelf)!=0 ){
2d720 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
2d730 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
2d740 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20 20  M_CODED;.       
2d750 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2d760 20 69 66 28 20 69 21 3d 70 57 49 6e 66 6f 2d 3e   if( i!=pWInfo->
2d770 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20  nLevel-1 ){.    
2d780 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
2d790 28 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  (pWInfo->nLevel-
2d7a0 31 2d 69 29 20 2a 20 73 69 7a 65 6f 66 28 57 68  1-i) * sizeof(Wh
2d7b0 65 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  ereLevel);.     
2d7c0 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 57 49 6e     memmove(&pWIn
2d7d0 66 6f 2d 3e 61 5b 69 5d 2c 20 26 70 57 49 6e 66  fo->a[i], &pWInf
2d7e0 6f 2d 3e 61 5b 69 2b 31 5d 2c 20 6e 42 79 74 65  o->a[i+1], nByte
2d7f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2d800 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d   pWInfo->nLevel-
2d810 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73  -;.      nTabLis
2d820 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t--;.    }.  }. 
2d830 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
2d840 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
2d850 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
2d860 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  n"));.  pWInfo->
2d870 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2d880 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  op += pWInfo->nR
2d890 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  owOut;..  /* If 
2d8a0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
2d8b0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
2d8c0 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
2d8d0 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
2d8e0 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
2d8f0 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
2d900 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
2d910 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
2d920 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6f  e..  **.  ** A o
2d930 6e 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  ne-pass approach
2d940 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20   can be used if 
2d950 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 72  the caller has r
2d960 65 71 75 65 73 74 65 64 20 6f 6e 65 0a 20 20 2a  equested one.  *
2d970 2a 20 61 6e 64 20 65 69 74 68 65 72 20 28 61 29  * and either (a)
2d980 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73   the scan visits
2d990 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77   at most one row
2d9a0 20 6f 72 20 28 62 29 20 65 61 63 68 0a 20 20 2a   or (b) each.  *
2d9b0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
2d9c0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ng are true:.  *
2d9d0 2a 0a 20 20 2a 2a 20 20 20 2a 20 74 68 65 20 63  *.  **   * the c
2d9e0 61 6c 6c 65 72 20 68 61 73 20 69 6e 64 69 63 61  aller has indica
2d9f0 74 65 64 20 74 68 61 74 20 61 20 6f 6e 65 2d 70  ted that a one-p
2da00 61 73 73 20 61 70 70 72 6f 61 63 68 20 63 61 6e  ass approach can
2da10 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 20 20   be used.  **   
2da20 20 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 20    with multiple 
2da30 72 6f 77 73 20 28 62 79 20 73 65 74 74 69 6e 67  rows (by setting
2da40 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
2da50 55 4c 54 49 52 4f 57 29 2c 20 61 6e 64 0a 20 20  ULTIROW), and.  
2da60 2a 2a 20 20 20 2a 20 74 68 65 20 74 61 62 6c 65  **   * the table
2da70 20 69 73 20 6e 6f 74 20 61 20 76 69 72 74 75 61   is not a virtua
2da80 6c 20 74 61 62 6c 65 2c 20 61 6e 64 0a 20 20 2a  l table, and.  *
2da90 2a 20 20 20 2a 20 65 69 74 68 65 72 20 74 68 65  *   * either the
2daa0 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 75   scan does not u
2dab0 73 65 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69  se the OR optimi
2dac0 7a 61 74 69 6f 6e 20 6f 72 20 74 68 65 20 63 61  zation or the ca
2dad0 6c 6c 65 72 0a 20 20 2a 2a 20 20 20 20 20 69 73  ller.  **     is
2dae0 20 61 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74   a DELETE operat
2daf0 69 6f 6e 20 28 57 48 45 52 45 5f 44 55 50 4c 49  ion (WHERE_DUPLI
2db00 43 41 54 45 53 5f 4f 4b 20 69 73 20 6f 6e 6c 79  CATES_OK is only
2db10 20 73 70 65 63 69 66 69 65 64 0a 20 20 2a 2a 20   specified.  ** 
2db20 20 20 20 20 66 6f 72 20 44 45 4c 45 54 45 29 2e      for DELETE).
2db30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
2db40 61 73 74 20 71 75 61 6c 69 66 69 63 61 74 69 6f  ast qualificatio
2db50 6e 20 69 73 20 62 65 63 61 75 73 65 20 61 6e 20  n is because an 
2db60 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
2db70 20 75 73 65 73 0a 20 20 2a 2a 20 57 68 65 72 65   uses.  ** Where
2db80 49 6e 66 6f 2e 61 69 43 75 72 4f 6e 65 50 61 73  Info.aiCurOnePas
2db90 73 5b 31 5d 20 74 6f 20 64 65 74 65 72 6d 69 6e  s[1] to determin
2dba0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
2dbb0 20 69 74 20 72 65 61 6c 6c 79 20 63 61 6e 0a 20   it really can. 
2dbc0 20 2a 2a 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   ** use a one-pa
2dbd0 73 73 20 61 70 70 72 6f 61 63 68 2c 20 61 6e 64  ss approach, and
2dbe0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 65 74   this is not set
2dbf0 20 61 63 63 75 72 61 74 65 6c 79 20 66 6f 72 20   accurately for 
2dc00 73 63 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  scans.  ** that 
2dc10 75 73 65 20 74 68 65 20 4f 52 20 6f 70 74 69 6d  use the OR optim
2dc20 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  ization..  */.  
2dc30 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
2dc40 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2dc50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
2dc60 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  || pWInfo->nLeve
2dc70 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77  l==1 );.  if( (w
2dc80 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2dc90 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2dca0 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  D)!=0 ){.    int
2dcb0 20 77 73 46 6c 61 67 73 20 3d 20 70 57 49 6e 66   wsFlags = pWInf
2dcc0 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
2dcd0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  wsFlags;.    int
2dce0 20 62 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46 6c   bOnerow = (wsFl
2dcf0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
2dd00 4f 57 29 21 3d 30 3b 0a 20 20 20 20 61 73 73 65  OW)!=0;.    asse
2dd10 72 74 28 20 21 28 77 73 46 6c 61 67 73 20 26 20  rt( !(wsFlags & 
2dd20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2dd30 4c 45 29 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  LE) || IsVirtual
2dd40 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e  (pTabList->a[0].
2dd50 70 54 61 62 29 20 29 3b 0a 20 20 20 20 69 66 28  pTab) );.    if(
2dd60 20 62 4f 6e 65 72 6f 77 20 7c 7c 20 28 0a 20 20   bOnerow || (.  
2dd70 20 20 20 20 20 20 30 21 3d 28 77 63 74 72 6c 46        0!=(wctrlF
2dd80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2dd90 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 0a 20  PASS_MULTIROW). 
2dda0 20 20 20 20 26 26 20 21 49 73 56 69 72 74 75 61      && !IsVirtua
2ddb0 6c 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  l(pTabList->a[0]
2ddc0 2e 70 54 61 62 29 0a 20 20 20 20 20 26 26 20 28  .pTab).     && (
2ddd0 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57 48  0==(wsFlags & WH
2dde0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
2ddf0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2de00 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
2de10 4f 4b 29 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  OK)).    )){.   
2de20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50     pWInfo->eOneP
2de30 61 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20  ass = bOnerow ? 
2de40 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a  ONEPASS_SINGLE :
2de50 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a   ONEPASS_MULTI;.
2de60 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
2de70 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  id(pTabList->a[0
2de80 5d 2e 70 54 61 62 29 20 26 26 20 28 77 73 46 6c  ].pTab) && (wsFl
2de90 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2dea0 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20  ONLY) ){.       
2deb0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
2dec0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2ded0 4d 55 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20  MULTIROW ){.    
2dee0 20 20 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65        bFordelete
2def0 20 3d 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c   = OPFLAG_FORDEL
2df00 45 54 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ETE;.        }. 
2df10 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
2df20 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
2df30 61 67 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26  ags = (wsFlags &
2df40 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   ~WHERE_IDX_ONLY
2df50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2df60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
2df70 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
2df80 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
2df90 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
2dfa0 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
2dfb0 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
2dfc0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
2dfd0 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  ii=0, pLevel=pWI
2dfe0 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c  nfo->a; ii<nTabL
2dff0 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65  ist; ii++, pLeve
2e000 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  l++){.    Table 
2e010 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
2e020 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
2e030 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
2e040 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2e050 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2e060 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
2e070 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  */.    struct Sr
2e080 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
2e090 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49  Item;..    pTabI
2e0a0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2e0b0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
2e0c0 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
2e0d0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
2e0e0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
2e0f0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
2e100 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
2e110 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
2e120 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
2e130 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
2e140 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
2e150 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d  ral)!=0 || pTab-
2e160 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
2e170 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
2e180 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66  */.    }else.#if
2e190 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e1a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2e1b0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
2e1c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2e1d0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
2e1e0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
2e1f0 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e  ar *pVTab = (con
2e200 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
2e210 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
2e220 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Tab);.      int 
2e230 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
2e240 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
2e250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e260 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69  4(v, OP_VOpen, i
2e270 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62  Cur, 0, 0, pVTab
2e280 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
2e290 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
2e2a0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
2e2b0 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20     /* noop */.  
2e2c0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2e2d0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2e2e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2e2f0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
2e300 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
2e310 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
2e320 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a  UBCLAUSE)==0 ){.
2e330 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f        int op = O
2e340 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
2e350 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f    if( pWInfo->eO
2e360 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f  nePass!=ONEPASS_
2e370 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  OFF ){.        o
2e380 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  p = OP_OpenWrite
2e390 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
2e3a0 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30  ->aiCurOnePass[0
2e3b0 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  ] = pTabItem->iC
2e3c0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a  ursor;.      };.
2e3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
2e3e0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
2e3f0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2e400 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29  , iDb, pTab, op)
2e410 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e420 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2e430 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  r==pLevel->iTabC
2e440 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ur );.      test
2e450 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  case( pWInfo->eO
2e460 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
2e470 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  OFF && pTab->nCo
2e480 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
2e490 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
2e4a0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
2e4b0 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61  EPASS_OFF && pTa
2e4c0 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
2e4d0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2e4e0 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2e4f0 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
2e500 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73  >nCol<BMS && Has
2e510 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
2e520 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
2e530 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
2e540 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
2e550 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
2e560 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
2e570 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
2e580 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2e590 67 65 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49  geP4(v, -1, SQLI
2e5a0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29  TE_INT_TO_PTR(n)
2e5b0 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
2e5c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
2e5d0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
2e5e0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2e5f0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
2e600 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66  R_HINTS.      if
2e610 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ( pLoop->u.btree
2e620 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
2e630 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e640 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
2e650 4c 41 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64  LAG_SEEKEQ|bFord
2e660 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65  elete);.      }e
2e670 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
2e680 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2e690 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2e6a0 2c 20 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20  , bFordelete);. 
2e6b0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2e6c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
2e6d0 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
2e6e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e6f0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
2e700 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62  olumnsUsed, pTab
2e710 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30  Item->iCursor, 0
2e720 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e740 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61   (const u8*)&pTa
2e750 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20  bItem->colUsed, 
2e760 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69  P4_INT64);.#endi
2e770 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2e780 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
2e790 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
2e7a0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
2e7b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
2e7c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
2e7d0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2e7e0 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
2e7f0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
2e800 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2e810 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e  pIndex;.      in
2e820 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  t iIndexCur;.   
2e830 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f     int op = OP_O
2e840 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f  penRead;.      /
2e850 2a 20 69 41 75 78 41 72 67 20 69 73 20 61 6c 77  * iAuxArg is alw
2e860 61 79 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73  ays set to a pos
2e870 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f  itive value if O
2e880 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69 62  NEPASS is possib
2e890 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
2e8a0 72 74 28 20 69 41 75 78 41 72 67 21 3d 30 20 7c  rt( iAuxArg!=0 |
2e8b0 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  | (pWInfo->wctrl
2e8c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2e8d0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
2e8e0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
2e8f0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
2e900 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e  & IsPrimaryKeyIn
2e910 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20 20  dex(pIx).       
2e920 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
2e930 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
2e940 55 53 45 29 21 3d 30 0a 20 20 20 20 20 20 29 7b  USE)!=0.      ){
2e950 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2e960 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20   is one term of 
2e970 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74 69  an OR-optimizati
2e980 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52 49  on using the PRI
2e990 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20 20  MARY KEY of a.  
2e9a0 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55 54        ** WITHOUT
2e9b0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 4e   ROWID table.  N
2e9c0 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65 70  o need for a sep
2e9d0 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a 20  arate index */. 
2e9e0 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2e9f0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43   = pLevel->iTabC
2ea00 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d  ur;.        op =
2ea10 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
2ea20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
2ea30 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
2ea40 46 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64  F ){.        Ind
2ea50 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65  ex *pJ = pTabIte
2ea60 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  m->pTab->pIndex;
2ea70 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
2ea80 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20  ur = iAuxArg;.  
2ea90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77 63        assert( wc
2eaa0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2eab0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2eac0 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   );.        whil
2ead0 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26  e( ALWAYS(pJ) &&
2eae0 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20   pJ!=pIx ){.    
2eaf0 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b        iIndexCur+
2eb00 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20  +;.          pJ 
2eb10 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = pJ->pNext;.   
2eb20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f       }.        o
2eb30 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  p = OP_OpenWrite
2eb40 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
2eb50 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  ->aiCurOnePass[1
2eb60 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  ] = iIndexCur;. 
2eb70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
2eb80 41 75 78 41 72 67 20 26 26 20 28 77 63 74 72 6c  AuxArg && (wctrl
2eb90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
2eba0 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20 29  _SUBCLAUSE)!=0 )
2ebb0 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  {.        iIndex
2ebc0 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20  Cur = iAuxArg;. 
2ebd0 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52         op = OP_R
2ebe0 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20  eopenIdx;.      
2ebf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
2ec00 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72 73  IndexCur = pPars
2ec10 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
2ec20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d   }.      pLevel-
2ec30 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65  >iIdxCur = iInde
2ec40 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65  xCur;.      asse
2ec50 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61  rt( pIx->pSchema
2ec60 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
2ec70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2ec80 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b   iIndexCur>=0 );
2ec90 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b  .      if( op ){
2eca0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ecb0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
2ecc0 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78  , iIndexCur, pIx
2ecd0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
2ece0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ecf0 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
2ed00 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
2ed10 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
2ed20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2ed30 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20  CONSTRAINT)!=0. 
2ed40 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
2ed50 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
2ed60 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
2ed70 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29  |WHERE_SKIPSCAN)
2ed80 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2ed90 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2eda0 20 26 20 57 48 45 52 45 5f 42 49 47 4e 55 4c 4c   & WHERE_BIGNULL
2edb0 5f 53 4f 52 54 29 3d 3d 30 0a 20 20 20 20 20 20  _SORT)==0.      
2edc0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
2edd0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
2ede0 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a  ORDERBY_MIN)==0.
2edf0 20 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e           && pWIn
2ee00 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 21 3d 57  fo->eDistinct!=W
2ee10 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
2ee20 44 45 52 45 44 0a 20 20 20 20 20 20 20 20 29 7b  DERED.        ){
2ee30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2ee40 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2ee50 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29  , OPFLAG_SEEKEQ)
2ee60 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d  ; /* Hint to COM
2ee70 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  DB2 */.        }
2ee80 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2ee90 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
2eea0 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66  Ix->zName));.#if
2eeb0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2eec0 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
2eed0 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  SK.        {.   
2eee0 20 20 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73         u64 colUs
2eef0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
2ef00 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20    int ii, jj;.  
2ef10 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
2ef20 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d  ; ii<pIx->nColum
2ef30 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n; ii++){.      
2ef40 20 20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e        jj = pIx->
2ef50 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20  aiColumn[ii];.  
2ef60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a            if( jj
2ef70 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
2ef80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
2ef90 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a  j>63 ) jj = 63;.
2efa0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2efb0 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73  (pTabItem->colUs
2efc0 65 64 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29  ed & MASKBIT(jj)
2efd0 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
2efe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
2eff0 55 73 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29  Used |= ((u64)1)
2f000 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20  <<(ii<63 ? ii : 
2f010 36 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  63);.          }
2f020 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2f030 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2f040 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
2f050 65 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30  ed, iIndexCur, 0
2f060 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f080 20 20 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73       (u8*)&colUs
2f090 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ed, P4_INT64);. 
2f0a0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
2f0b0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
2f0c0 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
2f0d0 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  K */.      }.   
2f0e0 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d   }.    if( iDb>=
2f0f0 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56  0 ) sqlite3CodeV
2f100 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
2f110 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  se, iDb);.  }.  
2f120 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
2f130 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f140 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
2f150 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2f160 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2f170 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47  inError;..  /* G
2f180 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
2f190 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
2f1a0 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
2f1b0 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
2f1c0 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
2f1d0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
2f1e0 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
2f1f0 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
2f200 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
2f210 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
2f220 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
2f230 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  ){.    int addrE
2f240 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20  xplain;.    int 
2f250 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65  wsFlags;.    pLe
2f260 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
2f270 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67  [ii];.    wsFlag
2f280 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  s = pLevel->pWLo
2f290 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66  op->wsFlags;.#if
2f2a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f2b0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
2f2c0 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
2f2d0 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
2f2e0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
2f2f0 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
2f300 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d    constructAutom
2f310 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65  aticIndex(pParse
2f320 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a  , &pWInfo->sWC,.
2f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f340 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
2f350 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74  vel->iFrom], not
2f360 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a  Ready, pLevel);.
2f370 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
2f380 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2f390 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2f3a0 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  r;.    }.#endif.
2f3b0 20 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e 20      addrExplain 
2f3c0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
2f3d0 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
2f3e0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54        pParse, pT
2f3f0 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
2f400 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29  wctrlFlags.    )
2f410 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
2f420 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  drBody = sqlite3
2f430 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f440 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  v);.    notReady
2f450 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43   = sqlite3WhereC
2f460 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
2f470 70 50 61 72 73 65 2c 76 2c 70 57 49 6e 66 6f 2c  pParse,v,pWInfo,
2f480 69 69 2c 70 4c 65 76 65 6c 2c 6e 6f 74 52 65 61  ii,pLevel,notRea
2f490 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  dy);.    pWInfo-
2f4a0 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65  >iContinue = pLe
2f4b0 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20  vel->addrCont;. 
2f4c0 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 26     if( (wsFlags&
2f4d0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d  WHERE_MULTI_OR)=
2f4e0 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  =0 && (wctrlFlag
2f4f0 73 26 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  s&WHERE_OR_SUBCL
2f500 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AUSE)==0 ){.    
2f510 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 41 64    sqlite3WhereAd
2f520 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70  dScanStatus(v, p
2f530 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
2f540 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20   addrExplain);. 
2f550 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
2f560 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f  one. */.  VdbeMo
2f570 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
2f580 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72  "Begin WHERE-cor
2f590 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e"));.  return p
2f5a0 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
2f5b0 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
2f5c0 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
2f5d0 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28  eginError:.  if(
2f5e0 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70   pWInfo ){.    p
2f5f0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2f600 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
2f610 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  dNQueryLoop;.   
2f620 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
2f630 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
2f640 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2f650 2a 0a 2a 2a 20 50 61 72 74 20 6f 66 20 73 71 6c  *.** Part of sql
2f660 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77  ite3WhereEnd() w
2f670 69 6c 6c 20 72 65 77 72 69 74 65 20 6f 70 63 6f  ill rewrite opco
2f680 64 65 73 20 74 6f 20 72 65 66 65 72 65 6e 63 65  des to reference
2f690 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 72 61   the.** index ra
2f6a0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  ther than the ma
2f6b0 69 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20 53 51  in table.  In SQ
2f6c0 4c 49 54 45 5f 44 45 42 55 47 20 6d 6f 64 65 2c  LITE_DEBUG mode,
2f6d0 20 77 65 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 74   we want.** to t
2f6e0 72 61 63 65 20 74 68 6f 73 65 20 63 68 61 6e 67  race those chang
2f6f0 65 73 20 69 66 20 50 52 41 47 4d 41 20 76 64 62  es if PRAGMA vdb
2f700 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f 6e 2e  e_addoptrace=on.
2f710 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
2f720 2a 20 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a  * does that..*/.
2f730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
2f740 45 42 55 47 0a 23 20 64 65 66 69 6e 65 20 4f 70  EBUG.# define Op
2f750 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65  codeRewriteTrace
2f760 28 44 2c 4b 2c 50 29 20 2f 2a 20 6e 6f 2d 6f 70  (D,K,P) /* no-op
2f770 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69   */.#else.# defi
2f780 6e 65 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65  ne OpcodeRewrite
2f790 54 72 61 63 65 28 44 2c 4b 2c 50 29 20 73 71 6c  Trace(D,K,P) sql
2f7a0 69 74 65 33 57 68 65 72 65 4f 70 63 6f 64 65 52  ite3WhereOpcodeR
2f7b0 65 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b 2c  ewriteTrace(D,K,
2f7c0 50 29 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  P).  static void
2f7d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 70 63   sqlite3WhereOpc
2f7e0 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65 28  odeRewriteTrace(
2f7f0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
2f800 2c 0a 20 20 20 20 69 6e 74 20 70 63 2c 0a 20 20  ,.    int pc,.  
2f810 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 0a 20 20    VdbeOp *pOp.  
2f820 29 7b 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e  ){.    if( (db->
2f830 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
2f840 64 62 65 41 64 64 6f 70 54 72 61 63 65 29 3d 3d  dbeAddopTrace)==
2f850 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
2f860 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
2f870 4f 70 28 30 2c 20 70 63 2c 20 70 4f 70 29 3b 0a  Op(0, pc, pOp);.
2f880 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a    }.#endif../*.*
2f890 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
2f8a0 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
2f8b0 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
2f8c0 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
2f8d0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
2f8e0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2f8f0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
2f900 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
2f910 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
2f920 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a  Info){.  Parse *
2f930 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
2f940 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
2f950 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2f960 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  be;.  int i;.  W
2f970 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
2f980 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  l;.  WhereLoop *
2f990 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74  pLoop;.  SrcList
2f9a0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
2f9b0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
2f9c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2f9d0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
2f9e0 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
2f9f0 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
2fa00 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75  .  */.  VdbeModu
2fa10 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
2fa20 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29  nd WHERE-core"))
2fa30 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f  ;.  for(i=pWInfo
2fa40 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30  ->nLevel-1; i>=0
2fa50 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
2fa60 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  addr;.    pLevel
2fa70 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
2fa80 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
2fa90 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
2faa0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
2fab0 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 23 69 66  !=OP_Noop ){.#if
2fac0 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2fad0 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49  BLE_SKIPAHEAD_DI
2fae0 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69 6e 74  STINCT.      int
2faf0 20 61 64 64 72 53 65 65 6b 20 3d 20 30 3b 0a 20   addrSeek = 0;. 
2fb00 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
2fb10 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
2fb20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
2fb30 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
2fb40 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
2fb50 45 44 0a 20 20 20 20 20 20 20 26 26 20 69 3d 3d  ED.       && i==
2fb60 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
2fb70 20 20 2f 2a 20 54 69 63 6b 65 74 20 5b 65 66 39    /* Ticket [ef9
2fb80 33 31 38 37 35 37 62 31 35 32 65 33 5d 20 32 30  318757b152e3] 20
2fb90 31 37 2d 31 30 2d 32 31 20 2a 2f 0a 20 20 20 20  17-10-21 */.    
2fba0 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
2fbb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2fbc0 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
2fbd0 20 26 26 20 28 70 49 64 78 20 3d 20 70 4c 6f 6f   && (pIdx = pLoo
2fbe0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2fbf0 78 29 2d 3e 68 61 73 53 74 61 74 31 0a 20 20 20  x)->hasStat1.   
2fc00 20 20 20 20 26 26 20 28 6e 20 3d 20 70 4c 6f 6f      && (n = pLoo
2fc10 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 44 69 73 74  p->u.btree.nDist
2fc20 69 6e 63 74 43 6f 6c 29 3e 30 0a 20 20 20 20 20  inctCol)>0.     
2fc30 20 20 26 26 20 70 49 64 78 2d 3e 61 69 52 6f 77    && pIdx->aiRow
2fc40 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a 20 20  LogEst[n]>=36.  
2fc50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
2fc60 6e 74 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e  nt r1 = pParse->
2fc70 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
2fc80 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20 20 20  int j, op;.     
2fc90 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
2fca0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2fcb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fcc0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2fcd0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2fce0 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20 20 20  , j, r1+j);.    
2fcf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
2fd00 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b  arse->nMem += n+
2fd10 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  1;.        op = 
2fd20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50  pLevel->op==OP_P
2fd30 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c 54 20  rev ? OP_SeekLT 
2fd40 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20 20 20  : OP_SeekGT;.   
2fd50 20 20 20 20 20 61 64 64 72 53 65 65 6b 20 3d 20       addrSeek = 
2fd60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fd70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c 65 76  4Int(v, op, pLev
2fd80 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 2c 20  el->iIdxCur, 0, 
2fd90 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  r1, n);.        
2fda0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2fdb0 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29  , op==OP_SeekLT)
2fdc0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2fdd0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
2fde0 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20 20 20  OP_SeekGT);.    
2fdf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fe00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
2fe10 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  , 1, pLevel->p2)
2fe20 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2fe30 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41 42   /* SQLITE_DISAB
2fe40 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53  LE_SKIPAHEAD_DIS
2fe50 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20 20 2f  TINCT */.      /
2fe60 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
2fe70 65 3a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  e: Advance to th
2fe80 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  e next row */.  
2fe90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2fea0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2feb0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
2fec0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2fed0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65  dbeAddOp3(v, pLe
2fee0 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
2fef0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c  >p1, pLevel->p2,
2ff00 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20   pLevel->p3);.  
2ff10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2ff20 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
2ff30 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64  l->p5);.      Vd
2ff40 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2ff50 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2ff60 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2ff70 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20  p==OP_Next);.   
2ff80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2ff90 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
2ffa0 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20  =OP_Prev);.     
2ffb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2ffc0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2ffd0 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  P_VNext);.      
2ffe0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 72 65 67 42  if( pLevel->regB
2fff0 69 67 6e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ignull ){.      
30000 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
30010 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
30020 76 65 6c 2d 3e 61 64 64 72 42 69 67 6e 75 6c 6c  vel->addrBignull
30030 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
30040 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
30050 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 70 4c  Op1(v, OP_If, pL
30060 65 76 65 6c 2d 3e 72 65 67 42 69 67 6e 75 6c 6c  evel->regBignull
30070 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
30080 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
30090 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
300a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
300b0 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 1, pLevel->
300c0 72 65 67 42 69 67 6e 75 6c 6c 29 3b 0a 20 20 20  regBignull);.   
300d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
300e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
300f0 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  o, 0, pLevel->p2
30100 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  -1);.        sql
30110 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
30120 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
30130 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
30140 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48  E_DISABLE_SKIPAH
30150 45 41 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20  EAD_DISTINCT.   
30160 20 20 20 69 66 28 20 61 64 64 72 53 65 65 6b 20     if( addrSeek 
30170 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
30180 70 48 65 72 65 28 76 2c 20 61 64 64 72 53 65 65  pHere(v, addrSee
30190 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  k);.#endif.    }
301a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
301b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
301c0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
301d0 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a  ddrCont);.    }.
301e0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
301f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
30200 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c  N_ABLE && pLevel
30210 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a  ->u.in.nIn>0 ){.
30220 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
30230 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
30240 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
30250 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
30260 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
30270 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
30280 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e  for(j=pLevel->u.
30290 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  in.nIn, pIn=&pLe
302a0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
302b0 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
302c0 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
302d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
302e0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
302f0 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
30300 20 20 20 20 69 66 28 20 70 49 6e 2d 3e 65 45 6e      if( pIn->eEn
30310 64 4c 6f 6f 70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70  dLoopOp!=OP_Noop
30320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
30330 28 20 70 49 6e 2d 3e 6e 50 72 65 66 69 78 20 29  ( pIn->nPrefix )
30340 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
30350 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  sert( pLoop->wsF
30360 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
30370 45 41 52 4c 59 4f 55 54 20 29 3b 0a 20 20 20 20  EARLYOUT );.    
30380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30390 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
303a0 4f 50 5f 49 66 4e 6f 48 6f 70 65 2c 20 70 4c 65  OP_IfNoHope, pLe
303b0 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 0a 20 20  vel->iIdxCur,.  
303c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
303e0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
303f0 64 72 28 76 29 2b 32 2c 0a 20 20 20 20 20 20 20  dr(v)+2,.       
30400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30410 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 42 61 73         pIn->iBas
30420 65 2c 20 70 49 6e 2d 3e 6e 50 72 65 66 69 78 29  e, pIn->nPrefix)
30430 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
30440 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
30450 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30470 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65  AddOp2(v, pIn->e
30480 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e  EndLoopOp, pIn->
30490 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
304a0 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nTop);.         
304b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
304c0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
304d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
304e0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
304f0 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20  P_Prev);.       
30500 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
30510 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
30520 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a  opOp==OP_Next);.
30530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30540 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
30550 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
30560 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20  drInTop-1);.    
30570 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
30580 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
30590 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
305a0 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69  >addrBrk);.    i
305b0 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  f( pLevel->addrS
305c0 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  kip ){.      sql
305d0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
305e0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
305f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
30600 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 73  ment((v, "next s
30610 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c  kip-scan on %s",
30620 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
30630 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b  pIndex->zName));
30640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30650 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c  beJumpHere(v, pL
30660 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b  evel->addrSkip);
30670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30680 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c  beJumpHere(v, pL
30690 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32  evel->addrSkip-2
306a0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
306b0 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45   SQLITE_LIKE_DOE
306c0 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a  SNT_MATCH_BLOBS.
306d0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
306e0 61 64 64 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20  addrLikeRep ){. 
306f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30700 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
30710 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69 6e 74 29  rJumpZero, (int)
30720 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65  (pLevel->iLikeRe
30730 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20 20 20 20  pCntr>>1),.     
30740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30750 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c     pLevel->addrL
30760 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20 20 56  ikeRep);.      V
30770 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
30780 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30790 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
307a0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
307b0 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e  int ws = pLoop->
307c0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 61  wsFlags;.      a
307d0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
307e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
307f0 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
30800 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76  ftJoin); VdbeCov
30810 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
30820 61 73 73 65 72 74 28 20 28 77 73 20 26 20 57 48  assert( (ws & WH
30830 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
30840 20 7c 7c 20 28 77 73 20 26 20 57 48 45 52 45 5f   || (ws & WHERE_
30850 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20  INDEXED)!=0 );. 
30860 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
30870 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
30880 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
30890 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ert( pLevel->iTa
308a0 62 43 75 72 3d 3d 70 54 61 62 4c 69 73 74 2d 3e  bCur==pTabList->
308b0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
308c0 2e 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  .iCursor );.    
308d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
308e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
308f0 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Row, pLevel->iTa
30900 62 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  bCur);.      }. 
30910 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
30920 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 0a 20  HERE_INDEXED) . 
30930 20 20 20 20 20 20 7c 7c 20 28 28 77 73 20 26 20        || ((ws & 
30940 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
30950 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f  && pLevel->u.pCo
30960 76 69 64 78 29 20 0a 20 20 20 20 20 20 29 7b 0a  vidx) .      ){.
30970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30980 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30990 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
309a0 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
309b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
309c0 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75  vel->op==OP_Retu
309d0 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rn ){.        sq
309e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
309f0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65  v, OP_Gosub, pLe
30a00 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
30a10 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
30a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
30a40 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  o(v, pLevel->add
30a50 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
30a60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30a70 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
30a80 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56  dr);.    }.    V
30a90 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
30aa0 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d  ((v, "End WHERE-
30ab0 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a  loop%d: %s", i,.
30ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ad0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61       pWInfo->pTa
30ae0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
30af0 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e  >iFrom].pTab->zN
30b00 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ame));.  }..  /*
30b10 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
30b20 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
30b30 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
30b40 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
30b50 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
30b60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
30b70 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
30b80 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
30b90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ..  assert( pWIn
30ba0 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62  fo->nLevel<=pTab
30bb0 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
30bc0 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
30bd0 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49  pWInfo->a; i<pWI
30be0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
30bf0 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
30c00 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20   int k, last;.  
30c10 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
30c20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
30c30 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   0;.    struct S
30c40 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
30c50 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
30c60 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
30c70 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
30c80 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
30c90 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
30ca0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
30cb0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
30cc0 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f  ->pWLoop;..    /
30cd0 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69  * For a co-routi
30ce0 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f  ne, change all O
30cf0 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  P_Column referen
30d00 63 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ces to the table
30d10 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
30d20 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f  o-routine into O
30d30 50 5f 43 6f 70 79 20 6f 66 20 72 65 73 75 6c 74  P_Copy of result
30d40 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 20   contained in a 
30d50 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a  register..    **
30d60 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65   OP_Rowid become
30d70 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a  s OP_Null..    *
30d80 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74  /.    if( pTabIt
30d90 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
30da0 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 74 65 73  ine ){.      tes
30db0 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
30dc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
30dd0 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61  );.      transla
30de0 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70  teColumnToCopy(p
30df0 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 61  Parse, pLevel->a
30e00 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d  ddrBody, pLevel-
30e10 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20  >iTabCur,.      
30e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e30 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e        pTabItem->
30e40 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20  regResult, 0);. 
30e50 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
30e60 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
30e70 49 54 45 5f 45 4e 41 42 4c 45 5f 45 41 52 4c 59  ITE_ENABLE_EARLY
30e80 5f 43 55 52 53 4f 52 5f 43 4c 4f 53 45 0a 20 20  _CURSOR_CLOSE.  
30e90 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
30ea0 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
30eb0 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
30ec0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
30ed0 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  gin..    ** Exce
30ee0 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65  pt, do not close
30ef0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 69   cursors that wi
30f00 6c 6c 20 62 65 20 72 65 75 73 65 64 20 62 79 20  ll be reused by 
30f10 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74  the OR optimizat
30f20 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52  ion.    ** (WHER
30f30 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 2e  E_OR_SUBCLAUSE).
30f40 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f    And do not clo
30f50 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72  se the OP_OpenWr
30f60 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20  ite cursors.    
30f70 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
30f80 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
30f90 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ization..    */.
30fa0 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
30fb0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
30fc0 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20  emeral)==0.     
30fd0 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
30fe0 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  ==0.     && (pWI
30ff0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
31000 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
31010 41 55 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  AUSE)==0.    ){.
31020 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70        int ws = p
31030 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
31040 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
31050 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
31060 53 53 5f 4f 46 46 20 26 26 20 28 77 73 20 26 20  SS_OFF && (ws & 
31070 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
31080 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
31090 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
310a0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
310b0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
310c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
310d0 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  f( (ws & WHERE_I
310e0 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
310f0 20 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52    && (ws & (WHER
31100 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f  E_IPK|WHERE_AUTO
31110 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20  _INDEX))==0 .   
31120 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69      && pLevel->i
31130 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e  IdxCur!=pWInfo->
31140 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a  aiCurOnePass[1].
31150 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
31160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31170 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
31180 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
31190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
311a0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
311b0 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73  f this scan uses
311c0 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20   an index, make 
311d0 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74 69  VDBE code substi
311e0 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20  tutions to read 
311f0 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  data.    ** from
31200 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65   the index inste
31210 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74  ad of from the t
31220 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69  able where possi
31230 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61  ble.  In some ca
31240 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ses.    ** this 
31250 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65  optimization pre
31260 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20  vents the table 
31270 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20  from ever being 
31280 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a  read, which can.
31290 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73      ** yield a s
312a0 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f  ignificant perfo
312b0 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20  rmance boost..  
312c0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
312d0 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
312e0 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
312f0 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
31300 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  Begin and.    **
31310 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
31320 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74   will have creat
31330 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66  ed code that ref
31340 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c  erences the tabl
31350 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  e.    ** directl
31360 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63  y.  This loop sc
31370 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64  ans all that cod
31380 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70  e looking for op
31390 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  codes.    ** tha
313a0 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
313b0 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72  table and conver
313c0 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63  ts them into opc
313d0 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  odes that.    **
313e0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69   reference the i
313f0 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
31400 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
31410 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44  ags & (WHERE_IND
31420 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f  EXED|WHERE_IDX_O
31430 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49  NLY) ){.      pI
31440 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
31450 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
31460 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
31470 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
31480 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20  _MULTI_OR ){.   
31490 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
314a0 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20  ->u.pCovidx;.   
314b0 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 0a   }.    if( pIdx.
314c0 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
314d0 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
314e0 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f  SS_OFF || !HasRo
314f0 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  wid(pIdx->pTable
31500 29 29 0a 20 20 20 20 20 26 26 20 21 64 62 2d 3e  )).     && !db->
31510 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20  mallocFailed.   
31520 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d   ){.      last =
31530 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
31540 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
31550 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64    k = pLevel->ad
31560 64 72 42 6f 64 79 3b 0a 23 69 66 64 65 66 20 53  drBody;.#ifdef S
31570 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
31580 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
31590 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
315a0 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
315b0 20 20 20 70 72 69 6e 74 66 28 22 54 52 41 4e 53     printf("TRANS
315c0 4c 41 54 45 20 6f 70 63 6f 64 65 73 20 69 6e 20  LATE opcodes in 
315d0 72 61 6e 67 65 20 25 64 2e 2e 25 64 5c 6e 22 2c  range %d..%d\n",
315e0 20 6b 2c 20 6c 61 73 74 2d 31 29 3b 0a 20 20 20   k, last-1);.   
315f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31600 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
31610 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a  dbeGetOp(v, k);.
31620 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61        for(; k<la
31630 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  st; k++, pOp++){
31640 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
31650 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54  ->p1!=pLevel->iT
31660 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
31670 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
31680 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
31690 6c 75 6d 6e 0a 23 69 66 64 65 66 20 53 51 4c 49  lumn.#ifdef SQLI
316a0 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
316b0 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20  _SQL_FUNC.      
316c0 20 20 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64     || pOp->opcod
316d0 65 3d 3d 4f 50 5f 4f 66 66 73 65 74 0a 23 65 6e  e==OP_Offset.#en
316e0 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  dif.        ){. 
316f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d           int x =
31700 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pOp->p2;.      
31710 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
31720 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  ->pTable==pTab )
31730 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31740 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
31750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  ){.            I
31760 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
31770 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
31780 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
31790 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61        x = pPk->a
317a0 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20  iColumn[x];.    
317b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
317c0 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x>=0 );.        
317d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20    }.          x 
317e0 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
317f0 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b  fIndex(pIdx, x);
31800 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78  .          if( x
31810 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
31820 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a     pOp->p2 = x;.
31830 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
31840 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
31850 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
31860 20 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65     OpcodeRewrite
31870 54 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f 70  Trace(db, k, pOp
31880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
31890 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
318a0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
318b0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
318c0 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 0a 20  Y)==0 || x>=0 . 
318d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
318e0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
318f0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
31900 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
31910 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
31920 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
31930 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
31940 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
31950 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
31960 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
31970 20 20 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65     OpcodeRewrite
31980 54 72 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f 70  Trace(db, k, pOp
31990 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
319a0 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
319b0 3d 3d 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 29  ==OP_IfNullRow )
319c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
319d0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
319e0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
319f0 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54 72   OpcodeRewriteTr
31a00 61 63 65 28 64 62 2c 20 6b 2c 20 70 4f 70 29 3b  ace(db, k, pOp);
31a10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31a20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
31a30 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28  _DEBUG.      if(
31a40 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
31a50 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
31a60 63 65 20 29 20 70 72 69 6e 74 66 28 22 54 52 41  ce ) printf("TRA
31a70 4e 53 4c 41 54 45 20 63 6f 6d 70 6c 65 74 65 5c  NSLATE complete\
31a80 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  n");.#endif.    
31a90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  }.  }..  /* Fina
31aa0 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20  l cleanup.  */. 
31ab0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
31ac0 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
31ad0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
31ae0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
31af0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  b, pWInfo);.  re
31b00 74 75 72 6e 3b 0a 7d 0a                          turn;.}.