/ Hex Artifact Content
Login

Artifact 3818e8a736a05d2cb194e64399af707e367fbcc5c251d785804d02eaf121288e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 45 78  Int.h"../*.** Ex
0360: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
0370: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
0380: 65 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  end of sqlite3_i
0390: 6e 64 65 78 5f 69 6e 66 6f 20 62 75 74 20 6e 6f  ndex_info but no
03a0: 74 0a 2a 2a 20 76 69 73 69 62 6c 65 20 74 6f 20  t.** visible to 
03b0: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 66  the xBestIndex f
03c0: 75 6e 63 74 69 6f 6e 2c 20 61 74 20 6c 65 61 73  unction, at leas
03d0: 74 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 2e 20  t not directly. 
03e0: 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   The.** sqlite3_
03f0: 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  vtab_collation()
0400: 20 69 6e 74 65 72 66 61 63 65 20 6b 6e 6f 77 73   interface knows
0410: 20 68 6f 77 20 74 6f 20 72 65 61 63 68 20 69 74   how to reach it
0420: 2c 20 68 6f 77 65 76 65 72 2e 0a 2a 2a 0a 2a 2a  , however..**.**
0430: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
0440: 6e 6f 74 20 61 6e 20 41 50 49 20 61 6e 64 20 63  not an API and c
0450: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 66 72  an be changed fr
0460: 6f 6d 20 6f 6e 65 20 72 65 6c 65 61 73 65 20 74  om one release t
0470: 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 2e 20 20  o the.** next.  
0480: 41 73 20 6c 6f 6e 67 20 61 73 20 61 6c 6c 6f 63  As long as alloc
0490: 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 61  ateIndexInfo() a
04a0: 6e 64 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  nd sqlite3_vtab_
04b0: 63 6f 6c 6c 61 74 69 6f 6e 28 29 0a 2a 2a 20 61  collation().** a
04c0: 67 72 65 65 20 6f 6e 20 74 68 65 20 73 74 72 75  gree on the stru
04d0: 63 74 75 72 65 2c 20 61 6c 6c 20 77 69 6c 6c 20  cture, all will 
04e0: 62 65 20 77 65 6c 6c 2e 0a 2a 2f 0a 74 79 70 65  be well..*/.type
04f0: 64 65 66 20 73 74 72 75 63 74 20 48 69 64 64 65  def struct Hidde
0500: 6e 49 6e 64 65 78 49 6e 66 6f 20 48 69 64 64 65  nIndexInfo Hidde
0510: 6e 49 6e 64 65 78 49 6e 66 6f 3b 0a 73 74 72 75  nIndexInfo;.stru
0520: 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e  ct HiddenIndexIn
0530: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
0540: 73 65 20 2a 70 57 43 3b 20 20 20 2f 2a 20 54 68  se *pWC;   /* Th
0550: 65 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 62  e Where clause b
0560: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
0570: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0580: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ;      /* The pa
0590: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
05a0: 0a 7d 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  .};../* Forward 
05b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d  declaration of m
05c0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
05d0: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
05e0: 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57  size(sqlite3*, W
05f0: 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b  hereLoop*, int);
0600: 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72 69 61 62  ../* Test variab
0610: 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  le that can be s
0620: 65 74 20 74 6f 20 65 6e 61 62 6c 65 20 57 48 45  et to enable WHE
0630: 52 45 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  RE tracing */.#i
0640: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
0650: 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
0660: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
0670: 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69 74 65  /***/ int sqlite
0680: 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
0690: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
06a0: 52 65 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d  Return the estim
06b0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
06c0: 75 74 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20  utput rows from 
06d0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  a WHERE clause.*
06e0: 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69 74 65 33  /.LogEst sqlite3
06f0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
0700: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
0710: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
0720: 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
0730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0740: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  n one of the WHE
0750: 52 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78  RE_DISTINCT_xxxx
0760: 78 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69  x values to indi
0770: 63 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a  cate how this.**
0780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0790: 74 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f  turns outputs fo
07a0: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
07b0: 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssing..*/.int sq
07c0: 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
07d0: 69 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a  inct(WhereInfo *
07e0: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
07f0: 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  n pWInfo->eDisti
0800: 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nct;.}../*.** Re
0810: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0820: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0830: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
0840: 44 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a  DER BY order..**
0850: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
0860: 20 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64   the output need
0870: 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a  s to be sorted..
0880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
0890: 65 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65  ereIsOrdered(Whe
08a0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
08b0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
08c0: 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a  ->nOBSat;.}../*.
08d0: 2a 2a 20 49 6e 20 74 68 65 20 4f 52 44 45 52 20  ** In the ORDER 
08e0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
08f0: 61 74 69 6f 6e 2c 20 69 66 20 74 68 65 20 69 6e  ation, if the in
0900: 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 20 69 73  ner-most loop is
0910: 20 6b 6e 6f 77 6e 0a 2a 2a 20 74 6f 20 65 6d 69   known.** to emi
0920: 74 20 72 6f 77 73 20 69 6e 20 69 6e 63 72 65 61  t rows in increa
0930: 73 69 6e 67 20 6f 72 64 65 72 2c 20 61 6e 64 20  sing order, and 
0940: 69 66 20 74 68 65 20 6c 61 73 74 20 72 6f 77 20  if the last row 
0950: 65 6d 69 74 74 65 64 20 62 79 20 74 68 65 0a 2a  emitted by the.*
0960: 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f  * inner-most loo
0970: 70 20 64 69 64 20 6e 6f 74 20 66 69 74 20 77 69  p did not fit wi
0980: 74 68 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  thin the sorter,
0990: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 73 6b 69   then we can ski
09a0: 70 20 61 6c 6c 0a 2a 2a 20 73 75 62 73 65 71 75  p all.** subsequ
09b0: 65 6e 74 20 72 6f 77 73 20 66 6f 72 20 74 68 65  ent rows for the
09c0: 20 63 75 72 72 65 6e 74 20 69 74 65 72 61 74 69   current iterati
09d0: 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  on of the inner 
09e0: 6c 6f 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  loop (because th
09f0: 65 79 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  ey.** will not f
0a00: 69 74 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  it in the sorter
0a10: 20 65 69 74 68 65 72 29 20 61 6e 64 20 63 6f 6e   either) and con
0a20: 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 73  tinue with the s
0a30: 65 63 6f 6e 64 20 69 6e 6e 65 72 0a 2a 2a 20 6c  econd inner.** l
0a40: 6f 6f 70 20 2d 20 74 68 65 20 6c 6f 6f 70 20 69  oop - the loop i
0a50: 6d 6d 65 64 69 61 74 65 6c 79 20 6f 75 74 73 69  mmediately outsi
0a60: 64 65 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  de the inner-mos
0a70: 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  t..**.** When a 
0a80: 72 6f 77 20 64 6f 65 73 20 6e 6f 74 20 66 69 74  row does not fit
0a90: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 28   in the sorter (
0aa0: 62 65 63 61 75 73 65 20 74 68 65 20 73 6f 72 74  because the sort
0ab0: 65 72 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 6f  er already.** ho
0ac0: 6c 64 73 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  lds LIMIT+OFFSET
0ad0: 20 72 6f 77 73 20 74 68 61 74 20 61 72 65 20 73   rows that are s
0ae0: 6d 61 6c 6c 65 72 29 2c 20 74 68 65 6e 20 61 20  maller), then a 
0af0: 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20  jump is made to 
0b00: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 72 65 74  the.** label ret
0b10: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
0b20: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
0b30: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c 49   the ORDER BY LI
0b40: 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  MIT optimization
0b50: 20 61 70 70 6c 69 65 73 2c 20 74 68 65 20 6a 75   applies, the ju
0b60: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73  mp destination s
0b70: 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20  hould.** be the 
0b80: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72  continuation for
0b90: 20 74 68 65 20 73 65 63 6f 6e 64 2d 69 6e 6e 65   the second-inne
0ba0: 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20 20 49 66  r-most loop.  If
0bb0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
0bc0: 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74   LIMIT optimizat
0bd0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  ion does not app
0be0: 6c 79 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d  ly, then the jum
0bf0: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73 68  p destination sh
0c00: 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20 63  ould.** be the c
0c10: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72 20  ontinuation for 
0c20: 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c  the inner-most l
0c30: 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  oop..**.** It is
0c40: 20 61 6c 77 61 79 73 20 73 61 66 65 20 66 6f 72   always safe for
0c50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
0c60: 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 74   return the cont
0c70: 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  inuation of the.
0c80: 2a 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f  ** inner-most lo
0c90: 6f 70 2c 20 69 6e 20 74 68 65 20 73 65 6e 73 65  op, in the sense
0ca0: 20 74 68 61 74 20 61 20 63 6f 72 72 65 63 74 20   that a correct 
0cb0: 61 6e 73 77 65 72 20 77 69 6c 6c 20 72 65 73 75  answer will resu
0cc0: 6c 74 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e 69  lt.  .** Returni
0cd0: 6e 67 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ng the continuat
0ce0: 69 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ion the second i
0cf0: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 61 6e 20  nner loop is an 
0d00: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
0d10: 74 68 61 74 20 6d 69 67 68 74 20 6d 61 6b 65 20  that might make 
0d20: 74 68 65 20 63 6f 64 65 20 72 75 6e 20 61 20 6c  the code run a l
0d30: 69 74 74 6c 65 20 66 61 73 74 65 72 2c 20 62 75  ittle faster, bu
0d40: 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61  t should not cha
0d50: 6e 67 65 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c  nge.** the final
0d60: 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
0d70: 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65  sqlite3WhereOrde
0d80: 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c  rByLimitOptLabel
0d90: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0da0: 66 6f 29 7b 0a 20 20 57 68 65 72 65 4c 65 76 65  fo){.  WhereLeve
0db0: 6c 20 2a 70 49 6e 6e 65 72 3b 0a 20 20 69 66 28  l *pInner;.  if(
0dc0: 20 21 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72   !pWInfo->bOrder
0dd0: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
0de0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
0df0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
0e00: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ation does not a
0e10: 70 70 6c 79 2e 20 20 4a 75 6d 70 20 74 6f 20 74  pply.  Jump to t
0e20: 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 69  he .    ** conti
0e30: 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  nuation of the i
0e40: 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20  nner-most loop. 
0e50: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 57  */.    return pW
0e60: 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b  Info->iContinue;
0e70: 0a 20 20 7d 0a 20 20 70 49 6e 6e 65 72 20 3d 20  .  }.  pInner = 
0e80: 26 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66  &pWInfo->a[pWInf
0e90: 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 3b 0a 20 20  o->nLevel-1];.  
0ea0: 61 73 73 65 72 74 28 20 70 49 6e 6e 65 72 2d 3e  assert( pInner->
0eb0: 61 64 64 72 4e 78 74 21 3d 30 20 29 3b 0a 20 20  addrNxt!=0 );.  
0ec0: 72 65 74 75 72 6e 20 70 49 6e 6e 65 72 2d 3e 61  return pInner->a
0ed0: 64 64 72 4e 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ddrNxt;.}../*.**
0ee0: 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42 45   Return the VDBE
0ef0: 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62 65   address or labe
0f00: 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e 20  l to jump to in 
0f10: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e 75  order to continu
0f20: 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
0f30: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72   with the next r
0f40: 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63 6c  ow of a WHERE cl
0f50: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
0f60: 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
0f70: 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  eLabel(WhereInfo
0f80: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
0f90: 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ert( pWInfo->iCo
0fa0: 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 72  ntinue!=0 );.  r
0fb0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 43  eturn pWInfo->iC
0fc0: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
0fd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
0fe0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
0ff0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
1000: 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b 0a   order to break.
1010: 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45 52  ** out of a WHER
1020: 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  E loop..*/.int s
1030: 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
1040: 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f 20  Label(WhereInfo 
1050: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
1060: 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  rn pWInfo->iBrea
1070: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
1080: 72 6e 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 28  rn ONEPASS_OFF (
1090: 30 29 20 69 66 20 61 6e 20 55 50 44 41 54 45 20  0) if an UPDATE 
10a0: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
10b0: 65 6e 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  ent is unable to
10c0: 0a 2a 2a 20 6f 70 65 72 61 74 65 20 64 69 72 65  .** operate dire
10d0: 63 74 6c 79 20 6f 6e 20 74 68 65 20 72 6f 77 69  ctly on the rowi
10e0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  s returned by a 
10f0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52  WHERE clause.  R
1100: 65 74 75 72 6e 0a 2a 2a 20 4f 4e 45 50 41 53 53  eturn.** ONEPASS
1110: 5f 53 49 4e 47 4c 45 20 28 31 29 20 69 66 20 74  _SINGLE (1) if t
1120: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  he statement can
1130: 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 72 65 63   operation direc
1140: 74 6c 79 20 62 65 63 61 75 73 65 20 6f 6e 6c 79  tly because only
1150: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  .** a single row
1160: 20 69 73 20 74 6f 20 62 65 20 63 68 61 6e 67 65   is to be change
1170: 64 2e 20 20 52 65 74 75 72 6e 20 4f 4e 45 50 41  d.  Return ONEPA
1180: 53 53 5f 4d 55 4c 54 49 20 28 32 29 20 69 66 20  SS_MULTI (2) if 
1190: 74 68 65 20 6f 6e 65 2d 70 61 73 73 0a 2a 2a 20  the one-pass.** 
11a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
11b0: 20 62 65 20 75 73 65 64 20 6f 6e 20 6d 75 6c 74   be used on mult
11c0: 69 70 6c 65 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  iple .**.** If t
11d0: 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
11e0: 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ization is used 
11f0: 28 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65  (if this routine
1200: 20 72 65 74 75 72 6e 73 20 74 72 75 65 29 0a 2a   returns true).*
1210: 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  * then also writ
1220: 65 20 74 68 65 20 69 6e 64 69 63 65 73 20 6f 66  e the indices of
1230: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 75 73   open cursors us
1240: 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a 2a 2a  ed by ONEPASS.**
1250: 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d 20 61   into aiCur[0] a
1260: 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20 69 61  nd aiCur[1].  ia
1270: 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68 65 20  Cur[0] gets the 
1280: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 64 61  cursor of the da
1290: 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  ta.** table and 
12a0: 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20 74 68  iaCur[1] gets th
12b0: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  e cursor used by
12c0: 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 69 6e   an auxiliary in
12d0: 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72 20 76  dex..** Either v
12e0: 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31 2c 20  alue may be -1, 
12f0: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1300: 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 75 73  cursor is not us
1310: 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72 73 6f  ed..** Any curso
1320: 72 73 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  rs returned will
1330: 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1340: 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  d for writing..*
1350: 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20 61 6e  *.** aiCur[0] an
1360: 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74 68 20  d aiCur[1] both 
1370: 67 65 74 20 2d 31 20 69 66 20 74 68 65 20 77 68  get -1 if the wh
1380: 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67 69 63  ere-clause logic
1390: 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f   is.** unable to
13a0: 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41 53 53   use the ONEPASS
13b0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
13c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
13d0: 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72  reOkOnePass(Wher
13e0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 69  eInfo *pWInfo, i
13f0: 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20 6d 65  nt *aiCur){.  me
1400: 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57 49 6e  mcpy(aiCur, pWIn
1410: 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
1420: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 29  , sizeof(int)*2)
1430: 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
1440: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
1450: 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1460: 61 63 65 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  ace && pWInfo->e
1470: 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
1480: 5f 4f 46 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  _OFF ){.    sqli
1490: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
14a0: 25 73 20 63 75 72 73 6f 72 73 3a 20 25 64 20 25  %s cursors: %d %
14b0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
14c0: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
14d0: 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20  =ONEPASS_SINGLE 
14e0: 3f 20 22 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  ? "ONEPASS_SINGL
14f0: 45 22 20 3a 20 22 4f 4e 45 50 41 53 53 5f 4d 55  E" : "ONEPASS_MU
1500: 4c 54 49 22 2c 0a 20 20 20 20 20 20 20 20 20 61  LTI",.         a
1510: 69 43 75 72 5b 30 5d 2c 20 61 69 43 75 72 5b 31  iCur[0], aiCur[1
1520: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ]);.  }.#endif. 
1530: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
1540: 65 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a  eOnePass;.}../*.
1550: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6e 74  ** Move the cont
1560: 65 6e 74 20 6f 66 20 70 53 72 63 20 69 6e 74 6f  ent of pSrc into
1570: 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74 69 63   pDest.*/.static
1580: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 4d 6f 76   void whereOrMov
1590: 65 28 57 68 65 72 65 4f 72 53 65 74 20 2a 70 44  e(WhereOrSet *pD
15a0: 65 73 74 2c 20 57 68 65 72 65 4f 72 53 65 74 20  est, WhereOrSet 
15b0: 2a 70 53 72 63 29 7b 0a 20 20 70 44 65 73 74 2d  *pSrc){.  pDest-
15c0: 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a 20 20  >n = pSrc->n;.  
15d0: 6d 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 61 2c  memcpy(pDest->a,
15e0: 20 70 53 72 63 2d 3e 61 2c 20 70 44 65 73 74 2d   pSrc->a, pDest-
15f0: 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73 74 2d  >n*sizeof(pDest-
1600: 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >a[0]));.}../*.*
1610: 2a 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74 20  * Try to insert 
1620: 61 20 6e 65 77 20 70 72 65 72 65 71 75 69 73 69  a new prerequisi
1630: 74 65 2f 63 6f 73 74 20 65 6e 74 72 79 20 69 6e  te/cost entry in
1640: 74 6f 20 74 68 65 20 57 68 65 72 65 4f 72 53 65  to the WhereOrSe
1650: 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  t pSet..**.** Th
1660: 65 20 6e 65 77 20 65 6e 74 72 79 20 6d 69 67 68  e new entry migh
1670: 74 20 6f 76 65 72 77 72 69 74 65 20 61 6e 20 65  t overwrite an e
1680: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2c 20 6f  xisting entry, o
1690: 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a  r it might be.**
16a0: 20 61 70 70 65 6e 64 65 64 2c 20 6f 72 20 69 74   appended, or it
16b0: 20 6d 69 67 68 74 20 62 65 20 64 69 73 63 61 72   might be discar
16c0: 64 65 64 2e 20 20 44 6f 20 77 68 61 74 65 76 65  ded.  Do whateve
16d0: 72 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  r is the right t
16e0: 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61 74 20  hing.** so that 
16f0: 70 53 65 74 20 6b 65 65 70 73 20 74 68 65 20 4e  pSet keeps the N
1700: 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74 20 65 6e  _OR_COST best en
1710: 74 72 69 65 73 20 73 65 65 6e 20 73 6f 20 66 61  tries seen so fa
1720: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1730: 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 0a   whereOrInsert(.
1740: 20 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53    WhereOrSet *pS
1750: 65 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  et,      /* The 
1760: 57 68 65 72 65 4f 72 53 65 74 20 74 6f 20 62 65  WhereOrSet to be
1770: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 42 69   updated */.  Bi
1780: 74 6d 61 73 6b 20 70 72 65 72 65 71 2c 20 20 20  tmask prereq,   
1790: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 69       /* Prerequi
17a0: 73 69 74 65 73 20 6f 66 20 74 68 65 20 6e 65 77  sites of the new
17b0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
17c0: 73 74 20 72 52 75 6e 2c 20 20 20 20 20 20 20 20  st rRun,        
17d0: 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74 20 6f     /* Run-cost o
17e0: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
17f0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  */.  LogEst nOut
1800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1810: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73  umber of outputs
1820: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
1830: 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 69  ry */.){.  u16 i
1840: 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f 73 74 20  ;.  WhereOrCost 
1850: 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53 65 74  *p;.  for(i=pSet
1860: 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61 3b 20  ->n, p=pSet->a; 
1870: 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a  i>0; i--, p++){.
1880: 20 20 20 20 69 66 28 20 72 52 75 6e 3c 3d 70 2d      if( rRun<=p-
1890: 3e 72 52 75 6e 20 26 26 20 28 70 72 65 72 65 71  >rRun && (prereq
18a0: 20 26 20 70 2d 3e 70 72 65 72 65 71 29 3d 3d 70   & p->prereq)==p
18b0: 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 67  rereq ){.      g
18c0: 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e 73 65 72  oto whereOrInser
18d0: 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  t_done;.    }.  
18e0: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
18f0: 52 75 6e 20 26 26 20 28 70 2d 3e 70 72 65 72 65  Run && (p->prere
1900: 71 20 26 20 70 72 65 72 65 71 29 3d 3d 70 2d 3e  q & prereq)==p->
1910: 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20  prereq ){.      
1920: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1930: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74 2d 3e    }.  if( pSet->
1940: 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b 0a 20  n<N_OR_COST ){. 
1950: 20 20 20 70 20 3d 20 26 70 53 65 74 2d 3e 61 5b     p = &pSet->a[
1960: 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20  pSet->n++];.    
1970: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
1980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
1990: 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20 66 6f   pSet->a;.    fo
19a0: 72 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d 3e 6e  r(i=1; i<pSet->n
19b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
19c0: 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74 2d 3e  ( p->rRun>pSet->
19d0: 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20 3d 20  a[i].rRun ) p = 
19e0: 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20 20 20  pSet->a + i;.   
19f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52   }.    if( p->rR
1a00: 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74 75 72  un<=rRun ) retur
1a10: 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65 4f 72  n 0;.  }.whereOr
1a20: 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20 20 70  Insert_done:.  p
1a30: 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65  ->prereq = prere
1a40: 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d 20 72  q;.  p->rRun = r
1a50: 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  Run;.  if( p->nO
1a60: 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e 4f 75  ut>nOut ) p->nOu
1a70: 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65 74 75  t = nOut;.  retu
1a80: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
1a90: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
1aa0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
1ab0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
1ac0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
1ad0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
1ae0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 42 69 74   the set..*/.Bit
1af0: 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72  mask sqlite3Wher
1b00: 65 47 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61  eGetMask(WhereMa
1b10: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
1b20: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
1b30: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1b40: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28  ( pMaskSet->n<=(
1b50: 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61  int)sizeof(Bitma
1b60: 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69  sk)*8 );.  for(i
1b70: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
1b80: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
1b90: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
1ba0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
1bb0: 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49     return MASKBI
1bc0: 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(i);.    }.  }.
1bd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1be0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1bf0: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
1c00: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
1c10: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
1c20: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
1c30: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1c40: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
1c50: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
1c60: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1c70: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
1c80: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
1c90: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
1ca0: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
1cb0: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
1cc0: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
1cd0: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
1ce0: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
1cf0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
1d00: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
1d10: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
1d20: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
1d30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
1d40: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
1d50: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
1d60: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
1d70: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
1d80: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
1d90: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1da0: 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72  to the next Wher
1db0: 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68  eTerm that match
1dc0: 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
1dd0: 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
1de0: 65 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e  established when
1df0: 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63   the pScan objec
1e00: 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  t was initialize
1e10: 64 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e  d by whereScanIn
1e20: 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  it()..** Return 
1e30: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
1e40: 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69  e no more matchi
1e50: 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  ng WhereTerms..*
1e60: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
1e70: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
1e80: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
1e90: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1eb0: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
1ec0: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
1ed0: 20 2a 2f 0a 20 20 69 31 36 20 69 43 6f 6c 75 6d   */.  i16 iColum
1ee0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
1ef0: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
1f00: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
1f10: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
1f20: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1f30: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1f40: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
1f50: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
1f60: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
1f70: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
1f80: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
1f90: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1fa0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
1fb0: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
1fc0: 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e  .  int k = pScan
1fd0: 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  ->k;    /* Where
1fe0: 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69   to start scanni
1ff0: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
2000: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d   pScan->iEquiv<=
2010: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 3b  pScan->nEquiv );
2020: 0a 20 20 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  .  pWC = pScan->
2030: 70 57 43 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  pWC;.  while(1){
2040: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
2050: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
2060: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
2070: 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63 61  .    iCur = pSca
2080: 6e 2d 3e 61 69 43 75 72 5b 70 53 63 61 6e 2d 3e  n->aiCur[pScan->
2090: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 61  iEquiv-1];.    a
20a0: 73 73 65 72 74 28 20 70 57 43 21 3d 30 20 29 3b  ssert( pWC!=0 );
20b0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66  .    do{.      f
20c0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
20d0: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
20e0: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
20f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2100: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
2110: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
2120: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
2130: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
2140: 20 20 20 20 20 20 26 26 20 28 69 43 6f 6c 75 6d        && (iColum
2150: 6e 21 3d 58 4e 5f 45 58 50 52 0a 20 20 20 20 20  n!=XN_EXPR.     
2160: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2170: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2180: 70 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  p(pTerm->pExpr->
2190: 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20  pLeft,.         
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
21c0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 2c 69 43  can->pIdxExpr,iC
21d0: 75 72 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ur)==0).        
21e0: 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71 75   && (pScan->iEqu
21f0: 69 76 3c 3d 31 20 7c 7c 20 21 45 78 70 72 48 61  iv<=1 || !ExprHa
2200: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
2210: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
2220: 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29 7b  oin)).        ){
2230: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2240: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2250: 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a   & WO_EQUIV)!=0.
2260: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
2270: 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61  can->nEquiv<Arra
2280: 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 69 43  ySize(pScan->aiC
2290: 75 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  ur).           &
22a0: 26 20 28 70 58 20 3d 20 73 71 6c 69 74 65 33 45  & (pX = sqlite3E
22b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
22c0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
22d0: 67 68 74 29 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  ght))->op==TK_CO
22e0: 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 29  LUMN.          )
22f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2300: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t j;.           
2310: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61   for(j=0; j<pSca
2320: 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 2b 29 7b  n->nEquiv; j++){
2330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2340: 66 28 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  f( pScan->aiCur[
2350: 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20  j]==pX->iTable. 
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2370: 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e   pScan->aiColumn
2380: 5b 6a 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e  [j]==pX->iColumn
2390: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23d0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53         if( j==pS
23e0: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
2400: 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 20 3d 20 70  an->aiCur[j] = p
2410: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  X->iTable;.     
2420: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2430: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 58  aiColumn[j] = pX
2440: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
2450: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2460: 6e 45 71 75 69 76 2b 2b 3b 0a 20 20 20 20 20 20  nEquiv++;.      
2470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2480: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2490: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
24a0: 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d  tor & pScan->opM
24b0: 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
24c0: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
24d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e   the affinity an
24e0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
24f0: 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20  ence match */.  
2500: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2510: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26  can->zCollName &
2520: 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
2530: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29  tor & WO_ISNULL)
2540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2550: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2560: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
2570: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
2580: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e   = pWC->pWInfo->
2590: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
25a0: 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
25b0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
25c0: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
25d0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
25e0: 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64  Ok(pX, pScan->id
25f0: 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20  xaff) ){.       
2600: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2610: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2620: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2630: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
2640: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2650: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2660: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2670: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20  llSeq(pParse,.  
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
26c0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
26d0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
26e0: 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61  =0 ) pColl = pPa
26f0: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
2700: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
2710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2720: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
2730: 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e  e, pScan->zCollN
2740: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
2750: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2760: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2770: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2780: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2790: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
27a0: 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
27b0: 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
27c0: 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72     && (pX = pTer
27d0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
27e0: 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  )->op==TK_COLUMN
27f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2800: 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63   pX->iTable==pSc
2810: 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 0a 20 20 20  an->aiCur[0].   
2820: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
2830: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d  >iColumn==pScan-
2840: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 0a 20 20 20  >aiColumn[0].   
2850: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2860: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2870: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
2880: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
28a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
28b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28c0: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
28d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  WC;.            
28e0: 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a  pScan->k = k+1;.
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2900: 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20  rn pTerm;.      
2910: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
2930: 43 20 3d 20 70 57 43 2d 3e 70 4f 75 74 65 72 3b  C = pWC->pOuter;
2940: 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  .      k = 0;.  
2950: 20 20 7d 77 68 69 6c 65 28 20 70 57 43 21 3d 30    }while( pWC!=0
2960: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 63 61   );.    if( pSca
2970: 6e 2d 3e 69 45 71 75 69 76 3e 3d 70 53 63 61 6e  n->iEquiv>=pScan
2980: 2d 3e 6e 45 71 75 69 76 20 29 20 62 72 65 61 6b  ->nEquiv ) break
2990: 3b 0a 20 20 20 20 70 57 43 20 3d 20 70 53 63 61  ;.    pWC = pSca
29a0: 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20  n->pOrigWC;.    
29b0: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  k = 0;.    pScan
29c0: 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20 20 7d 0a  ->iEquiv++;.  }.
29d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
29e0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
29f0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
2a00: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
2a10: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2a20: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
2a30: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
2a40: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
2a50: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
2a60: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
2a70: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
2a80: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
2a90: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
2aa0: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
2ab0: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
2ac0: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
2ad0: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
2ae0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
2af0: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 20 4f 72 20  e.** iCur.   Or 
2b00: 69 66 20 70 49 64 78 21 3d 30 20 74 68 65 6e 20  if pIdx!=0 then 
2b10: 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  X is column iCol
2b20: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
2b30: 78 2e 20 20 70 49 64 78 0a 2a 2a 20 6d 75 73 74  x.  pIdx.** must
2b40: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   be one of the i
2b50: 6e 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20  ndexes of table 
2b60: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2b70: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
2b80: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
2b90: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
2ba0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
2bb0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
2bc0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
2bd0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
2be0: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
2bf0: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
2c00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
2c10: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
2c20: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
2c30: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
2c40: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
2c50: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
2c60: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
2c70: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
2c80: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
2c90: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
2ca0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
2cb0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
2cc0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
2cd0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2ce0: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
2cf0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2d00: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
2d10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
2d20: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
2d30: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
2d40: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
2d50: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
2d60: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
2d70: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
2d80: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2d90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2da0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
2db0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
2dc0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
2dd0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2de0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
2df0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
2e10: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
2e20: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e40: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
2e50: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
2e60: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2e70: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
2e80: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
2e90: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
2ea0: 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43    pScan->pOrigWC
2eb0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2ec0: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  >pWC = pWC;.  pS
2ed0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20  can->pIdxExpr = 
2ee0: 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  0;.  pScan->idxa
2ef0: 66 66 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d  ff = 0;.  pScan-
2f00: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a  >zCollName = 0;.
2f10: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
2f20: 20 20 69 6e 74 20 6a 20 3d 20 69 43 6f 6c 75 6d    int j = iColum
2f30: 6e 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  n;.    iColumn =
2f40: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
2f50: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  j];.    if( iCol
2f60: 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  umn==XN_EXPR ){.
2f70: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64        pScan->pId
2f80: 78 45 78 70 72 20 3d 20 70 49 64 78 2d 3e 61 43  xExpr = pIdx->aC
2f90: 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78  olExpr->a[j].pEx
2fa0: 70 72 3b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d  pr;.      pScan-
2fb0: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
2fc0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
2fd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
2fe0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c  umn==pIdx->pTabl
2ff0: 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  e->iPKey ){.    
3000: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52    iColumn = XN_R
3010: 4f 57 49 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20  OWID;.    }else 
3020: 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  if( iColumn>=0 )
3030: 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 69  {.      pScan->i
3040: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
3050: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
3060: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
3070: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
3080: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
3090: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20  oll[j];.    }.  
30a0: 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75 6d  }else if( iColum
30b0: 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  n==XN_EXPR ){.  
30c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
30d0: 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20    pScan->opMask 
30e0: 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61  = opMask;.  pSca
30f0: 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61  n->k = 0;.  pSca
3100: 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d 20 69 43  n->aiCur[0] = iC
3110: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43  ur;.  pScan->aiC
3120: 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43 6f 6c 75  olumn[0] = iColu
3130: 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71  mn;.  pScan->nEq
3140: 75 69 76 20 3d 20 31 3b 0a 20 20 70 53 63 61 6e  uiv = 1;.  pScan
3150: 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b 0a 20 20  ->iEquiv = 1;.  
3160: 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e  return whereScan
3170: 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a  Next(pScan);.}..
3180: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
3190: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
31a0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
31b0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
31c0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
31d0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
31e0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
31f0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
3200: 65 20 69 43 75 72 20 6f 72 20 6f 66 20 69 6e 64  e iCur or of ind
3210: 65 78 20 70 49 64 78 0a 2a 2a 20 69 66 20 70 49  ex pIdx.** if pI
3220: 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70 3e 20 69  dx!=0 and <op> i
3230: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 4f 5f  s one of the WO_
3240: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
3250: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 2a  s specified by.*
3260: 2a 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  * the op paramet
3270: 65 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  er.  Return a po
3280: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72  inter to the ter
3290: 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  m.  Return 0 if 
32a0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
32b0: 20 49 66 20 70 49 64 78 21 3d 30 20 74 68 65 6e   If pIdx!=0 then
32c0: 20 69 74 20 6d 75 73 74 20 62 65 20 6f 6e 65 20   it must be one 
32d0: 6f 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f  of the indexes o
32e0: 66 20 74 61 62 6c 65 20 69 43 75 72 2e 20 20 0a  f table iCur.  .
32f0: 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 65  ** Search for te
3300: 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 74 68 65  rms matching the
3310: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
3320: 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a 20 72 61  mn of pIdx.** ra
3330: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 69 43  ther than the iC
3340: 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
3350: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a  of table iCur..*
3360: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65  *.** The term re
3370: 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20  turned might by 
3380: 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72  Y=<expr> if ther
3390: 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e  e is another con
33a0: 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68  straint in.** th
33b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
33c0: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
33d0: 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63  at X=Y.  Any suc
33e0: 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  h constraints wi
33f0: 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66  ll be.** identif
3400: 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51  ied by the WO_EQ
3410: 55 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70  UIV bit in the p
3420: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
3430: 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61  field.  The.** a
3440: 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75 6d 6e 5b  iCur[]/iaColumn[
3450: 5d 20 61 72 72 61 79 73 20 68 6f 6c 64 20 58 20  ] arrays hold X 
3460: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
3470: 76 61 6c 65 6e 74 73 2e 20 54 68 65 72 65 20 61  valents. There a
3480: 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74 73 20 69  re 11.** slots i
3490: 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43 6f 6c 75  n aiCur[]/aiColu
34a0: 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20 6d 65 61  mn[] so that mea
34b0: 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66  ns we can look f
34c0: 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f 20  or X plus up to 
34d0: 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65 71 75 69  10.** other equi
34e0: 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 20 20  valent values.  
34f0: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
3500: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
3510: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 0a   <expr> if X=A1.
3520: 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64  ** and A1=A2 and
3530: 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e 2e 20 61   A2=A3 and ... a
3540: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
3550: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
3560: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
3570: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
3580: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3590: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
35a0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
35b0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
35c0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
35d0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
35e0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
35f0: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
3600: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
3610: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
3620: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
3630: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
3640: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
3650: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
3660: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
3670: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
3680: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
3690: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
36a0: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
36b0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
36c0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
36d0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
36e0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
36f0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
3700: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
3710: 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d  IV..*/.WhereTerm
3720: 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 46 69   *sqlite3WhereFi
3730: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
3740: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3750: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3760: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
3770: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
3780: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3790: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
37a0: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
37b0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
37c0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
37d0: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
37e0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
37f0: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
3800: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
3810: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
3820: 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u32 op,         
3830: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3840: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
3850: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
3860: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
3870: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
3880: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
3890: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
38a0: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
38b0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
38c0: 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a  m *pResult = 0;.
38d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a    WhereTerm *p;.
38e0: 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
38f0: 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53 63  ;..  p = whereSc
3900: 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 57  anInit(&scan, pW
3910: 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e  C, iCur, iColumn
3920: 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20 6f  , op, pIdx);.  o
3930: 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  p &= WO_EQ|WO_IS
3940: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
3950: 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
3960: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
3970: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
3980: 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67  if( p->prereqRig
3990: 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70  ht==0 && (p->eOp
39a0: 65 72 61 74 6f 72 26 6f 70 29 21 3d 30 20 29 7b  erator&op)!=0 ){
39b0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
39c0: 65 28 20 70 2d 3e 65 4f 70 65 72 61 74 6f 72 20  e( p->eOperator 
39d0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
39e0: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
39f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
3a00: 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73  Result==0 ) pRes
3a10: 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ult = p;.    }. 
3a20: 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e     p = whereScan
3a30: 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d  Next(&scan);.  }
3a40: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c  .  return pResul
3a50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
3a60: 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
3a70: 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 6e 20  es pList for an 
3a80: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
3a90: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
3aa0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
3ab0: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
3ac0: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
3ad0: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
3ae0: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
3af0: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
3b00: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
3b10: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
3b20: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
3b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
3b40: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
3b50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
3b80: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3b90: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
3ba0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
3bb0: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
3bc0: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
3bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3be0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
3bf0: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
3c00: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
3c10: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
3c20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3c30: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
3c40: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
3c50: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
3c80: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
3c90: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
3ca0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3cb0: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
3cc0: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
3cd0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
3ce0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
3cf0: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
3d00: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
3d10: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
3d20: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
3d30: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
3d40: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
3d50: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
3d60: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
3d70: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
3d80: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
3d90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
3da0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
3db0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
3dc0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
3dd0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
3de0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
3df0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
3e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3e10: 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn i;.      }.  
3e20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
3e30: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n -1;.}../*.** R
3e40: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
3e50: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
3e60: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 69   of index pIdx i
3e70: 73 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74  s NOT NULL.*/.st
3e80: 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f  atic int indexCo
3e90: 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65  lumnNotNull(Inde
3ea0: 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f  x *pIdx, int iCo
3eb0: 6c 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  l){.  int j;.  a
3ec0: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
3ed0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ;.  assert( iCol
3ee0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78  >=0 && iCol<pIdx
3ef0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a  ->nColumn );.  j
3f00: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
3f10: 6e 5b 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a  n[iCol];.  if( j
3f20: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >=0 ){.    retur
3f30: 6e 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  n pIdx->pTable->
3f40: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b  aCol[j].notNull;
3f50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d  .  }else if( j==
3f60: 28 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (-1) ){.    retu
3f70: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 1;.  }else{. 
3f80: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d     assert( j==(-
3f90: 32 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  2) );.    return
3fa0: 20 30 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61   0;  /* Assume a
3fb0: 6e 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73  n indexed expres
3fc0: 73 69 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20  sion can always 
3fd0: 79 69 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a  yield a NULL */.
3fe0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
3ff0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
4000: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
4010: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
4020: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
4030: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
4040: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
4050: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
4060: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e   redundant if an
4070: 79 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20  y subset of the 
4080: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a  columns in the.*
4090: 2a 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20  * DISTINCT list 
40a0: 61 72 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79  are collectively
40b0: 20 75 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69   unique and indi
40c0: 76 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c  vidually non-nul
40d0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
40e0: 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
40f0: 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  dant(.  Parse *p
4100: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4110: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
4120: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
4130: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
4140: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
4150: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4160: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4170: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
4180: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
4190: 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
41a0: 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct       /* The 
41b0: 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20  result set that 
41c0: 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54  needs to be DIST
41d0: 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  INCT */.){.  Tab
41e0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
41f0: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
4200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4210: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
4220: 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49  t iBase;..  /* I
4230: 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
4240: 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f  than one table o
4250: 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20  r sub-select in 
4260: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
4270: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65  of.  ** this que
4280: 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ry, then it will
4290: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
42a0: 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
42b0: 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a  e DISTINCT .  **
42c0: 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e   clause is redun
42d0: 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  dant. */.  if( p
42e0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31  TabList->nSrc!=1
42f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4300: 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Base = pTabList-
4310: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
4320: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
4330: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
4340: 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
4350: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
4360: 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e  an IPK column on
4370: 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68   table iBase, th
4380: 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20  en return .  ** 
4390: 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20  true. Note: The 
43a0: 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73  (p->iTable==iBas
43b0: 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  e) part of this 
43c0: 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73  test may be fals
43d0: 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  e if the.  ** cu
43e0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20  rrent SELECT is 
43f0: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
4400: 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
4410: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
4420: 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
4430: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
4440: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
4450: 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74  ollate(pDistinct
4460: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
4470: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
4480: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
4490: 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70  able==iBase && p
44a0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
44b0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
44c0: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
44d0: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  ll indices on th
44e0: 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e  e table, checkin
44f0: 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66  g each to see if
4500: 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74   it makes.  ** t
4510: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
4520: 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e  ifier redundant.
4530: 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a   It does so if:.
4540: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
4550: 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65  he index is itse
4560: 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20  lf UNIQUE, and. 
4570: 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c   **.  **   2. Al
4580: 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l of the columns
4590: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
45a0: 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66  e either part of
45b0: 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20   the pDistinct. 
45c0: 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f   **      list, o
45d0: 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45  r else the WHERE
45e0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
45f0: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
4600: 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a  orm "col=X",.  *
4610: 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69  *      where X i
4620: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  s a constant val
4630: 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  ue. The collatio
4640: 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  n sequences of t
4650: 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d  he.  **      com
4660: 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65  parison and sele
4670: 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69  ct-list expressi
4680: 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74  ons must match t
4690: 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65  hose of the inde
46a0: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33  x..  **.  **   3
46b0: 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69  . All of those i
46c0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  ndex columns for
46d0: 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
46e0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
46f0: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  .  **      conta
4700: 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72  in a "col=X" ter
4710: 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f  m are subject to
4720: 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
4730: 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
4740: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
4750: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
4760: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
4770: 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65     if( !IsUnique
4780: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
4790: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
47a0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
47b0: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
47c0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
47d0: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
47e0: 43 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42  C, iBase, i, ~(B
47f0: 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
4800: 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
4810: 20 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43    if( findIndexC
4820: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
4830: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
4840: 78 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b  x, i)<0 ) break;
4850: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64  .        if( ind
4860: 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
4870: 70 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72  pIdx, i)==0 ) br
4880: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4890: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49   }.    if( i==pI
48a0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  dx->nKeyCol ){. 
48b0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
48c0: 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  ex implies that 
48d0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
48e0: 6c 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64  lifier is redund
48f0: 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ant. */.      re
4900: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
4910: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
4920: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  .../*.** Estimat
4930: 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20  e the logarithm 
4940: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
4950: 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f  ue to base 2..*/
4960: 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65  .static LogEst e
4970: 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b  stLog(LogEst N){
4980: 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20  .  return N<=10 
4990: 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67  ? 0 : sqlite3Log
49a0: 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a  Est(N) - 33;.}..
49b0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50  /*.** Convert OP
49c0: 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20  _Column opcodes 
49d0: 74 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72  to OP_Copy in pr
49e0: 65 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74  eviously generat
49f0: 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed code..**.** T
4a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
4a10: 20 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20   over generated 
4a20: 56 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72  VDBE code and tr
4a30: 61 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75  anslates OP_Colu
4a40: 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e  mn.** opcodes in
4a50: 74 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20  to OP_Copy when 
4a60: 74 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69  the table is bei
4a70: 6e 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20  ng accessed via 
4a80: 63 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69  co-routine .** i
4a90: 6e 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61  nstead of via ta
4aa0: 62 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a  ble lookup..**.*
4ab0: 2a 20 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f  * If the bIncrRo
4ac0: 77 69 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  wid parameter is
4ad0: 20 30 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f   0, then any OP_
4ae0: 52 6f 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f  Rowid instructio
4af0: 6e 73 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20  ns on.** cursor 
4b00: 69 54 61 62 43 75 72 20 61 72 65 20 74 72 61 6e  iTabCur are tran
4b10: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f  sformed into OP_
4b20: 4e 75 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e  Null. Or, if bIn
4b30: 63 72 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  crRowid is non-z
4b40: 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63  ero,.** then eac
4b50: 68 20 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72  h OP_Rowid is tr
4b60: 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61  ansformed into a
4b70: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
4b80: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a   increment the.*
4b90: 2a 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  * value stored i
4ba0: 6e 20 69 74 73 20 6f 75 74 70 75 74 20 72 65 67  n its output reg
4bb0: 69 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ister..*/.static
4bc0: 20 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43   void translateC
4bd0: 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 50  olumnToCopy(.  P
4be0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4bf0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
4c00: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
4c10: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4c20: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4c30: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4c40: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4c50: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4c60: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4c70: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4c80: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4c90: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4ca0: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4cb0: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
4cc0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
4cd0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
4ce0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
4cf0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
4d00: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
4d10: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4d20: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
4d30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4d40: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71  VdbeOp *pOp = sq
4d50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
4d60: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74  , iStart);.  int
4d70: 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
4d80: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4d90: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
4da0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4db0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  d ) return;.  fo
4dc0: 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b  r(; iStart<iEnd;
4dd0: 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b   iStart++, pOp++
4de0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ){.    if( pOp->
4df0: 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f  p1!=iTabCur ) co
4e00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
4e10: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4e20: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
4e30: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
4e40: 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70  _Copy;.      pOp
4e50: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b  ->p1 = pOp->p2 +
4e60: 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20   iRegister;.    
4e70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d    pOp->p2 = pOp-
4e80: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  >p3;.      pOp->
4e90: 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  p3 = 0;.    }els
4ea0: 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
4eb0: 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
4ec0: 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f       if( bIncrRo
4ed0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
4ee0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
4ef0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
4f00: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
4f10: 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20  f the OP_Rowid. 
4f20: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  */.        pOp->
4f30: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49  opcode = OP_AddI
4f40: 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  mm;.        pOp-
4f50: 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  >p1 = pOp->p2;. 
4f60: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
4f70: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
4f80: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4f90: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
4fa0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
4fb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 0;.        pOp
4fc0: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->p3 = 0;.      
4fd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
4fe0: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
4ff0: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
5000: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
5010: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
5020: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
5030: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
5040: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
5050: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
5060: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
5070: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
5080: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
5090: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
50a0: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
50b0: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
50c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
50d0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
50e0: 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
50f0: 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74  CE_ENABLED).stat
5100: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
5110: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
5120: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
5130: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5140: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
5150: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5160: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5170: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
5180: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5190: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
51a0: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
51b0: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
51c0: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
51d0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
51e0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
51f0: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
5200: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
5210: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
5220: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
5230: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
5240: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
5250: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
5260: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
5270: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
5280: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
5290: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
52a0: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
52b0: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
52c0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
52d0: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
52e0: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
52f0: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
5300: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
5310: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
5320: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
5330: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
5340: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5350: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
5360: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
5370: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5380: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
5390: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
53a0: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
53b0: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
53c0: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
53d0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
53e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
53f0: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
5400: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
5410: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
5420: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
5430: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
5440: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
5450: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
5460: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5470: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
5480: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
5490: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
54a0: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
54b0: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
54c0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
54d0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
54e0: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
54f0: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
5500: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
5510: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5520: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
5530: 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70  dRows=%lld\n", p
5540: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
5550: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
5560: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
5570: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
5580: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
5590: 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
55a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
55b0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
55c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
55d0: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
55e0: 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
55f0: 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
5600: 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
5610: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
5620: 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
5630: 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
5640: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
5650: 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
5660: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
5670: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
5680: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5690: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
56a0: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
56b0: 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
56c0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
56d0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
56e0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
56f0: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
5700: 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
5710: 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
5720: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
5730: 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
5740: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
5750: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
5760: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
5770: 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
5780: 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
5790: 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
57a0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
57b0: 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20  EQ|WO_IS))==0 ) 
57c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
57d0: 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
57e0: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 20 0a 20  pe & JT_LEFT) . 
57f0: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
5800: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
5810: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5820: 0a 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65  .   && (pTerm->e
5830: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
5840: 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  ).  ){.    /* Ca
5850: 6e 6e 6f 74 20 75 73 65 20 61 6e 20 49 53 20 74  nnot use an IS t
5860: 65 72 6d 20 66 72 6f 6d 20 74 68 65 20 57 48 45  erm from the WHE
5870: 52 45 20 63 6c 61 75 73 65 20 61 73 20 61 6e 20  RE clause as an 
5880: 69 6e 64 65 78 20 64 72 69 76 65 72 20 66 6f 72  index driver for
5890: 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20  .    ** the RHS 
58a0: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
58b0: 53 75 63 68 20 61 20 74 65 72 6d 20 63 61 6e 20  Such a term can 
58c0: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
58d0: 69 74 20 69 73 20 66 72 6f 6d 0a 20 20 20 20 2a  it is from.    *
58e0: 2a 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  * the ON clause.
58f0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
5900: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 54  0;.  }.  if( (pT
5910: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
5920: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
5930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
5940: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
5950: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
5960: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
5970: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
5980: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
5990: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
59a0: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
59b0: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
59c0: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
59d0: 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63  eturn 0;.  testc
59e0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
59f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
5a00: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
5a10: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
5a20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
5a30: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
5a40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5a50: 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
5a60: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  Index object for
5a70: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
5a80: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65  dex.** and to se
5a90: 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65  t up the WhereLe
5aa0: 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65  vel object pLeve
5ab0: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  l so that the co
5ac0: 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
5ad0: 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65  makes use of the
5ae0: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
5af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5b00: 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
5b10: 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ticIndex(.  Pars
5b20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5b40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
5b50: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
5b60: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
5b70: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
5b80: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
5b90: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
5ba0: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
5bb0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
5bc0: 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64  get the next ind
5bd0: 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
5be0: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
5bf0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
5c00: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
5c10: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
5c20: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
5c30: 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f  Level          /
5c40: 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65  * Write new inde
5c50: 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  x here */.){.  i
5c60: 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  nt nKeyCol;     
5c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5c80: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
5c90: 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  in the construct
5ca0: 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  ed index */.  Wh
5cb0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
5cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
5cd0: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
5ce0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
5cf0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
5d00: 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  WCEnd;          
5d10: 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
5d20: 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  [] */.  Index *p
5d30: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
5d40: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65      /* Object de
5d50: 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61  scribing the tra
5d60: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a  nsient index */.
5d70: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d90: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
5da0: 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
5db0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
5dc0: 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20  addrInit;       
5dd0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
5de0: 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  ss of the initia
5df0: 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20  lization bypass 
5e00: 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20  jump */.  Table 
5e10: 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
5e20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
5e30: 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
5e40: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
5e50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
5e60: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
5e70: 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20  index fill loop 
5e80: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
5e90: 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
5ea0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
5eb0: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65  ding an index re
5ec0: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
5ef0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5f00: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
5f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
5f20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5f30: 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20  t mxBitCol;     
5f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
5f50: 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  imum column in p
5f60: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a  Src->colUsed */.
5f70: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
5f80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5f90: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
5fa0: 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
5fb0: 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  mn */.  WhereLoo
5fc0: 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
5fd0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20      /* The Loop 
5fe0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
5ff0: 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20   *zNotUsed;     
6000: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
6010: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e   space on the en
6020: 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42  d of pIdx */.  B
6030: 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20  itmask idxCols; 
6040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6050: 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tmap of columns 
6060: 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e  used for indexin
6070: 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  g */.  Bitmask e
6080: 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20  xtraCols;       
6090: 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
60a0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
60b0: 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57  ns */.  u8 sentW
60c0: 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20  arning = 0;     
60d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
60e0: 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65   warnning has be
60f0: 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45  en issued */.  E
6100: 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20  xpr *pPartial = 
6110: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  0;         /* Pa
6120: 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72  rtial Index Expr
6130: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
6140: 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20  iContinue = 0;  
6150: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
6160: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63  here to skip exc
6170: 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20  luded rows */.  
6180: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
6190: 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
61a0: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
61b0: 65 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65  erm being indexe
61c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  d */.  int addrC
61d0: 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20  ounter = 0;     
61e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68     /* Address wh
61f0: 65 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e  ere integer coun
6200: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
6210: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  ed */.  int regB
6220: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
6230: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
6240: 72 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20  registers where 
6250: 72 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62  record is assemb
6260: 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  led */..  /* Gen
6270: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
6280: 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
6290: 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
62a0: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
62b0: 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
62c0: 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
62d0: 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
62e0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
62f0: 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
6300: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
6310: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
6320: 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
6330: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6340: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
6350: 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43  rage(v);..  /* C
6360: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
6370: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
6380: 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
6390: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
63a0: 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
63b0: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
63c0: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
63d0: 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  nKeyCol = 0;.  p
63e0: 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
63f0: 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
6400: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
6410: 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
6420: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
6430: 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
6440: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
6450: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
6460: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
6470: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
6480: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
6490: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
64a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
64b0: 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20  FromJoin)    /* 
64c0: 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f  prereq always no
64d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n-zero */.      
64e0: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69     || pExpr->iRi
64f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53  ghtJoinTable!=pS
6500: 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a  rc->iCursor   /*
6510: 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68 74     for the right
6520: 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20  -hand   */.     
6530: 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72      || pLoop->pr
6540: 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20  ereq!=0 );      
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6560: 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  *   table of a L
6570: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20  EFT JOIN */.    
6580: 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  if( pLoop->prere
6590: 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  q==0.     && (pT
65a0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
65b0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a  ERM_VIRTUAL)==0.
65c0: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
65d0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
65e0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
65f0: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
6600: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
6610: 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75  pExpr, pSrc->iCu
6620: 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70  rsor) ){.      p
6630: 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65  Partial = sqlite
6640: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
6650: 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20  >db, pPartial,. 
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6680: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
6690: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
66a0: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
66b0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
66c0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
66d0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
66e0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
66f0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
6700: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
6710: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6720: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6730: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
6740: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
6750: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
6760: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
6770: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
6780: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73   );.      if( !s
6790: 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20  entWarning ){.  
67a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
67b0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
67c0: 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20  _AUTOINDEX,.    
67d0: 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74          "automat
67e0: 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25  ic index on %s(%
67f0: 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  s)", pTable->zNa
6800: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
6810: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
6820: 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l].zName);.     
6830: 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d     sentWarning =
6840: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6850: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
6860: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
6870: 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
6880: 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
6890: 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65  ->db, pLoop, nKe
68a0: 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20  yCol+1) ){.     
68b0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75       goto end_au
68c0: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
68d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
68e0: 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
68f0: 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54  [nKeyCol++] = pT
6900: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78  erm;.        idx
6910: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
6920: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6930: 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43  .  assert( nKeyC
6940: 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d  ol>0 );.  pLoop-
6950: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70  >u.btree.nEq = p
6960: 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e  Loop->nLTerm = n
6970: 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d  KeyCol;.  pLoop-
6980: 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
6990: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
69a0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
69b0: 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20  ERE_INDEXED.    
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   | WHERE_AUTO_IN
69e0: 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  DEX;..  /* Count
69f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
6a00: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
6a10: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61  s needed to crea
6a20: 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69  te a.  ** coveri
6a30: 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f  ng index.  A "co
6a40: 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73  vering index" is
6a50: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
6a60: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a  ontains all.  **
6a70: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
6a80: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
6a90: 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63  query.  With a c
6aa0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
6ab0: 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
6ac0: 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65   table never nee
6ad0: 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  ds to be accesse
6ae0: 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e  d.  Automatic in
6af0: 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  dices must.  ** 
6b00: 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  be a covering in
6b10: 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20  dex because the 
6b20: 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
6b30: 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65  e updated if the
6b40: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
6b50: 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64  able changes and
6b60: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
6b70: 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68  able cannot both
6b80: 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66   be used.  ** if
6b90: 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20   they go out of 
6ba0: 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74  sync..  */.  ext
6bb0: 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63  raCols = pSrc->c
6bc0: 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f  olUsed & (~idxCo
6bd0: 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53  ls | MASKBIT(BMS
6be0: 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  -1));.  mxBitCol
6bf0: 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61   = MIN(BMS-1,pTa
6c00: 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65  ble->nCol);.  te
6c10: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
6c20: 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
6c30: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
6c40: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
6c50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
6c60: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
6c70: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
6c80: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20   & MASKBIT(i) ) 
6c90: 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  nKeyCol++;.  }. 
6ca0: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
6cb0: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
6cc0: 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43  -1) ){.    nKeyC
6cd0: 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  ol += pTable->nC
6ce0: 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
6cf0: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
6d00: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
6d10: 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ct to describe t
6d20: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  his index */.  p
6d30: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  Idx = sqlite3All
6d40: 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
6d50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
6d60: 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74  yCol+1, 0, &zNot
6d70: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64  Used);.  if( pId
6d80: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f  x==0 ) goto end_
6d90: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
6da0: 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  e;.  pLoop->u.bt
6db0: 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
6dc0: 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  x;.  pIdx->zName
6dd0: 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
6de0: 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
6df0: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
6e00: 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
6e10: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
6e20: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
6e30: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
6e40: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
6e50: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
6e60: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
6e70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
6e80: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
6e90: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
6ea0: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
6eb0: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
6ec0: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
6ed0: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
6ee0: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
6ef0: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
6f00: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
6f10: 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
6f20: 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
6f30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6f40: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
6f50: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
6f60: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
6f70: 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
6f80: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
6f90: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
6fa0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
6fb0: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
6fc0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
6fd0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
6fe0: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
6ff0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
7000: 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20  Coll[n] = pColl 
7010: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
7020: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
7030: 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  Y;.        n++;.
7040: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7050: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32  }.  assert( (u32
7060: 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  )n==pLoop->u.btr
7070: 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  ee.nEq );..  /* 
7080: 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  Add additional c
7090: 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
70a0: 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61   make the automa
70b0: 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20  tic index into. 
70c0: 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69   ** a covering i
70d0: 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ndex */.  for(i=
70e0: 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
70f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
7100: 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54  raCols & MASKBIT
7110: 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  (i) ){.      pId
7120: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
7130: 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
7140: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69  azColl[n] = sqli
7150: 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
7160: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
7170: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
7180: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
7190: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
71a0: 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
71b0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
71c0: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
71d0: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
71e0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
71f0: 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[n] = sqlite3St
7200: 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e  rBINARY;.      n
7210: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
7220: 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43  assert( n==nKeyC
7230: 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69  ol );.  pIdx->ai
7240: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52  Column[n] = XN_R
7250: 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  OWID;.  pIdx->az
7260: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
7270: 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f  3StrBINARY;..  /
7280: 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
7290: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
72a0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
72b0: 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
72c0: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
72d0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
72e0: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
72f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
7300: 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
7310: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
7320: 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
7330: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
7340: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
7350: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
7360: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
7370: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
7380: 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
7390: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
73a0: 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
73b0: 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43   pTabItem = &pWC
73c0: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ->pWInfo->pTabLi
73d0: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
73e0: 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62  rom];.  if( pTab
73f0: 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
7400: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
7410: 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
7420: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
7430: 0a 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72  .    addrCounter
7440: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7450: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7460: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  er, 0, 0);.    s
7470: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7480: 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
7490: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
74a0: 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  0, pTabItem->add
74b0: 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61  rFillSub);.    a
74c0: 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65  ddrTop =  sqlite
74d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
74e0: 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
74f0: 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  d);.    VdbeCove
7500: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
7510: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
7520: 78 74 20 72 6f 77 20 6f 66 20 25 73 22 2c 20 70  xt row of %s", p
7530: 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
7540: 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Name));.  }else{
7550: 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73  .    addrTop = s
7560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
7570: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
7580: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
7590: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
75a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
75b0: 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e  tial ){.    iCon
75c0: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
75d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
75e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
75f0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
7600: 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69  pPartial, iConti
7610: 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  nue, SQLITE_JUMP
7620: 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f  IFNULL);.    pLo
7630: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
7640: 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58 3b  HERE_PARTIALIDX;
7650: 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f 72 64  .  }.  regRecord
7660: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7670: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7680: 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
7690: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
76a0: 79 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2c  y(.      pParse,
76b0: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
76c0: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
76d0: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a 20 20  d, 0, 0, 0, 0.  
76e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
76f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
7700: 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e  Insert, pLevel->
7710: 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f  iIdxCur, regReco
7720: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
7730: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7740: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
7750: 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72 74  LT);.  if( pPart
7760: 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62  ial ) sqlite3Vdb
7770: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
7780: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69   iContinue);.  i
7790: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
77a0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
77b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
77c0: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 43  hangeP2(v, addrC
77d0: 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73 65 2b  ounter, regBase+
77e0: 6e 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  n);.    testcase
77f0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
7800: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
7810: 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d    translateColum
7820: 6e 54 6f 43 6f 70 79 28 70 50 61 72 73 65 2c 20  nToCopy(pParse, 
7830: 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d  addrTop, pLevel-
7840: 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20  >iTabCur,.      
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65      pTabItem->re
7870: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
7880: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
7890: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
78a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
78b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
78c0: 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d  OP_Next, pLevel-
78d0: 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f  >iTabCur, addrTo
78e0: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
78f0: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
7900: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7910: 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  (v, SQLITE_STMTS
7920: 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29  TATUS_AUTOINDEX)
7930: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
7940: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
7950: 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  op);.  sqlite3Re
7960: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
7970: 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
7980: 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  .  .  /* Jump he
7990: 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67  re when skipping
79a0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
79b0: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
79c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
79d0: 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f  addrInit);..end_
79e0: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
79f0: 65 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  e:.  sqlite3Expr
7a00: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
7a10: 62 2c 20 70 50 61 72 74 69 61 6c 29 3b 0a 7d 0a  b, pPartial);.}.
7a20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7a30: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
7a40: 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65  INDEX */..#ifnde
7a50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
7a60: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
7a70: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
7a80: 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65  pulate an sqlite
7a90: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
7aa0: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68  ucture. It is th
7ab0: 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
7ac0: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
7ad0: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
7ae0: 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72   release the str
7af0: 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73  ucture.** by pas
7b00: 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72  sing the pointer
7b10: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
7b20: 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71  s function to sq
7b30: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
7b40: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
7b50: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f  index_info *allo
7b60: 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20  cateIndexInfo(. 
7b70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7ba0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
7bb0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bd0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
7be0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
7bf0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  */.  Bitmask mUn
7c00: 75 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  usable,         
7c10: 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74       /* Ignore t
7c20: 65 72 6d 73 20 77 69 74 68 20 74 68 65 73 65 20  erms with these 
7c30: 70 72 65 72 65 71 73 20 2a 2f 0a 20 20 73 74 72  prereqs */.  str
7c40: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
7c50: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
7c60: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
7c70: 74 65 72 6d 20 74 68 61 74 20 69 73 20 74 68 65  term that is the
7c80: 20 76 74 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c   vtab */.  ExprL
7c90: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
7ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7cb0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7cc0: 65 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6d 4e 6f  e */.  u16 *pmNo
7cd0: 4f 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  Omit            
7ce0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
7cf0: 66 20 74 65 72 6d 73 20 6e 6f 74 20 74 6f 20 6f  f terms not to o
7d00: 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
7d10: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
7d20: 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
7d30: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7d40: 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
7d50: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
7d60: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
7d70: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
7d80: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7d90: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
7da0: 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
7db0: 73 74 72 75 63 74 20 48 69 64 64 65 6e 49 6e 64  struct HiddenInd
7dc0: 65 78 49 6e 66 6f 20 2a 70 48 69 64 64 65 6e 3b  exInfo *pHidden;
7dd0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
7de0: 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  erm;.  int nOrde
7df0: 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  rBy;.  sqlite3_i
7e00: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
7e10: 6e 66 6f 3b 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d  nfo;.  u16 mNoOm
7e20: 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  it = 0;..  /* Co
7e30: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
7e40: 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45  f possible WHERE
7e50: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
7e60: 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20  nts referring.  
7e70: 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75  ** to this virtu
7e80: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  al table */.  fo
7e90: 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
7ea0: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
7eb0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
7ec0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
7ed0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
7ee0: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
7ef0: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
7f00: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
7f10: 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75  ereqRight & mUnu
7f20: 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65  sable ) continue
7f30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
7f40: 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
7f50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
7f60: 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
7f70: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7f80: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7f90: 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
7fa0: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7fb0: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
7fc0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7fd0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7fe0: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
7ff0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
8000: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8010: 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  O_ALL );.    if(
8020: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
8030: 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55 49 56 29  or & ~(WO_EQUIV)
8040: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
8050: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
8060: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
8070: 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
8080: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
8090: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
80a0: 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 6e 54  >=(-1) );.    nT
80b0: 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
80c0: 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
80d0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
80e0: 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
80f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
8100: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
8110: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
8120: 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
8130: 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
8140: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
8150: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
8160: 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
8170: 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
8180: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
8190: 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
81a0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
81b0: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
81c0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
81d0: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
81e0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
81f0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
8200: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
8210: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
8220: 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
8230: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
8240: 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
8250: 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
8260: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
8270: 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
8280: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
8290: 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
82a0: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
82b0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
82c0: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
82d0: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
8300: 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
8310: 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
8320: 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
8340: 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
8350: 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 2b 20  rBy)*nOrderBy + 
8360: 73 69 7a 65 6f 66 28 2a 70 48 69 64 64 65 6e 29  sizeof(*pHidden)
8370: 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
8380: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
8390: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
83a0: 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
83b0: 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ory");.    retur
83c0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
83d0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
83e0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
83f0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
8400: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
8410: 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
8420: 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
8430: 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
8440: 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
8450: 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
8460: 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
8470: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
8480: 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
8490: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
84a0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
84b0: 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
84c0: 20 70 48 69 64 64 65 6e 20 3d 20 28 73 74 72 75   pHidden = (stru
84d0: 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e  ct HiddenIndexIn
84e0: 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d  fo*)&pIdxInfo[1]
84f0: 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  ;.  pIdxCons = (
8500: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
8510: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
8520: 29 26 70 48 69 64 64 65 6e 5b 31 5d 3b 0a 20 20  )&pHidden[1];.  
8530: 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
8540: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
8550: 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
8560: 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
8570: 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
8580: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
8590: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
85a0: 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
85b0: 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e  OrderBy];.  *(in
85c0: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
85d0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
85e0: 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  m;.  *(int*)&pId
85f0: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
8600: 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  = nOrderBy;.  *(
8610: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
8620: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
8630: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
8640: 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43  nstraint = pIdxC
8650: 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  ons;.  *(struct 
8660: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
8670: 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66  derby**)&pIdxInf
8680: 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49  o->aOrderBy = pI
8690: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73  dxOrderBy;.  *(s
86a0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
86b0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
86c0: 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
86d0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
86e0: 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
8730: 0a 20 20 70 48 69 64 64 65 6e 2d 3e 70 57 43 20  .  pHidden->pWC 
8740: 3d 20 70 57 43 3b 0a 20 20 70 48 69 64 64 65 6e  = pWC;.  pHidden
8750: 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
8760: 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  e;.  for(i=j=0, 
8770: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
8780: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
8790: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75   pTerm++){.    u
87a0: 31 36 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  16 op;.    if( p
87b0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
87c0: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
87d0: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
87e0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
87f0: 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73  reqRight & mUnus
8800: 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  able ) continue;
8810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50  .    assert( IsP
8820: 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d  owerOfTwo(pTerm-
8830: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f  >eOperator & ~WO
8840: 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74  _EQUIV) );.    t
8850: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
8860: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
8870: 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  N );.    testcas
8880: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
8890: 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
88a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
88b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
88c0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
88d0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
88e0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
88f0: 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  _ALL );.    if( 
8900: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
8910: 72 20 26 20 7e 28 57 4f 5f 45 51 55 49 56 29 29  r & ~(WO_EQUIV))
8920: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
8930: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
8940: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
8950: 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
8960: 20 20 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66      if( (pSrc->f
8970: 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
8980: 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26  LEFT)!=0.     &&
8990: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
89a0: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
89b0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
89c0: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70    && (pTerm->eOp
89d0: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 7c  erator & (WO_IS|
89e0: 57 4f 5f 49 53 4e 55 4c 4c 29 29 0a 20 20 20 20  WO_ISNULL)).    
89f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 22  ){.      /* An "
8a00: 49 53 22 20 74 65 72 6d 20 69 6e 20 74 68 65 20  IS" term in the 
8a10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65  WHERE clause whe
8a20: 72 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  re the virtual t
8a30: 61 62 6c 65 20 69 73 20 74 68 65 20 72 68 73 0a  able is the rhs.
8a40: 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 4c 45        ** of a LE
8a50: 46 54 20 4a 4f 49 4e 2e 20 44 6f 20 6e 6f 74 20  FT JOIN. Do not 
8a60: 70 61 73 73 20 74 68 69 73 20 74 65 72 6d 20 74  pass this term t
8a70: 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  o the virtual ta
8a80: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  ble.      ** imp
8a90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 73 20  lementation, as 
8aa0: 74 68 69 73 20 63 61 6e 20 6c 65 61 64 20 74 6f  this can lead to
8ab0: 20 69 6e 63 6f 72 72 65 63 74 20 72 65 73 75 6c   incorrect resul
8ac0: 74 73 20 66 72 6f 6d 20 53 51 4c 20 73 75 63 68  ts from SQL such
8ad0: 0a 20 20 20 20 20 20 2a 2a 20 61 73 3a 0a 20 20  .      ** as:.  
8ae0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
8af0: 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 76 74 61    "LEFT JOIN vta
8b00: 62 20 57 48 45 52 45 20 76 74 61 62 2e 63 6f 6c  b WHERE vtab.col
8b10: 20 49 53 20 4e 55 4c 4c 22 20 20 2a 2f 0a 20 20   IS NULL"  */.  
8b20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
8b30: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8b40: 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
8b50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
8b60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8b70: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
8b80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
8b90: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
8ba0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e  m->u.leftColumn>
8bb0: 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64  =(-1) );.    pId
8bc0: 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e  xCons[j].iColumn
8bd0: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
8be0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
8bf0: 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  Cons[j].iTermOff
8c00: 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20  set = i;.    op 
8c10: 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  = pTerm->eOperat
8c20: 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
8c30: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
8c40: 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
8c50: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 41 55 58 20   if( op==WO_AUX 
8c60: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  ){.      pIdxCon
8c70: 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d  s[j].op = pTerm-
8c80: 3e 65 4d 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d  >eMatchOp;.    }
8c90: 65 6c 73 65 20 69 66 28 20 6f 70 20 26 20 28 57  else if( op & (W
8ca0: 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 20  O_ISNULL|WO_IS) 
8cb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  ){.      if( op=
8cc0: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =WO_ISNULL ){.  
8cd0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
8ce0: 5d 2e 6f 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ].op = SQLITE_IN
8cf0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49  DEX_CONSTRAINT_I
8d00: 53 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  SNULL;.      }el
8d10: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78  se{.        pIdx
8d20: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c  Cons[j].op = SQL
8d30: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8d40: 41 49 4e 54 5f 49 53 3b 0a 20 20 20 20 20 20 7d  AINT_IS;.      }
8d50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8d60: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
8d70: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 20   = (u8)op;.     
8d80: 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
8d90: 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
8da0: 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
8db0: 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
8dc0: 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
8dd0: 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
8de0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8df0: 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
8e00: 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
8e10: 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
8e20: 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
8e30: 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
8e40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
8e50: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
8e60: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
8e70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8e80: 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
8e90: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8ea0: 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LT );.      asse
8eb0: 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
8ec0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8ed0: 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  NT_LE );.      a
8ee0: 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
8ef0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8f00: 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
8f10: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
8f20: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
8f30: 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
8f40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
8f50: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
8f60: 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54  O_IN|WO_EQ|WO_LT
8f70: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
8f80: 47 45 7c 57 4f 5f 41 55 58 29 20 29 3b 0a 0a 20  GE|WO_AUX) );.. 
8f90: 20 20 20 20 20 69 66 28 20 6f 70 20 26 20 28 57       if( op & (W
8fa0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
8fb0: 7c 57 4f 5f 47 45 29 0a 20 20 20 20 20 20 20 26  |WO_GE).       &
8fc0: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  & sqlite3ExprIsV
8fd0: 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e 70 45 78  ector(pTerm->pEx
8fe0: 70 72 2d 3e 70 52 69 67 68 74 29 20 0a 20 20 20  pr->pRight) .   
8ff0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66     ){.        if
9000: 28 20 69 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69 74  ( i<16 ) mNoOmit
9010: 20 7c 3d 20 28 31 20 3c 3c 20 69 29 3b 0a 20 20   |= (1 << i);.  
9020: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f        if( op==WO
9030: 5f 4c 54 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a  _LT ) pIdxCons[j
9040: 5d 2e 6f 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20  ].op = WO_LE;.  
9050: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f        if( op==WO
9060: 5f 47 54 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a  _GT ) pIdxCons[j
9070: 5d 2e 6f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20  ].op = WO_GE;.  
9080: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9090: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
90a0: 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
90b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
90c0: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
90d0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
90e0: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
90f0: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
9100: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
9110: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
9120: 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
9130: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
9140: 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f 6d 69 74    }..  *pmNoOmit
9150: 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 72 65   = mNoOmit;.  re
9160: 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d  turn pIdxInfo;.}
9170: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ../*.** The tabl
9180: 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  e object referen
9190: 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ce passed as the
91a0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
91b0: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
91c0: 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73  n.** must repres
91d0: 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  ent a virtual ta
91e0: 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
91f0: 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78  on invokes the x
9200: 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d  BestIndex().** m
9210: 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
9220: 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20  tual table with 
9230: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
9240: 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  x_info object th
9250: 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61  at.** comes in a
9260: 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65  s the 3rd argume
9270: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
9280: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
9290: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70   error occurs, p
92a0: 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74  Parse is populat
92b0: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
92c0: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 6e 0a   message and an.
92d0: 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ** appropriate e
92e0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
92f0: 75 72 6e 65 64 2e 20 20 41 20 72 65 74 75 72 6e  urned.  A return
9300: 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   of SQLITE_CONST
9310: 52 41 49 4e 54 20 66 72 6f 6d 0a 2a 2a 20 78 42  RAINT from.** xB
9320: 65 73 74 49 6e 64 65 78 20 69 73 20 6e 6f 74 20  estIndex is not 
9330: 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
9340: 72 6f 72 2e 20 20 53 51 4c 49 54 45 5f 43 4f 4e  ror.  SQLITE_CON
9350: 53 54 52 41 49 4e 54 20 69 6e 64 69 63 61 74 65  STRAINT indicate
9360: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 75  s that.** the cu
9370: 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74  rrent configurat
9380: 69 6f 6e 20 6f 66 20 22 75 6e 75 73 61 62 6c 65  ion of "unusable
9390: 22 20 66 6c 61 67 73 20 69 6e 20 73 71 6c 69 74  " flags in sqlit
93a0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 63 61  e3_index_info ca
93b0: 6e 0a 2a 2a 20 6e 6f 74 20 72 65 73 75 6c 74 20  n.** not result 
93c0: 69 6e 20 61 20 76 61 6c 69 64 20 70 6c 61 6e 2e  in a valid plan.
93d0: 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
93e0: 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  r not an error i
93f0: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69  s returned, it i
9400: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
9410: 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
9420: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
9430: 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53  lly free p->idxS
9440: 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46  tr if p->needToF
9450: 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61  reeIdxStr indica
9460: 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73  tes.** that this
9470: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
9480: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62  .static int vtab
9490: 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20  BestIndex(Parse 
94a0: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
94b0: 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pTab, sqlite3_in
94c0: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
94d0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
94e0: 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tab = sqlite3Get
94f0: 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
9500: 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b  b, pTab)->pVtab;
9510: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52  .  int rc;..  TR
9520: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
9530: 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d  );.  rc = pVtab-
9540: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49  >pModule->xBestI
9550: 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a  ndex(pVtab, p);.
9560: 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
9570: 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72  UTS(p);..  if( r
9580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
9590: 72 63 21 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc!=SQLITE_CONST
95a0: 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 69 66 28  RAINT ){.    if(
95b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
95c0: 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M ){.      sqlit
95d0: 65 33 4f 6f 6d 46 61 75 6c 74 28 70 50 61 72 73  e3OomFault(pPars
95e0: 65 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73  e->db);.    }els
95f0: 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45  e if( !pVtab->zE
9600: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
9610: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9620: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c  Parse, "%s", sql
9630: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
9640: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9650: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9660: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
9670: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
9680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
9690: 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
96a0: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74  >zErrMsg);.  pVt
96b0: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
96c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
96d0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
96e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
96f0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
9700: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9710: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
9720: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
9730: 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ate the location
9740: 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
9750: 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b   key among all k
9760: 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64  eys in an.** ind
9770: 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  ex.  Store the r
9780: 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20  esults in aStat 
9790: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
97a0: 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20  *    aStat[0]   
97b0: 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
97c0: 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  f rows less than
97d0: 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61   pRec.**    aSta
97e0: 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[1]      Est. n
97f0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71  umber of rows eq
9800: 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a  ual to pRec.**.*
9810: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
9820: 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65  ex of the sample
9830: 20 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61   that is the sma
9840: 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61  llest sample tha
9850: 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
9860: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9870: 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74   pRec. Note that
9880: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   this index is n
9890: 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69  ot an index.** i
98a0: 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  nto the aSample[
98b0: 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69 73 20  ] array - it is 
98c0: 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20  an index into a 
98d0: 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73  virtual set of s
98e0: 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20  amples.** based 
98f0: 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
9900: 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64  of aSample[] and
9910: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
9920: 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20  ields in record 
9930: 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74  .** pRec. .*/.st
9940: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
9950: 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
9960: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9970: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9980: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9990: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99b0: 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
99c0: 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
99d0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
99e0: 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a   *pRec,       /*
99f0: 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65   Vector of value
9a00: 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  s to consider */
9a10: 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a30: 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
9a40: 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
9a50: 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
9a60: 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
9a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
9a80: 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
9a90: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
9aa0: 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
9ab0: 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
9ac0: 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  e;.  int iCol;  
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71   /* Index of req
9af0: 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61  uired stats in a
9b00: 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20  nEq[] etc. */.  
9b10: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9b30: 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 73 61  ndex of first sa
9b40: 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a  mple >= pRec */.
9b50: 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20    int iSample;  
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b70: 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
9b80: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20   larger than or 
9b90: 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f  equal to pRec */
9ba0: 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b  .  int iMin = 0;
9bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9bc0: 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
9bd0: 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64  e not yet tested
9be0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b   */.  int iTest;
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65    /* Next sample
9c10: 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e   to test */.  in
9c20: 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
9c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
9c40: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
9c50: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
9c60: 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20   int nField;    
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c80: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
9c90: 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52   in pRec */.  tR
9ca0: 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30  owcnt iLower = 0
9cb0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c  ;         /* anL
9cc0: 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20  t[] + anEq[] of 
9cd0: 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70  largest sample p
9ce0: 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66  Rec is > */..#if
9cf0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
9d00: 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  G.  UNUSED_PARAM
9d10: 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a  ETER( pParse );.
9d20: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
9d30: 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73   pRec!=0 );.  as
9d40: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
9d50: 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
9d60: 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e  t( pRec->nField>
9d70: 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c  0 && pRec->nFiel
9d80: 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  d<=pIdx->nSample
9d90: 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  Col );..  /* Do 
9da0: 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
9db0: 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  to find the firs
9dc0: 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72  t sample greater
9dd0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20   than or equal. 
9de0: 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20   ** to pRec. If 
9df0: 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20  pRec contains a 
9e00: 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68  single field, th
9e10: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
9e20: 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20   to search.  ** 
9e30: 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53  is simply the aS
9e40: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49  ample[] array. I
9e50: 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e  f the samples in
9e60: 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61   aSample[] conta
9e70: 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61  in more.  ** tha
9e80: 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c  n one fields, al
9e90: 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69  l fields followi
9ea0: 6e 67 20 74 68 65 20 66 69 72 73 74 20 61 72 65  ng the first are
9eb0: 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20   ignored..  **. 
9ec0: 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74   ** If pRec cont
9ed0: 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77  ains N fields, w
9ee0: 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74  here N is more t
9ef0: 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73  han one, then as
9f00: 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a   well as the.  *
9f10: 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61  * samples in aSa
9f20: 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65  mple[] (truncate
9f30: 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20  d to N fields), 
9f40: 74 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20  the search also 
9f50: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73  has to.  ** cons
9f60: 69 64 65 72 20 70 72 65 66 69 78 65 73 20 6f 66  ider prefixes of
9f70: 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20   those samples. 
9f80: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
9f90: 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  the set of sampl
9fa0: 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70  es.  ** in aSamp
9fb0: 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  le is:.  **.  **
9fc0: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20       aSample[0] 
9fd0: 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  = (a, 5) .  **  
9fe0: 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20     aSample[1] = 
9ff0: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
a000: 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28    aSample[2] = (
a010: 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  b, 5) .  **     
a020: 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c  aSample[3] = (c,
a030: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
a040: 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c  aSample[4] = (c,
a050: 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   105).  **.  ** 
a060: 54 68 65 6e 20 74 68 65 20 73 65 61 72 63 68 20  Then the search 
a070: 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65  space should ide
a080: 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70  ally be the samp
a090: 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68  les above and th
a0a0: 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70  e .  ** unique p
a0b0: 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d  refixes [a], [b]
a0c0: 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69   and [c]. But si
a0d0: 6e 63 65 20 74 68 61 74 20 69 73 20 68 61 72 64  nce that is hard
a0e0: 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20   to organize, . 
a0f0: 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74   ** the code act
a100: 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74  ually searches t
a110: 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20  his set:.  **.  
a120: 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20  **     0: (a) . 
a130: 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35   **     1: (a, 5
a140: 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28  ) .  **     2: (
a150: 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20  a, 10) .  **    
a160: 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a   3: (a, 10) .  *
a170: 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20  *     4: (b) .  
a180: 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29  **     5: (b, 5)
a190: 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63   .  **     6: (c
a1a0: 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28  ) .  **     7: (
a1b0: 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20  c, 100) .  **   
a1c0: 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20    8: (c, 105).  
a1d0: 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30  **     9: (c, 10
a1e0: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  5).  **.  ** For
a1f0: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20   each sample in 
a200: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
a210: 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61  ray, N samples a
a220: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
a230: 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  e.  ** effective
a240: 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49   sample array. I
a250: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d  n the above, sam
a260: 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72 65  ples 0 and 1 are
a270: 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20   based on .  ** 
a280: 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30  sample aSample[0
a290: 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64  ]. Samples 2 and
a2a0: 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d   3 on aSample[1]
a2b0: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
a2c0: 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20  Often, sample i 
a2d0: 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66  of each block of
a2e0: 20 4e 20 65 66 66 65 63 74 69 76 65 20 73 61 6d   N effective sam
a2f0: 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20 66  ples has (i+1) f
a300: 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65  ields..  ** Exce
a310: 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20  pt, each sample 
a320: 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65 64 20  may be extended 
a330: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  to ensure that i
a340: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
a350: 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20  n or.  ** equal 
a360: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
a370: 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72  sample in the ar
a380: 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ray. For example
a390: 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  , in the above, 
a3a0: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69  .  ** sample 2 i
a3b0: 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
a3c0: 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66  le of a block of
a3d0: 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61   N samples, so a
a3e0: 74 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a  t first it .  **
a3f0: 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74   appears that it
a400: 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65   should be 1 fie
a410: 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65  ld in size. Howe
a420: 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20  ver, that would 
a430: 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d  make it .  ** sm
a440: 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  aller than sampl
a450: 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61  e 1, so the bina
a460: 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20  ry search would 
a470: 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72  not work. As a r
a480: 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20  esult, .  ** it 
a490: 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74  is extended to t
a4a0: 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64  wo fields. The d
a4b0: 75 70 6c 69 63 61 74 65 73 20 74 68 61 74 20 74  uplicates that t
a4c0: 68 69 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e  his creates do n
a4d0: 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61  ot .  ** cause a
a4e0: 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
a4f0: 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65  /.  nField = pRe
a500: 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f  c->nField;.  iCo
a510: 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65  l = 0;.  iSample
a520: 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
a530: 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b   * nField;.  do{
a540: 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20  .    int iSamp; 
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a560: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
a570: 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74  Sample[] of test
a580: 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69   sample */.    i
a590: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5b0: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
a5c0: 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20   in test sample 
a5d0: 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20  */..    iTest = 
a5e0: 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32  (iMin+iSample)/2
a5f0: 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54  ;.    iSamp = iT
a600: 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20  est / nField;.  
a610: 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b    if( iSamp>0 ){
a620: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  .      /* The pr
a630: 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69 76 65  oposed effective
a640: 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65   sample is a pre
a650: 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53  fix of sample aS
a660: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20  ample[iSamp]..  
a670: 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61      ** Specifica
a680: 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73  lly, the shortes
a690: 74 20 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c  t prefix of at l
a6a0: 65 61 73 74 20 28 31 20 2b 20 69 54 65 73 74 25  east (1 + iTest%
a6b0: 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a  nField) .      *
a6c0: 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 69 73  * fields that is
a6d0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
a6e0: 65 20 70 72 65 76 69 6f 75 73 20 65 66 66 65 63  e previous effec
a6f0: 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f  tive sample.  */
a700: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54  .      for(n=(iT
a710: 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20  est % nField) + 
a720: 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b  1; n<nField; n++
a730: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
a740: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e  Sample[iSamp-1].
a750: 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70  anLt[n-1]!=aSamp
a760: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
a770: 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  -1] ) break;.   
a780: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
a790: 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20        n = iTest 
a7a0: 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  + 1;.    }..    
a7b0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
a7c0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
a7d0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
a7e0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61  pare(aSample[iSa
a7f0: 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  mp].n, aSample[i
a800: 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Samp].p, pRec);.
a810: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
a820: 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
a830: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
a840: 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70  nLt[n-1] + aSamp
a850: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e  le[iSamp].anEq[n
a860: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
a870: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d  = iTest+1;.    }
a880: 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20  else if( res==0 
a890: 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20  && n<nField ){. 
a8a0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
a8b0: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
a8c0: 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d  t[n-1];.      iM
a8d0: 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20  in = iTest+1;.  
a8e0: 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20      res = -1;.  
a8f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a900: 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a  Sample = iTest;.
a910: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31        iCol = n-1
a920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
a930: 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53  ( res && iMin<iS
a940: 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69  ample );.  i = i
a950: 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b  Sample / nField;
a960: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a970: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
a980: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
a990: 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
a9a0: 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
a9b0: 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
a9c0: 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
a9d0: 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
a9e0: 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
a9f0: 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
aa00: 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
aa10: 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
aa20: 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  ts.  */.  if( pP
aa30: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
aa40: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
aa50: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
aa60: 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d       /* If (res=
aa70: 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65  =0) is true, the
aa80: 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 65  n pRec must be e
aa90: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
aaa0: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
aab0: 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  t( i<pIdx->nSamp
aac0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  le );.      asse
aad0: 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64  rt( iCol==nField
aae0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63  -1 );.      pRec
aaf0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
ab00: 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  d;.      assert(
ab10: 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52   0==sqlite3VdbeR
ab20: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
ab30: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
ab40: 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a  le[i].p, pRec) .
ab50: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
ab60: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
ab70: 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b  Failed .      );
ab80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ab90: 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70    /* Unless i==p
aba0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e  Idx->nSample, in
abb0: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 70 52  dicating that pR
abc0: 65 63 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ec is larger tha
abd0: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73  n.      ** all s
abe0: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53  amples in the aS
abf0: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70  ample[] array, p
ac00: 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c  Rec must be smal
ac10: 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20  ler than the.   
ac20: 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66     ** (iCol+1) f
ac30: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73  ield prefix of s
ac40: 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20  ample i.  */.   
ac50: 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49     assert( i<=pI
ac60: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69  dx->nSample && i
ac70: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65  >=0 );.      pRe
ac80: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c  c->nField = iCol
ac90: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
aca0: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i==pIdx->nSamp
acb0: 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  le .           |
acc0: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  | sqlite3VdbeRec
acd0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
ace0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
acf0: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20  [i].p, pRec)>0. 
ad00: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
ad10: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
ad20: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20  ailed );..      
ad30: 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69  /* if i==0 and i
ad40: 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63  Col==0, then rec
ad50: 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c  ord pRec is smal
ad60: 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d  ler than all sam
ad70: 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ples.      ** in
ad80: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
ad90: 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  rray. Otherwise,
ada0: 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65   if (iCol>0) the
adb0: 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20  n pRec must.    
adc0: 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20    ** be greater 
add0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
ade0: 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c   the (iCol) fiel
adf0: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
ae00: 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49  le i..      ** I
ae10: 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52  f (i>0), then pR
ae20: 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ec must also be 
ae30: 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d  greater than sam
ae40: 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20  ple (i-1).  */. 
ae50: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
ae60: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
ae70: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a  >nField = iCol;.
ae80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ae90: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
aea0: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
aeb0: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
aec0: 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20  ].p, pRec)<=0.  
aed0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
aee0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
aef0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
af00: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  }.      if( i>0 
af10: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
af20: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
af30: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
af40: 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ( sqlite3VdbeRec
af50: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
af60: 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70  le[i-1].n, aSamp
af70: 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29  le[i-1].p, pRec)
af80: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <0.             
af90: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
afa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
afb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
afc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
afd0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
afe0: 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ..  if( res==0 )
aff0: 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  {.    /* Record 
b000: 70 52 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f  pRec is equal to
b010: 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20   sample i */.   
b020: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e   assert( iCol==n
b030: 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61  Field-1 );.    a
b040: 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c  Stat[0] = aSampl
b050: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
b060: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
b070: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b  aSample[i].anEq[
b080: 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol];.  }else{.
b090: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
b0a0: 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b  oint, the (iCol+
b0b0: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  1) field prefix 
b0c0: 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  of aSample[i] is
b0d0: 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
b0e0: 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  ** sample that i
b0f0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  s greater than p
b100: 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70  Rec. Or, if i==p
b110: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65  Idx->nSample the
b120: 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73  n pRec.    ** is
b130: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c   larger than all
b140: 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20   samples in the 
b150: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52  array. */.    tR
b160: 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47  owcnt iUpper, iG
b170: 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70  ap;.    if( i>=p
b180: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a  Idx->nSample ){.
b190: 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 73        iUpper = s
b1a0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
b1b0: 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  t(pIdx->aiRowLog
b1c0: 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c  Est[0]);.    }el
b1d0: 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72  se{.      iUpper
b1e0: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
b1f0: 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a  Lt[iCol];.    }.
b200: 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
b210: 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
b220: 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
b230: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
b240: 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
b250: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
b260: 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
b270: 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
b280: 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
b290: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
b2a0: 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
b2b0: 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
b2c0: 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53  r + iGap;.    aS
b2d0: 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61  tat[1] = pIdx->a
b2e0: 41 76 67 45 71 5b 6e 46 69 65 6c 64 2d 31 5d 3b  AvgEq[nField-1];
b2f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
b300: 72 65 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69  re the pRec->nFi
b310: 65 6c 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65  eld value before
b320: 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a   returning.  */.
b330: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
b340: 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72   nField;.  retur
b350: 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n i;.}.#endif /*
b360: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
b370: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
b380: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ../*.** If it is
b390: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d   not NULL, pTerm
b3a0: 20 69 73 20 61 20 74 65 72 6d 20 74 68 61 74 20   is a term that 
b3b0: 70 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65  provides an uppe
b3c0: 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f  r or lower.** bo
b3d0: 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73  und on a range s
b3e0: 63 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e  can. Without con
b3f0: 73 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20  sidering pTerm, 
b400: 69 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20  it is estimated 
b410: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61  .** that the sca
b420: 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65  n will visit nNe
b430: 77 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e  w rows. This fun
b440: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
b450: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69  e number.** esti
b460: 6d 61 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  mated to be visi
b470: 74 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67  ted after taking
b480: 20 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f   pTerm into acco
b490: 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  unt..**.** If th
b4a0: 65 20 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c  e user explicitl
b4b0: 79 20 73 70 65 63 69 66 69 65 64 20 61 20 6c 69  y specified a li
b4c0: 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65  kelihood() value
b4d0: 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a   for this term,.
b4e0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  ** then the retu
b4f0: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
b500: 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69  likelihood multi
b510: 70 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d  plied by the num
b520: 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20  ber of.** input 
b530: 72 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  rows. Otherwise,
b540: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
b550: 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22  ssumes that an "
b560: 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72  IS NOT NULL" ter
b570: 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c  m.** has a likel
b580: 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61  ihood of 0.50, a
b590: 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72  nd any other ter
b5a0: 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  m a likelihood o
b5b0: 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69  f 0.25..*/.stati
b5c0: 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61  c LogEst whereRa
b5d0: 6e 67 65 41 64 6a 75 73 74 28 57 68 65 72 65 54  ngeAdjust(WhereT
b5e0: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45  erm *pTerm, LogE
b5f0: 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45  st nNew){.  LogE
b600: 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a  st nRet = nNew;.
b610: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
b620: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
b630: 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
b640: 20 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72      nRet += pTer
b650: 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
b660: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
b670: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
b680: 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
b690: 20 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30        nRet -= 20
b6a0: 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
b6b0: 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   20==sqlite3LogE
b6c0: 73 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20  st(4) );.    }. 
b6d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74   }.  return nRet
b6e0: 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  ;.}...#ifdef SQL
b6f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
b700: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
b710: 52 65 74 75 72 6e 20 74 68 65 20 61 66 66 69 6e  Return the affin
b720: 69 74 79 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ity for a single
b730: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
b740: 64 65 78 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  dex..*/.char sql
b750: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
b760: 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33 20  ffinity(sqlite3 
b770: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
b780: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 61  , int iCol){.  a
b790: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26  ssert( iCol>=0 &
b7a0: 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f  & iCol<pIdx->nCo
b7b0: 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21 70  lumn );.  if( !p
b7c0: 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a  Idx->zColAff ){.
b7d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
b7e0: 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
b7f0: 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20 72  db, pIdx)==0 ) r
b800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
b810: 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74  _BLOB;.  }.  ret
b820: 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66  urn pIdx->zColAf
b830: 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69  f[iCol];.}.#endi
b840: 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f...#ifdef SQLIT
b850: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
b860: 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54  R_STAT4./* .** T
b870: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b880: 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61  called to estima
b890: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
b8a0: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
b8b0: 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e   a.** range-scan
b8c0: 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20   on a skip-scan 
b8d0: 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70  index. For examp
b8e0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  le:.**.**   CREA
b8f0: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
b900: 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20  1(a, b, c);.**  
b910: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
b920: 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20  1 WHERE a=? AND 
b930: 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
b940: 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70  ?;.**.** Value p
b950: 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75  Loop->nOut is cu
b960: 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
b970: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
b980: 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20  ber of rows .** 
b990: 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e  visited for scan
b9a0: 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d  ning (a=? AND b=
b9b0: 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ?). This functio
b9c0: 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65  n reduces that e
b9d0: 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73  stimate .** by s
b9e0: 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63  ome factor to ac
b9f0: 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63  count for the (c
ba00: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
ba10: 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73  ) expression bas
ba20: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ed.** on the sta
ba30: 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  t4 data for the 
ba40: 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e  index. this scan
ba50: 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65   will be peforme
ba60: 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
ba70: 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65  imes (once for e
ba80: 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e  ach (a,b) combin
ba90: 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68  ation that match
baa0: 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74  es a=?) is dealt
bab0: 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65   with .** by the
bac0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
bad0: 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73  t does this by s
bae0: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
baf0: 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65  all stat4 sample
bb00: 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c  s, comparing val
bb10: 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  ues.** extracted
bb20: 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
bb30: 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65   pUpper with the
bb40: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
bb50: 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a  olumn in each.**
bb60: 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e   sample. If L an
bb70: 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62  d U are the numb
bb80: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f  er of samples fo
bb90: 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  und to be less t
bba0: 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20  han or.** equal 
bbb0: 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78  to the values ex
bbc0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
bbd0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
bbe0: 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64  espectively, and
bbf0: 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74  .** N is the tot
bc00: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  al number of sam
bc10: 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d  ples, the pLoop-
bc20: 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61  >nOut value is a
bc30: 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f  djusted.** as fo
bc40: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e  llows:.**.**   n
bc50: 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d  Out = nOut * ( m
bc60: 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e  in(U - L, 1) / N
bc70: 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77   ).**.** If pLow
bc80: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
bc90: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
bca0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
bcb0: 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a  the term, L is.*
bcc0: 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49  * set to zero. I
bcd0: 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c  f pUpper is NULL
bce0: 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
bcf0: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
bd00: 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69   from it,.** U i
bd10: 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a  s set to N..**.*
bd20: 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  * Normally, this
bd30: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a   function sets *
bd40: 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f  pbDone to 1 befo
bd50: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f  re returning. Ho
bd60: 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20  wever,.** if no 
bd70: 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74  value can be ext
bd80: 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68  racted from eith
bd90: 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70  er pLower or pUp
bda0: 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a  per (and so the.
bdb0: 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ** estimate of t
bdc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
bdd0: 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61  s delivered rema
bde0: 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20  ins unchanged), 
bdf0: 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65  *pbDone.** is le
be00: 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  ft as is..**.** 
be10: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
be20: 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
be30: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
be40: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
be50: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a   .** SQLITE_OK..
be60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
be70: 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e  ereRangeSkipScan
be80: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
be90: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
bea0: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
beb0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
bec0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
bed0: 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
bee0: 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
bef0: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
bf00: 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
bf10: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
bf20: 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
bf30: 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
bf40: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
bf50: 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
bf60: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
bf70: 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20  p *pLoop,    /* 
bf80: 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74  Update the .nOut
bf90: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c   value of this l
bfa0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  oop */.  int *pb
bfb0: 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Done          /*
bfc0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
bfd0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70  at least one exp
bfe0: 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74  r. value extract
bff0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ed */.){.  Index
c000: 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
c010: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
c020: 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
c030: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
c040: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
c050: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
c060: 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Lower = -1;.  in
c070: 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53  t nUpper = p->nS
c080: 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72  ample+1;.  int r
c090: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c0a0: 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74 65   u8 aff = sqlite
c0b0: 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69  3IndexColumnAffi
c0c0: 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71 29  nity(db, p, nEq)
c0d0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
c0e0: 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  ll;.  .  sqlite3
c0f0: 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20  _value *p1 = 0; 
c100: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
c110: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
c120: 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c   pLower */.  sql
c130: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d  ite3_value *p2 =
c140: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
c150: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
c160: 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20  from pUpper */. 
c170: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
c180: 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  pVal = 0;       
c190: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
c1a0: 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20  ted from record 
c1b0: 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  */..  pColl = sq
c1c0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
c1d0: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a  eq(pParse, p->az
c1e0: 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66  Coll[nEq]);.  if
c1f0: 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
c200: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
c210: 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  4ValueFromExpr(p
c220: 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70  Parse, pLower->p
c230: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
c240: 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f  f, &p1);.    nLo
c250: 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  wer = 0;.  }.  i
c260: 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d  f( pUpper && rc=
c270: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c280: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
c290: 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
c2a0: 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d  (pParse, pUpper-
c2b0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
c2c0: 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e  aff, &p2);.    n
c2d0: 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a  Upper = p2 ? 0 :
c2e0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d   p->nSample;.  }
c2f0: 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32  ..  if( p1 || p2
c300: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
c310: 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20     int nDiff;.  
c320: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
c330: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
c340: 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
c350: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c360: 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62  e3Stat4Column(db
c370: 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
c380: 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  p, p->aSample[i]
c390: 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b  .n, nEq, &pVal);
c3a0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
c3b0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29  QLITE_OK && p1 )
c3c0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
c3d0: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
c3e0: 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20  mpare(p1, pVal, 
c3f0: 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
c400: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f  if( res>=0 ) nLo
c410: 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  wer++;.      }. 
c420: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c430: 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a  ITE_OK && p2 ){.
c440: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
c450: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
c460: 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43  are(p2, pVal, pC
c470: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
c480: 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65  ( res>=0 ) nUppe
c490: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
c4a0: 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28   }.    nDiff = (
c4b0: 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29  nUpper - nLower)
c4c0: 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c  ;.    if( nDiff<
c4d0: 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a  =0 ) nDiff = 1;.
c4e0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
c4f0: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
c500: 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  r and lower boun
c510: 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64  d specified, and
c520: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d   the .    ** com
c530: 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74  parisons indicat
c540: 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  e that they are 
c550: 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20  close together, 
c560: 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b  use the fallback
c570: 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28  .    ** method (
c580: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
c590: 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34  scan visits 1/64
c5a0: 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f   of the rows) fo
c5b0: 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20  r estimating.   
c5c0: 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
c5d0: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20  f rows visited. 
c5e0: 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d  Otherwise, estim
c5f0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
c600: 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73  f rows.    ** us
c610: 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64  ing the method d
c620: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
c630: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66  header comment f
c640: 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
c650: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69  . */.    if( nDi
c660: 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d  ff!=1 || pUpper=
c670: 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20  =0 || pLower==0 
c680: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64  ){.      int nAd
c690: 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c  just = (sqlite3L
c6a0: 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65  ogEst(p->nSample
c6b0: 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ) - sqlite3LogEs
c6c0: 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20  t(nDiff));.     
c6d0: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20   pLoop->nOut -= 
c6e0: 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a  nAdjust;.      *
c6f0: 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  pbDone = 1;.    
c700: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
c710: 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d  0, ("range skip-
c720: 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75  scan regions: %u
c730: 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20  ..%u  adjust=%d 
c740: 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55        nLower, nU
c770: 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31  pper, nAdjust*-1
c780: 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b  , pLoop->nOut));
c790: 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
c7a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62  .    assert( *pb
c7b0: 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  Done==0 );.  }..
c7c0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
c7d0: 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p1);.  sqlite
c7e0: 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a  3ValueFree(p2);.
c7f0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
c800: 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
c810: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
c820: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
c830: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
c840: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
c850: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
c860: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
c870: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
c880: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73  that will be vis
c890: 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e  ited.** by scann
c8a0: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ing an index for
c8b0: 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75   a range of valu
c8c0: 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61  es. The range ma
c8d0: 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a  y have an upper.
c8e0: 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65  ** bound, a lowe
c8f0: 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68  r bound, or both
c900: 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  . The WHERE clau
c910: 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65  se terms that se
c920: 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61  t the upper.** a
c930: 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20  nd lower bounds 
c940: 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20  are represented 
c950: 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  by pLower and pU
c960: 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
c970: 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  y. For.** exampl
c980: 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
c990: 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
c9a0: 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  1(a):.**.**   ..
c9b0: 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
c9c0: 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
c9d0: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
c9e0: 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f            |_____
c9f0: 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20  |   |_____|.**  
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
ca20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ca30: 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20          pLower  
ca40: 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49    pUpper.**.** I
ca50: 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
ca60: 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62  upper or lower b
ca70: 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73  ound is not pres
ca80: 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69  ent, then NULL i
ca90: 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70  s passed in.** p
caa0: 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72  lace of the corr
cab0: 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54  esponding WhereT
cac0: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  erm..**.** The v
cad0: 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65  alue in (pBuilde
cae0: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
caf0: 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75 6d  .nEq) is the num
cb00: 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
cb10: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65  .** column subje
cb20: 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20  ct to the range 
cb30: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20  constraint. Or, 
cb40: 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68  equivalently, th
cb50: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65  e number of.** e
cb60: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
cb70: 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79  nts optimized by
cb80: 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e   the proposed in
cb90: 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78  dex scan. For ex
cba0: 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69  ample,.** assumi
cbb0: 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  ng index p is on
cbc0: 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74   t1(a, b), and t
cbd0: 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a  he SQL query is:
cbe0: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
cbf0: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f  M t1 WHERE a = ?
cc00: 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62   AND b > ? AND b
cc10: 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
cc20: 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
cc30: 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  o 1 (as the rang
cc40: 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
cc50: 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73  umn, b, is the s
cc60: 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d  econd .** left-m
cc70: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
cc80: 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66  e index). Or, if
cc90: 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a   the query is:.*
cca0: 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
ccb0: 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
ccc0: 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND a < ? ....**.
ccd0: 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73  ** then nEq is s
cce0: 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57  et to 0..**.** W
ccf0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
cd00: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e  n is called, *pn
cd10: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
cd20: 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  e sqlite3LogEst(
cd30: 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  ) of the.** numb
cd40: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
cd50: 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69  the index scan i
cd60: 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69  s expected to vi
cd70: 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20  sit without .** 
cd80: 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20  considering the 
cd90: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
cda0: 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20  s. If nEq is 0, 
cdb0: 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74  then *pnOut is t
cdc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
cdd0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
cde0: 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
cdf0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
ce00: 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
ce10: 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
ce20: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
ce30: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
ce40: 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  ts pLower and pU
ce50: 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20  pper..** .** In 
ce60: 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
ce70: 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c  qlite_stat4 ANAL
ce80: 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20  YZE data, or if 
ce90: 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74  such data cannot
cea0: 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73   be.** used, a s
ceb0: 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71  ingle range ineq
cec0: 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74  uality reduces t
ced0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
cee0: 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34  by a factor of 4
cef0: 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72  . .** and a pair
cf00: 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
cf10: 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
cf20: 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74  duces the expect
cf30: 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  ed number of.** 
cf40: 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
cf50: 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a  a factor of 64..
cf60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
cf70: 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
cf80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cf90: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
cfa0: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
cfb0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
cfc0: 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
cfd0: 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
cfe0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
cff0: 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
d000: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
d010: 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
d020: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
d030: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
d040: 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
d050: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
d060: 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
d070: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d080: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
d090: 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79  op     /* Modify
d0a0: 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d   the .nOut and m
d0b0: 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64  aybe .rRun field
d0c0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
d0d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
d0e0: 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70  int nOut = pLoop
d0f0: 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74  ->nOut;.  LogEst
d100: 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53   nNew;..#ifdef S
d110: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
d120: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e  T3_OR_STAT4.  In
d130: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
d140: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
d150: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
d160: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
d170: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c  .  if( p->nSampl
d180: 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53  e>0 && nEq<p->nS
d190: 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f  ampleCol.   && O
d1a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
d1b0: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
d1c0: 51 4c 49 54 45 5f 53 74 61 74 33 34 29 0a 20 20  QLITE_Stat34).  
d1d0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  ){.    if( nEq==
d1e0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
d1f0: 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e 70  lid ){.      Unp
d200: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
d210: 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  c = pBuilder->pR
d220: 65 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e  ec;.      tRowcn
d230: 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 69 6e  t a[2];.      in
d240: 74 20 6e 42 74 6d 20 3d 20 70 4c 6f 6f 70 2d 3e  t nBtm = pLoop->
d250: 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20  u.btree.nBtm;.  
d260: 20 20 20 20 69 6e 74 20 6e 54 6f 70 20 3d 20 70      int nTop = p
d270: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  Loop->u.btree.nT
d280: 6f 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61  op;..      /* Va
d290: 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69  riable iLower wi
d2a0: 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
d2b0: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
d2c0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
d2d0: 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  in .      ** the
d2e0: 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20   index that are 
d2f0: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f  less than the lo
d300: 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
d310: 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68   range query. Th
d320: 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72  e.      ** lower
d330: 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65   bound being the
d340: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
d350: 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65  f $P and $L, whe
d360: 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20  re $P is the.   
d370: 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78     ** key-prefix
d380: 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e   formed by the n
d390: 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65  Eq values matche
d3a0: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45  d against the nE
d3b0: 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20  q left-most.    
d3c0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20    ** columns of 
d3d0: 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24  the index, and $
d3e0: 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69  L is the value i
d3f0: 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20  n pLower..      
d400: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20  **.      ** Or, 
d410: 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c  if pLower is NUL
d420: 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62  L or $L cannot b
d430: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
d440: 20 69 74 20 28 62 65 63 61 75 73 65 20 69 74 0a   it (because it.
d450: 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
d460: 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c  a simple variabl
d470: 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c  e or literal val
d480: 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62  ue), the lower b
d490: 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ound of the.    
d4a0: 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50    ** range is $P
d4b0: 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b  . Due to a quirk
d4c0: 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65 72   in the way wher
d4d0: 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b  eKeyStats() work
d4e0: 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  s, even.      **
d4f0: 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61   if $L is availa
d500: 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61  ble, whereKeySta
d510: 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  ts() is called f
d520: 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64  or both ($P) and
d530: 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24   .      ** ($P:$
d540: 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65  L) and the large
d550: 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74  r of the two ret
d560: 75 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73 20  urned values is 
d570: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  used..      **. 
d580: 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c       ** Similarl
d590: 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20  y, iUpper is to 
d5a0: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
d5b0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
d5c0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
d5d0: 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20     ** less than 
d5e0: 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
d5f0: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
d600: 72 79 2e 20 57 68 65 72 65 20 74 68 65 20 75 70  ry. Where the up
d610: 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20  per bound.      
d620: 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24 50  ** is either ($P
d630: 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67  ) or ($P:$U). Ag
d640: 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20  ain, even if $U 
d650: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f  is available, bo
d660: 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20  th values.      
d670: 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65  ** of iUpper are
d680: 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68   requested of wh
d690: 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e  ereKeyStats() an
d6a0: 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73  d the smaller us
d6b0: 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
d6c0: 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72     ** The number
d6d0: 20 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65 6e   of rows between
d6e0: 20 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73 20   the two bounds 
d6f0: 69 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55 70  is then just iUp
d700: 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20  per-iLower..    
d710: 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63    */.      tRowc
d720: 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f  nt iLower;     /
d730: 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  * Rows less than
d740: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
d750: 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   */.      tRowcn
d760: 74 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f 2a  t iUpper;     /*
d770: 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   Rows less than 
d780: 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
d790: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 77  */.      int iLw
d7a0: 72 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20  rIdx = -2;   /* 
d7b0: 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68  aSample[] for th
d7c0: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
d7d0: 0a 20 20 20 20 20 20 69 6e 74 20 69 55 70 72 49  .      int iUprI
d7e0: 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53  dx = -1;   /* aS
d7f0: 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20  ample[] for the 
d800: 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a  upper bound */..
d810: 20 20 20 20 20 20 69 66 28 20 70 52 65 63 20 29        if( pRec )
d820: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
d830: 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  se( pRec->nField
d840: 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  !=pBuilder->nRec
d850: 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Valid );.       
d860: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
d870: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
d880: 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lid;.      }.   
d890: 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20     /* Determine 
d8a0: 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65  iLower and iUppe
d8b0: 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c  r using ($P) onl
d8c0: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  y. */.      if( 
d8d0: 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nEq==0 ){.      
d8e0: 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    iLower = 0;.  
d8f0: 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 70        iUpper = p
d900: 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20 20  ->nRowEst0;.    
d910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d920: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
d930: 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74  all could be opt
d940: 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69  imized away - si
d950: 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c  nce the same val
d960: 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20  ues must .      
d970: 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72    ** have been r
d980: 65 71 75 65 73 74 65 64 20 77 68 65 6e 20 74 65  equested when te
d990: 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20  sting key $P in 
d9a0: 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
d9b0: 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  t().  */.       
d9c0: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
d9d0: 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
d9e0: 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69  0, a);.        i
d9f0: 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20  Lower = a[0];.  
da00: 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
da10: 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20  [0] + a[1];.    
da20: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
da30: 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20  t( pLower==0 || 
da40: 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74  (pLower->eOperat
da50: 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  or & (WO_GT|WO_G
da60: 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
da70: 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d  assert( pUpper==
da80: 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f  0 || (pUpper->eO
da90: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54  perator & (WO_LT
daa0: 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_LE))!=0 );. 
dab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
dac0: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
dad0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 53  .      if( p->aS
dae0: 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b  ortOrder[nEq] ){
daf0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
db00: 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72 20  roles of pLower 
db10: 61 6e 64 20 70 55 70 70 65 72 20 61 72 65 20 73  and pUpper are s
db20: 77 61 70 70 65 64 20 66 6f 72 20 61 20 44 45 53  wapped for a DES
db30: 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  C index */.     
db40: 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
db50: 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70  m*, pLower, pUpp
db60: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 53 57 41  er);.        SWA
db70: 50 28 69 6e 74 2c 20 6e 42 74 6d 2c 20 6e 54 6f  P(int, nBtm, nTo
db80: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  p);.      }..   
db90: 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c     /* If possibl
dba0: 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68  e, improve on th
dbb0: 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74  e iLower estimat
dbc0: 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e  e using ($P:$L).
dbd0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c   */.      if( pL
dbe0: 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
dbf0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
dc00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
dc10: 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  ues extracted fr
dc20: 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
dc30: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
dc40: 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  = pLower->pExpr-
dc50: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
dc60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
dc70: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
dc80: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
dc90: 2c 20 70 45 78 70 72 2c 20 6e 42 74 6d 2c 20 6e  , pExpr, nBtm, n
dca0: 45 71 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  Eq, &n);.       
dcb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dcc0: 4f 4b 20 26 26 20 6e 20 29 7b 0a 20 20 20 20 20  OK && n ){.     
dcd0: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65       tRowcnt iNe
dce0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 75 31 36  w;.          u16
dcf0: 20 6d 61 73 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f   mask = WO_GT|WO
dd00: 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _LE;.          i
dd10: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 56 65  f( sqlite3ExprVe
dd20: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e  ctorSize(pExpr)>
dd30: 6e 20 29 20 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c  n ) mask = (WO_L
dd40: 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20 20 20 20 20  E|WO_LT);.      
dd50: 20 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77 68      iLwrIdx = wh
dd60: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
dd70: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
dd80: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e  a);.          iN
dd90: 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c  ew = a[0] + ((pL
dda0: 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
ddb0: 26 20 6d 61 73 6b 29 20 3f 20 61 5b 31 5d 20 3a  & mask) ? a[1] :
ddc0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
ddd0: 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29  f( iNew>iLower )
dde0: 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a   iLower = iNew;.
ddf0: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d            nOut--
de00: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77  ;.          pLow
de10: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
de20: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
de30: 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
de40: 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
de50: 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20  iUpper estimate 
de60: 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a  using ($P:$U). *
de70: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 55 70 70  /.      if( pUpp
de80: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  er ){.        in
de90: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
dea0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
deb0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
dec0: 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20   pExpr */.      
ded0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
dee0: 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
def0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
df00: 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
df10: 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
df20: 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
df30: 70 45 78 70 72 2c 20 6e 54 6f 70 2c 20 6e 45 71  pExpr, nTop, nEq
df40: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  , &n);.        i
df50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
df60: 20 26 26 20 6e 20 29 7b 0a 20 20 20 20 20 20 20   && n ){.       
df70: 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b     tRowcnt iNew;
df80: 0a 20 20 20 20 20 20 20 20 20 20 75 31 36 20 6d  .          u16 m
df90: 61 73 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c  ask = WO_GT|WO_L
dfa0: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  E;.          if(
dfb0: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
dfc0: 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e 6e 20  orSize(pExpr)>n 
dfd0: 29 20 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c  ) mask = (WO_LE|
dfe0: 57 4f 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20  WO_LT);.        
dff0: 20 20 69 55 70 72 49 64 78 20 3d 20 77 68 65 72    iUprIdx = wher
e000: 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
e010: 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29  , p, pRec, 1, a)
e020: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77  ;.          iNew
e030: 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70   = a[0] + ((pUpp
e040: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
e050: 6d 61 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30  mask) ? a[1] : 0
e060: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
e070: 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69   iNew<iUpper ) i
e080: 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Upper = iNew;.  
e090: 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a          nOut--;.
e0a0: 20 20 20 20 20 20 20 20 20 20 70 55 70 70 65 72            pUpper
e0b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
e0c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
e0d0: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
e0e0: 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28 20  pRec;.      if( 
e0f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e100: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 55 70  .        if( iUp
e110: 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20  per>iLower ){.  
e120: 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73          nNew = s
e130: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70  qlite3LogEst(iUp
e140: 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20  per - iLower);. 
e150: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
e160: 4e 47 3a 20 20 49 66 20 62 6f 74 68 20 69 55 70  NG:  If both iUp
e170: 70 65 72 20 61 6e 64 20 69 4c 6f 77 65 72 20 61  per and iLower a
e180: 72 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20  re derived from 
e190: 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
e1a0: 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74 68     ** sample, th
e1b0: 65 6e 20 61 73 73 75 6d 65 20 74 68 65 79 20 61  en assume they a
e1c0: 72 65 20 34 78 20 6d 6f 72 65 20 73 65 6c 65 63  re 4x more selec
e1d0: 74 69 76 65 2e 20 20 54 68 69 73 20 62 72 69 6e  tive.  This brin
e1e0: 67 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gs.          ** 
e1f0: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 73 65  the estimated se
e200: 6c 65 63 74 69 76 69 74 79 20 6d 6f 72 65 20 69  lectivity more i
e210: 6e 20 6c 69 6e 65 20 77 69 74 68 20 77 68 61 74  n line with what
e220: 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 20 20 20   it would be.   
e230: 20 20 20 20 20 20 20 2a 2a 20 69 66 20 65 73 74         ** if est
e240: 69 6d 61 74 65 64 20 77 69 74 68 6f 75 74 20 74  imated without t
e250: 68 65 20 75 73 65 20 6f 66 20 53 54 41 54 33 2f  he use of STAT3/
e260: 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20  4 tables. */.   
e270: 20 20 20 20 20 20 20 69 66 28 20 69 4c 77 72 49         if( iLwrI
e280: 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e 4e  dx==iUprIdx ) nN
e290: 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65 72  ew -= 20;  asser
e2a0: 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 20==sqlite3Lo
e2b0: 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 20  gEst(4) );.     
e2c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e2d0: 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20      nNew = 10;  
e2e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30        assert( 10
e2f0: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
e300: 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2) );.        }.
e310: 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77          if( nNew
e320: 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20  <nOut ){.       
e330: 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a     nOut = nNew;.
e340: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e350: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
e360: 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67 65  0, ("STAT4 range
e370: 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65   scan: %u..%u  e
e380: 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
e3b0: 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e  , (u32)iUpper, n
e3c0: 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Out));.      }. 
e3d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e3e0: 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20  int bDone = 0;. 
e3f0: 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52       rc = whereR
e400: 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28  angeSkipScanEst(
e410: 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20  pParse, pLower, 
e420: 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26  pUpper, pLoop, &
e430: 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  bDone);.      if
e440: 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  ( bDone ) return
e450: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23   rc;.    }.  }.#
e460: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
e470: 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
e480: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e490: 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 20  TER(pBuilder);. 
e4a0: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20   assert( pLower 
e4b0: 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65 6e  || pUpper );.#en
e4c0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 55  dif.  assert( pU
e4d0: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
e4e0: 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  er->wtFlags & TE
e4f0: 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
e500: 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
e510: 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65 72  ngeAdjust(pLower
e520: 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20  , nOut);.  nNew 
e530: 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
e540: 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77 29  st(pUpper, nNew)
e550: 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  ;..  /* TUNING: 
e560: 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
e570: 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
e580: 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e 65  wer limit and ne
e590: 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a 2a  ither limit.  **
e5a0: 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61 74   has an applicat
e5b0: 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b 65  ion-defined like
e5c0: 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d 65  lihood(), assume
e5d0: 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20 20   the range is.  
e5e0: 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61 6e  ** reduced by an
e5f0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e   additional 75%.
e600: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
e610: 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61 6e  , by default, an
e620: 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a   open-ended.  **
e630: 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65 2e   range query (e.
e640: 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61  g. col > ?) is a
e650: 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68 20  ssumed to match 
e660: 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73 20  1/4 of the rows 
e670: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
e680: 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73 65  x. While a close
e690: 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f  d range (e.g. co
e6a0: 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  l BETWEEN ? AND 
e6b0: 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64 20  ?) is estimated 
e6c0: 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f  to.  ** match 1/
e6d0: 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  64 of the index.
e6e0: 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77 65   */ .  if( pLowe
e6f0: 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72 75  r && pLower->tru
e700: 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70 70  thProb>0 && pUpp
e710: 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74 72  er && pUpper->tr
e720: 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20 20  uthProb>0 ){.   
e730: 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20 7d   nNew -= 20;.  }
e740: 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f  ..  nOut -= (pLo
e750: 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70 65  wer!=0) + (pUppe
e760: 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65  r!=0);.  if( nNe
e770: 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30  w<10 ) nNew = 10
e780: 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75  ;.  if( nNew<nOu
e790: 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b  t ) nOut = nNew;
e7a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
e7b0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
e7c0: 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f  .  if( pLoop->nO
e7d0: 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57  ut>nOut ){.    W
e7e0: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
e7f0: 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65  "Range scan lowe
e800: 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20  rs nOut from %d 
e810: 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  to %d\n",.      
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
e830: 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29  oop->nOut, nOut)
e840: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
e850: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
e860: 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65  ogEst)nOut;.  re
e870: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
e880: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e890: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
e8a0: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
e8b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
e8c0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
e8d0: 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
e8e0: 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
e8f0: 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
e900: 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
e910: 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
e920: 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
e930: 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
e940: 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
e950: 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
e960: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
e970: 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
e980: 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
e990: 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
e9a0: 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
e9b0: 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
e9c0: 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
e9d0: 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
e9e0: 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
e9f0: 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
ea00: 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
ea10: 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
ea20: 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
ea30: 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
ea40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ea50: 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
ea60: 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
ea70: 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
ea80: 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
ea90: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
eaa0: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
eab0: 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
eac0: 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
ead0: 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
eae0: 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
eaf0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
eb00: 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
eb10: 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
eb20: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
eb30: 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
eb40: 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
eb50: 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
eb60: 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
eb70: 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
eb80: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
eb90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
eba0: 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
ebb0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
ebc0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
ebd0: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
ebe0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
ebf0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
ec00: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
ec10: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
ec20: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
ec30: 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
ec40: 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
ec50: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
ec60: 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
ec70: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
ec80: 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
ec90: 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
eca0: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
ecb0: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
ecc0: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
ecd0: 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
ece0: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
ecf0: 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
ed00: 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
ed10: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
ed20: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
ed30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
ed40: 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
ed50: 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63   code */.  tRowc
ed60: 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20  nt a[2];        
ed70: 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69       /* Statisti
ed80: 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b  cs */.  int bOk;
ed90: 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e  ..  assert( nEq>
eda0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
edb0: 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  nEq<=p->nColumn 
edc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
edd0: 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
ede0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70  assert( p->nSamp
edf0: 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
ee00: 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ( pBuilder->nRec
ee10: 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20  Valid<nEq );..  
ee20: 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72 65  /* If values are
ee30: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
ee40: 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66  or all fields of
ee50: 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74 68   the index to th
ee60: 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74  e left.  ** of t
ee70: 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69  his one, no esti
ee80: 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64 65  mate can be made
ee90: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
eea0: 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69  NOTFOUND. */.  i
eeb0: 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  f( pBuilder->nRe
eec0: 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29  cValid<(nEq-1) )
eed0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
eee0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
eef0: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  }..  /* This is 
ef00: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
ef10: 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20 74  only. The call t
ef20: 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  o sqlite3Stat4Pr
ef30: 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20 20  obeSetValue().  
ef40: 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72  ** below would r
ef50: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 76  eturn the same v
ef60: 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  alue.  */.  if( 
ef70: 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  nEq>=p->nColumn 
ef80: 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  ){.    *pnRow = 
ef90: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
efa0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
efb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
efc0: 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
efd0: 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
efe0: 20 70 45 78 70 72 2c 20 31 2c 20 6e 45 71 2d 31   pExpr, 1, nEq-1
eff0: 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c  , &bOk);.  pBuil
f000: 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
f010: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f020: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
f030: 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20  c;.  if( bOk==0 
f040: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f050: 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69  NOTFOUND;.  pBui
f060: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
f070: 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b  = nEq;..  whereK
f080: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
f090: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
f0a0: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
f0b0: 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63 61  0,("equality sca
f0c0: 6e 20 72 65 67 69 6f 6e 73 20 25 73 28 25 64 29  n regions %s(%d)
f0d0: 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  : %d\n",.       
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
f0f0: 4e 61 6d 65 2c 20 6e 45 71 2d 31 2c 20 28 69 6e  Name, nEq-1, (in
f100: 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52  t)a[1]));.  *pnR
f110: 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20  ow = a[1];.  .  
f120: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
f130: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
f140: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
f150: 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AT4 */..#ifdef S
f160: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
f170: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
f180: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
f190: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
f1a0: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
f1b0: 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
f1c0: 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
f1d0: 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
f1e0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
f1f0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
f200: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61   is a list of va
f210: 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  lues.  Example:.
f220: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45  **.**        WHE
f230: 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
f240: 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
f250: 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
f260: 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
f270: 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
f280: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
f290: 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
f2a0: 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
f2b0: 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
f2c0: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
f2d0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
f2e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
f2f0: 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
f300: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
f310: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
f320: 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
f330: 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
f340: 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
f350: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
f360: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
f370: 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
f380: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
f390: 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
f3a0: 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
f3b0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
f3c0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
f3d0: 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61  c int whereInSca
f3e0: 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
f3f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
f400: 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
f410: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
f420: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
f430: 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
f440: 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r,.  ExprList *p
f450: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
f460: 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
f470: 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
f480: 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
f490: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
f4a0: 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
f4b0: 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
f4c0: 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
f4d0: 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
f4e0: 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
f4f0: 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
f500: 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20  ex;.  i64 nRow0 
f510: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  = sqlite3LogEstT
f520: 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67  oInt(p->aiRowLog
f530: 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e  Est[0]);.  int n
f540: 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
f550: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
f560: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f570: 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62  E_OK;     /* Sub
f580: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20  function return 
f590: 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  code */.  tRowcn
f5a0: 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20  t nEst;         
f5b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
f5c0: 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ows for a single
f5d0: 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63   term */.  tRowc
f5e0: 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20  nt nRowEst = 0; 
f5f0: 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61     /* New estima
f600: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
f610: 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e   of rows */.  in
f620: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
f630: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
f640: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
f650: 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
f660: 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
f670: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
f680: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
f690: 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20   i++){.    nEst 
f6a0: 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20  = nRow0;.    rc 
f6b0: 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
f6c0: 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
f6d0: 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  lder, pList->a[i
f6e0: 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b  ].pExpr, &nEst);
f6f0: 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20  .    nRowEst += 
f700: 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64  nEst;.    pBuild
f710: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
f720: 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a  nRecValid;.  }..
f730: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f740: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
f750: 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29  RowEst > nRow0 )
f760: 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30   nRowEst = nRow0
f770: 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e  ;.    *pnRow = n
f780: 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52  RowEst;.    WHER
f790: 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e  ETRACE(0x10,("IN
f7a0: 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65   row estimate: e
f7b0: 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73  st=%d\n", nRowEs
f7c0: 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  t));.  }.  asser
f7d0: 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
f7e0: 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69  cValid==nRecVali
f7f0: 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d );.  return rc
f800: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
f810: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
f820: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a  3_OR_STAT4 */...
f830: 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
f840: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
f850: 50 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  Print the conten
f860: 74 20 6f 66 20 61 20 57 68 65 72 65 54 65 72 6d  t of a WhereTerm
f870: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
f880: 63 20 76 6f 69 64 20 77 68 65 72 65 54 65 72 6d  c void whereTerm
f890: 50 72 69 6e 74 28 57 68 65 72 65 54 65 72 6d 20  Print(WhereTerm 
f8a0: 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69 54 65 72  *pTerm, int iTer
f8b0: 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d  m){.  if( pTerm=
f8c0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
f8d0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 54 45  3DebugPrintf("TE
f8e0: 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c  RM-%-3d NULL\n",
f8f0: 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65   iTerm);.  }else
f900: 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 79 70 65  {.    char zType
f910: 5b 34 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a 4c  [4];.    char zL
f920: 65 66 74 5b 35 30 5d 3b 0a 20 20 20 20 6d 65 6d  eft[50];.    mem
f930: 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22  cpy(zType, "..."
f940: 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 4);.    if( pT
f950: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
f960: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54  ERM_VIRTUAL ) zT
f970: 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20  ype[0] = 'V';.  
f980: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
f990: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49  erator & WO_EQUI
f9a0: 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20  V  ) zType[1] = 
f9b0: 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70  'E';.    if( Exp
f9c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
f9d0: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
f9e0: 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b  omJoin) ) zType[
f9f0: 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 69 66  2] = 'L';.    if
fa00: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
fa10: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 20 29  or & WO_SINGLE )
fa20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
fa30: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
fa40: 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65  zLeft),zLeft,"le
fa50: 66 74 3d 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20  ft={%d:%d}",.   
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
fa80: 75 72 73 6f 72 2c 20 70 54 65 72 6d 2d 3e 75 2e  ursor, pTerm->u.
fa90: 6c 65 66 74 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  leftColumn);.   
faa0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
fab0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
fac0: 4f 5f 4f 52 29 21 3d 30 20 26 26 20 70 54 65 72  O_OR)!=0 && pTer
fad0: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 21 3d 30 20  m->u.pOrInfo!=0 
fae0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
faf0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
fb00: 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22 69  (zLeft),zLeft,"i
fb10: 6e 64 65 78 61 62 6c 65 3d 30 78 25 6c 6c 64 22  ndexable=0x%lld"
fb20: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
fb30: 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
fb40: 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  >u.pOrInfo->inde
fb50: 78 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  xable);.    }els
fb60: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
fb70: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
fb80: 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22 6c  (zLeft),zLeft,"l
fb90: 65 66 74 3d 25 64 22 2c 20 70 54 65 72 6d 2d 3e  eft=%d", pTerm->
fba0: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
fbb0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
fbc0: 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
fbd0: 20 20 22 54 45 52 4d 2d 25 2d 33 64 20 25 70 20    "TERM-%-3d %p 
fbe0: 25 73 20 25 2d 31 32 73 20 70 72 6f 62 3d 25 2d  %s %-12s prob=%-
fbf0: 33 64 20 6f 70 3d 30 78 25 30 33 78 20 77 74 46  3d op=0x%03x wtF
fc00: 6c 61 67 73 3d 30 78 25 30 34 78 22 2c 0a 20 20  lags=0x%04x",.  
fc10: 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72       iTerm, pTer
fc20: 6d 2c 20 7a 54 79 70 65 2c 20 7a 4c 65 66 74 2c  m, zType, zLeft,
fc30: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
fc40: 62 2c 0a 20 20 20 20 20 20 20 70 54 65 72 6d 2d  b,.       pTerm-
fc50: 3e 65 4f 70 65 72 61 74 6f 72 2c 20 70 54 65 72  >eOperator, pTer
fc60: 6d 2d 3e 77 74 46 6c 61 67 73 29 3b 0a 20 20 20  m->wtFlags);.   
fc70: 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 46 69 65   if( pTerm->iFie
fc80: 6c 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ld ){.      sqli
fc90: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
fca0: 20 69 46 69 65 6c 64 3d 25 64 5c 6e 22 2c 20 70   iField=%d\n", p
fcb0: 54 65 72 6d 2d 3e 69 46 69 65 6c 64 29 3b 0a 20  Term->iField);. 
fcc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fcd0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
fce0: 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  tf("\n");.    }.
fcf0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
fd00: 69 65 77 45 78 70 72 28 30 2c 20 70 54 65 72 6d  iewExpr(0, pTerm
fd10: 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  ->pExpr, 0);.  }
fd20: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
fd30: 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
fd40: 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20  BLED./*.** Show 
fd50: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
fd60: 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 43  tent of a WhereC
fd70: 6c 61 75 73 65 0a 2a 2f 0a 76 6f 69 64 20 73 71  lause.*/.void sq
fd80: 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
fd90: 50 72 69 6e 74 28 57 68 65 72 65 43 6c 61 75 73  Print(WhereClaus
fda0: 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69  e *pWC){.  int i
fdb0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
fdc0: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  WC->nTerm; i++){
fdd0: 0a 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72  .    whereTermPr
fde0: 69 6e 74 28 26 70 57 43 2d 3e 61 5b 69 5d 2c 20  int(&pWC->a[i], 
fdf0: 69 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  i);.  }.}.#endif
fe00: 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
fe10: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
fe20: 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
fe30: 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
fe40: 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
fe50: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
fe60: 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
fe70: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
fe80: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
fe90: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
fea0: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
feb0: 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  fo;.  int nb = 1
fec0: 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  +(pWInfo->pTabLi
fed0: 73 74 2d 3e 6e 53 72 63 2b 33 29 2f 34 3b 0a 20  st->nSrc+3)/4;. 
fee0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
fef0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57  item *pItem = pW
ff00: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
ff10: 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
ff20: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
ff30: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 42 69 74 6d  em->pTab;.  Bitm
ff40: 61 73 6b 20 6d 41 6c 6c 20 3d 20 28 28 28 42 69  ask mAll = (((Bi
ff50: 74 6d 61 73 6b 29 31 29 3c 3c 28 6e 62 2a 34 29  tmask)1)<<(nb*4)
ff60: 29 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  ) - 1;.  sqlite3
ff70: 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63 25  DebugPrintf("%c%
ff80: 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78  2d.%0*llx.%0*llx
ff90: 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20  ", p->cId,.     
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e  p->iTab, nb, p->
ffc0: 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d  maskSelf, nb, p-
ffd0: 3e 70 72 65 72 65 71 20 26 20 6d 41 6c 6c 29 3b  >prereq & mAll);
ffe0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
fff0: 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20  rintf(" %12s",. 
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61      pItem->zAlia
10020 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s ? pItem->zAlia
10030 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s : pTab->zName)
10040 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
10050 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
10060 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
10070 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10080 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70  zName;.    if( p
10090 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
100a0 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e   && (zName = p->
100b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
100c0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
100d0 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
100e0 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75  Name, "sqlite_au
100f0 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d  toindex_", 17)==
10100 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
10110 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   i = sqlite3Strl
10120 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b  en30(zName) - 1;
10130 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
10140 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20  zName[i]!='_' ) 
10150 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  i--;.        zNa
10160 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d  me += i;.      }
10170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
10180 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36  bugPrintf(".%-16
10190 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70  s %2d", zName, p
101a0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a  ->u.btree.nEq);.
101b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
101c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
101d0 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a  ntf("%20s","");.
101e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
101f0 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
10200 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  if( p->u.vtab.id
10210 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20  xStr ){.      z 
10220 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
10230 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78  f("(%d,\"%s\",%x
10240 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
10250 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
10260 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xNum, p->u.vtab.
10270 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61  idxStr, p->u.vta
10280 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20  b.omitMask);.   
10290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
102a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
102b0 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e  f("(%d,%x)", p->
102c0 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
102d0 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
102e0 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  k);.    }.    sq
102f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
10300 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20  (" %-19s", z);. 
10310 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10320 7a 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  z);.  }.  if( p-
10330 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10340 5f 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20  _SKIPSCAN ){.   
10350 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
10360 6e 74 66 28 22 20 66 20 25 30 35 78 20 25 64 2d  ntf(" f %05x %d-
10370 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
10380 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53   p->nLTerm,p->nS
10390 6b 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  kip);.  }else{. 
103a0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
103b0 72 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e  rintf(" f %05x N
103c0 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73   %d", p->wsFlags
103d0 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20  , p->nLTerm);.  
103e0 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
103f0 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64  Printf(" cost %d
10400 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53  ,%d,%d\n", p->rS
10410 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  etup, p->rRun, p
10420 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70  ->nOut);.  if( p
10430 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c  ->nLTerm && (sql
10440 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
10450 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20   0x100)!=0 ){.  
10460 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
10470 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72  (i=0; i<p->nLTer
10480 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77  m; i++){.      w
10490 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d  hereTermPrint(p-
104a0 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a  >aLTerm[i], i);.
104b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
104c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
104d0 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e  t bulk memory in
104e0 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65  to a valid Where
104f0 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65  Loop that can be
10500 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68   passed.** to wh
10510 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72  ereLoopClear har
10520 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74  mlessly..*/.stat
10530 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
10540 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20  pInit(WhereLoop 
10550 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d  *p){.  p->aLTerm
10560 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63   = p->aLTermSpac
10570 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d  e;.  p->nLTerm =
10580 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20   0;.  p->nLSlot 
10590 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  = ArraySize(p->a
105a0 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70  LTermSpace);.  p
105b0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d  ->wsFlags = 0;.}
105c0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
105d0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e  e WhereLoop.u un
105e0 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72  ion.  Leave Wher
105f0 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74  eLoop.pLTerm int
10600 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  act..*/.static v
10610 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
10620 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20  arUnion(sqlite3 
10630 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
10640 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46  p){.  if( p->wsF
10650 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49  lags & (WHERE_VI
10660 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45  RTUALTABLE|WHERE
10670 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a  _AUTO_INDEX) ){.
10680 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c      if( (p->wsFl
10690 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
106a0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20  UALTABLE)!=0 && 
106b0 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
106c0 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ee ){.      sqli
106d0 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74  te3_free(p->u.vt
106e0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
106f0 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64    p->u.vtab.need
10700 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
10710 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
10720 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
10730 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
10740 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
10750 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62  EX)!=0 && p->u.b
10760 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
10770 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
10780 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62  bFree(db, p->u.b
10790 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f  tree.pIndex->zCo
107a0 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c  lAff);.      sql
107b0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
107c0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
107d0 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  ex);.      p->u.
107e0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
107f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
10800 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
10810 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20  internal memory 
10820 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65 4c  used by a WhereL
10830 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  oop object.*/.st
10840 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
10850 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65 33  oopClear(sqlite3
10860 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
10870 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  *p){.  if( p->aL
10880 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53  Term!=p->aLTermS
10890 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62  pace ) sqlite3Db
108a0 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c  FreeNN(db, p->aL
108b0 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
108c0 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
108d0 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
108e0 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
108f0 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
10900 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
10910 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
10920 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
10930 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
10940 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
10950 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
10960 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
10970 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
10980 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
10990 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
109a0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
109b0 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
109c0 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
109d0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
109e0 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  NN(db, sizeof(p-
109f0 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
10a00 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
10a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10a20 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
10a30 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c  cpy(paNew, p->aL
10a40 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  Term, sizeof(p->
10a50 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c  aLTerm[0])*p->nL
10a60 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Slot);.  if( p->
10a70 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
10a80 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
10a90 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e  DbFreeNN(db, p->
10aa0 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c  aLTerm);.  p->aL
10ab0 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20  Term = paNew;.  
10ac0 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20  p->nLSlot = n;. 
10ad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10ae0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  K;.}../*.** Tran
10af0 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f  sfer content fro
10b00 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f  m the second pLo
10b10 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73  op into the firs
10b20 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
10b30 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73   whereLoopXfer(s
10b40 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
10b50 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72  eLoop *pTo, Wher
10b60 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20  eLoop *pFrom){. 
10b70 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
10b80 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20  nion(db, pTo);. 
10b90 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
10ba0 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46  size(db, pTo, pF
10bb0 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a  rom->nLTerm) ){.
10bc0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d      memset(&pTo-
10bd0 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54  >u, 0, sizeof(pT
10be0 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75  o->u));.    retu
10bf0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
10c00 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  BKPT;.  }.  memc
10c10 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57  py(pTo, pFrom, W
10c20 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53  HERE_LOOP_XFER_S
10c30 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f  Z);.  memcpy(pTo
10c40 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d  ->aLTerm, pFrom-
10c50 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c  >aLTerm, pTo->nL
10c60 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d  Term*sizeof(pTo-
10c70 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20  >aLTerm[0]));.  
10c80 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61  if( pFrom->wsFla
10c90 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
10ca0 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70  ALTABLE ){.    p
10cb0 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  From->u.vtab.nee
10cc0 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dFree = 0;.  }el
10cd0 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77  se if( (pFrom->w
10ce0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
10cf0 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  UTO_INDEX)!=0 ){
10d00 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74  .    pFrom->u.bt
10d10 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
10d20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10d30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10d40 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c   Delete a WhereL
10d50 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  oop object.*/.st
10d60 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
10d70 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65  oopDelete(sqlite
10d80 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
10d90 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f   *p){.  whereLoo
10da0 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20  pClear(db, p);. 
10db0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
10dc0 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
10dd0 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
10de0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
10df0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
10e00 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
10e10 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
10e20 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 6e 74   *pWInfo){.  int
10e30 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   i;.  assert( pW
10e40 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 66 6f 72  Info!=0 );.  for
10e50 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  (i=0; i<pWInfo->
10e60 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
10e70 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
10e80 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
10e90 61 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c  a[i];.    if( pL
10ea0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26 20  evel->pWLoop && 
10eb0 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d  (pLevel->pWLoop-
10ec0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10ed0 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20 20  _IN_ABLE) ){.   
10ee0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10ef0 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  (db, pLevel->u.i
10f00 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  n.aInLoop);.    
10f10 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 57  }.  }.  sqlite3W
10f20 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
10f30 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
10f40 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
10f50 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 57 68  pLoops ){.    Wh
10f60 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49  ereLoop *p = pWI
10f70 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20  nfo->pLoops;.   
10f80 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
10f90 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
10fa0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
10fb0 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ete(db, p);.  }.
10fc0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
10fd0 4e 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 7d  N(db, pWInfo);.}
10fe0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
10ff0 52 55 45 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  RUE if all of th
11000 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
11010 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
11020 29 20 20 58 20 68 61 73 20 74 68 65 20 73 61 6d  )  X has the sam
11030 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20  e or lower cost 
11040 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32 29 20  that Y.**   (2) 
11050 20 58 20 75 73 65 73 20 66 65 77 65 72 20 57 48   X uses fewer WH
11060 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
11070 20 74 68 61 6e 20 59 0a 2a 2a 20 20 20 28 33 29   than Y.**   (3)
11080 20 20 45 76 65 72 79 20 57 48 45 52 45 20 63 6c    Every WHERE cl
11090 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62  ause term used b
110a0 79 20 58 20 69 73 20 61 6c 73 6f 20 75 73 65 64  y X is also used
110b0 20 62 79 20 59 0a 2a 2a 20 20 20 28 34 29 20 20   by Y.**   (4)  
110c0 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74  X skips at least
110d0 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   as many columns
110e0 20 61 73 20 59 0a 2a 2a 20 20 20 28 35 29 20 20   as Y.**   (5)  
110f0 49 66 20 58 20 69 73 20 61 20 63 6f 76 65 72 69  If X is a coveri
11100 6e 67 20 69 6e 64 65 78 2c 20 74 68 61 6e 20 59  ng index, than Y
11110 20 69 73 20 74 6f 6f 0a 2a 2a 0a 2a 2a 20 43 6f   is too.**.** Co
11120 6e 64 69 74 69 6f 6e 73 20 28 32 29 20 61 6e 64  nditions (2) and
11130 20 28 33 29 20 6d 65 61 6e 20 74 68 61 74 20 58   (3) mean that X
11140 20 69 73 20 61 20 22 70 72 6f 70 65 72 20 73 75   is a "proper su
11150 62 73 65 74 22 20 6f 66 20 59 2e 0a 2a 2a 20 49  bset" of Y..** I
11160 66 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  f X is a proper 
11170 73 75 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e  subset of Y then
11180 20 59 20 69 73 20 61 20 62 65 74 74 65 72 20 63   Y is a better c
11190 68 6f 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a  hoice and ought.
111a0 2a 2a 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77  ** to have a low
111b0 65 72 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72  er cost.  This r
111c0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54  outine returns T
111d0 52 55 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f  RUE when that co
111e0 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73  st .** relations
111f0 68 69 70 20 69 73 20 69 6e 76 65 72 74 65 64 20  hip is inverted 
11200 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
11210 61 64 6a 75 73 74 65 64 2e 20 20 43 6f 6e 73 74  adjusted.  Const
11220 72 61 69 6e 74 20 28 34 29 0a 2a 2a 20 77 61 73  raint (4).** was
11230 20 61 64 64 65 64 20 62 65 63 61 75 73 65 20 69   added because i
11240 66 20 58 20 75 73 65 73 20 73 6b 69 70 2d 73 63  f X uses skip-sc
11250 61 6e 20 6c 65 73 73 20 74 68 61 6e 20 59 20 69  an less than Y i
11260 74 20 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a  t still might.**
11270 20 64 65 73 65 72 76 65 20 61 20 6c 6f 77 65 72   deserve a lower
11280 20 63 6f 73 74 20 65 76 65 6e 20 69 66 20 69 74   cost even if it
11290 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
112a0 73 65 74 20 6f 66 20 59 2e 20 20 43 6f 6e 73 74  set of Y.  Const
112b0 72 61 69 6e 74 20 28 35 29 0a 2a 2a 20 77 61 73  raint (5).** was
112c0 20 61 64 64 65 64 20 62 65 63 61 75 73 65 20 61   added because a
112d0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
112e0 70 72 6f 62 61 62 6c 79 20 64 65 73 65 72 76 65  probably deserve
112f0 73 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65  s to have a lowe
11300 72 20 63 6f 73 74 0a 2a 2a 20 74 68 61 6e 20 61  r cost.** than a
11310 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
11320 64 65 78 20 65 76 65 6e 20 69 66 20 69 74 20 69  dex even if it i
11330 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
11340 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
11350 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
11360 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20  rProperSubset(. 
11370 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
11380 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46   *pX,       /* F
11390 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  irst WhereLoop t
113a0 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63  o compare */.  c
113b0 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
113c0 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  pY        /* Com
113d0 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69  pare against thi
113e0 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29  s WhereLoop */.)
113f0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
11400 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70  if( pX->nLTerm-p
11410 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e  X->nSkip >= pY->
11420 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70  nLTerm-pY->nSkip
11430 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
11440 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20  ; /* X is not a 
11450 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20  subset of Y */. 
11460 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b   }.  if( pY->nSk
11470 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29  ip > pX->nSkip )
11480 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
11490 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d   pX->rRun >= pY-
114a0 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28  >rRun ){.    if(
114b0 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e   pX->rRun > pY->
114c0 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  rRun ) return 0;
114d0 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
114e0 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
114f0 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e    if( pX->nOut >
11500 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75   pY->nOut ) retu
11510 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
11520 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
11530 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  */.  }.  for(i=p
11540 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d  X->nLTerm-1; i>=
11550 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
11560 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d   pX->aLTerm[i]==
11570 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
11580 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65    for(j=pY->nLTe
11590 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
115a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d 3e  {.      if( pY->
115b0 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61  aLTerm[j]==pX->a
115c0 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b  LTerm[i] ) break
115d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
115e0 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  j<0 ) return 0; 
115f0 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62 73   /* X not a subs
11600 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74 65  et of Y since te
11610 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64  rm X[i] not used
11620 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69   by Y */.  }.  i
11630 66 28 20 28 70 58 2d 3e 77 73 46 6c 61 67 73 26  f( (pX->wsFlags&
11640 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
11650 3d 30 20 0a 20 20 20 26 26 20 28 70 59 2d 3e 77  =0 .   && (pY->w
11660 73 46 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58  sFlags&WHERE_IDX
11670 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
11680 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
11690 6f 6e 73 74 72 61 69 6e 74 20 28 35 29 20 2a 2f  onstraint (5) */
116a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
116b0 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69    /* All conditi
116c0 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f  ons meet */.}../
116d0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75  *.** Try to adju
116e0 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57  st the cost of W
116f0 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61  hereLoop pTempla
11700 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f  te upwards or do
11710 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68  wnwards so.** th
11720 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  at:.**.**   (1) 
11730 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
11740 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74  less than any ot
11750 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74  her WhereLoops t
11760 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72  hat are a proper
11770 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74  .**       subset
11780 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a   of pTemplate.**
11790 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c  .**   (2) pTempl
117a0 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  ate costs more t
117b0 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
117c0 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69  ereLoops for whi
117d0 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20  ch pTemplate.** 
117e0 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65        is a prope
117f0 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  r subset..**.** 
11800 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f  To say "WhereLoo
11810 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  p X is a proper 
11820 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61  subset of Y" mea
11830 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66  ns that X uses f
11840 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c  ewer.** WHERE cl
11850 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20  ause terms than 
11860 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
11870 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
11880 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a  rm used by X is.
11890 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20  ** also used by 
118a0 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  Y..*/.static voi
118b0 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73  d whereLoopAdjus
118c0 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72  tCost(const Wher
118d0 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c  eLoop *p, WhereL
118e0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
118f0 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
11900 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
11910 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
11920 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b   return;.  for(;
11930 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
11940 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  op){.    if( p->
11950 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
11960 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  >iTab ) continue
11970 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  ;.    if( (p->ws
11980 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
11990 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74  DEXED)==0 ) cont
119a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68  inue;.    if( wh
119b0 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
119c0 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54  operSubset(p, pT
119d0 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  emplate) ){.    
119e0 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
119f0 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77  plate cost downw
11a00 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  ard so that it i
11a10 73 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69  s cheaper than i
11a20 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62  ts .      ** sub
11a30 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20  set p. */.      
11a40 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c  WHERETRACE(0x80,
11a50 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64  ("subset cost ad
11a60 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74  justment %d,%d t
11a70 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  o %d,%d\n",.    
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
11aa0 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  un, pTemplate->n
11ab0 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  Out, p->rRun, p-
11ac0 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20 20  >nOut-1));.     
11ad0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
11ae0 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
11af0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
11b00 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b  t = p->nOut - 1;
11b10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
11b20 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50  hereLoopCheaperP
11b30 72 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d  roperSubset(pTem
11b40 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20  plate, p) ){.   
11b50 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65     /* Adjust pTe
11b60 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61  mplate cost upwa
11b70 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
11b80 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70   costlier than p
11b90 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20   since.      ** 
11ba0 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70  pTemplate is a p
11bb0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
11bc0 70 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  p */.      WHERE
11bd0 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62  TRACE(0x80,("sub
11be0 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  set cost adjustm
11bf0 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c  ent %d,%d to %d,
11c00 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
11c20 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70  emplate->rRun, p
11c30 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20  Template->nOut, 
11c40 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
11c50 2b 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d  +1));.      pTem
11c60 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
11c70 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
11c80 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
11c90 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20  ->nOut + 1;.    
11ca0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
11cb0 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f  earch the list o
11cc0 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20  f WhereLoops in 
11cd0 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20  *ppPrev looking 
11ce0 66 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e  for one that can
11cf0 20 62 65 0a 2a 2a 20 72 65 70 6c 61 63 65 64 20   be.** replaced 
11d00 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a  by pTemplate..**
11d10 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
11d20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65  if pTemplate doe
11d30 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20  s not belong on 
11d40 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
11d50 73 74 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  st..** In other 
11d60 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61  words if pTempla
11d70 74 65 20 6f 75 67 68 74 20 74 6f 20 62 65 20 64  te ought to be d
11d80 72 6f 70 70 65 64 20 66 72 6f 6d 20 66 75 72 74  ropped from furt
11d90 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  her consideratio
11da0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69  n..**.** If pX i
11db0 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  s a WhereLoop th
11dc0 61 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  at pTemplate can
11dd0 20 72 65 70 6c 61 63 65 2c 20 74 68 65 6e 20 72   replace, then r
11de0 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e  eturn the.** lin
11df0 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  k that points to
11e00 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54   pX..**.** If pT
11e10 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 72  emplate cannot r
11e20 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
11e30 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ing element of t
11e40 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64  he list but need
11e50 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64  s.** to be added
11e60 20 74 6f 20 74 68 65 20 6c 69 73 74 20 61 73 20   to the list as 
11e70 61 20 6e 65 77 20 65 6e 74 72 79 2c 20 74 68 65  a new entry, the
11e80 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
11e90 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 69  er to the.** tai
11ea0 6c 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  l of the list..*
11eb0 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f  /.static WhereLo
11ec0 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69  op **whereLoopFi
11ed0 6e 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72  ndLesser(.  Wher
11ee0 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a  eLoop **ppPrev,.
11ef0 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
11f00 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a  p *pTemplate.){.
11f10 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
11f20 20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76    for(p=(*ppPrev
11f30 29 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d  ); p; ppPrev=&p-
11f40 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70  >pNextLoop, p=*p
11f50 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20  pPrev){.    if( 
11f60 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61  p->iTab!=pTempla
11f70 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69  te->iTab || p->i
11f80 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61  SortIdx!=pTempla
11f90 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a  te->iSortIdx ){.
11fa0 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68        /* If eith
11fb0 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69  er the iTab or i
11fc0 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66  SortIdx values f
11fd0 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70  or two WhereLoop
11fe0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20   are different. 
11ff0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f       ** then tho
12000 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  se WhereLoops ne
12010 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
12020 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  red separately. 
12030 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20   Neither is.    
12040 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65    ** a candidate
12050 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20   to replace the 
12060 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  other. */.      
12070 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
12080 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75      /* In the cu
12090 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
120a0 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70  tion, the rSetup
120b0 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
120c0 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20   zero.    ** or 
120d0 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c  the cost of buil
120e0 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ding an automati
120f0 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20  c index (NlogN) 
12100 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20  and the NlogN.  
12110 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
12120 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20   for compatible 
12130 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20  WhereLoops. */. 
12140 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
12150 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70  etup==0 || pTemp
12160 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20  late->rSetup==0 
12170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12180 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d    || p->rSetup==
12190 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
121a0 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65  p );..    /* whe
121b0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29  reLoopAddBtree()
121c0 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65   always generate
121d0 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68  s and inserts th
121e0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
121f0 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69  x.    ** case fi
12200 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70  rst.  Hence comp
12210 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65  atible candidate
12220 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65   WhereLoops neve
12230 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a  r have a larger.
12240 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43      ** rSetup. C
12250 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49  all this SETUP-I
12260 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20  NVARIANT */.    
12270 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
12280 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
12290 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
122a0 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61  Any loop using a
122b0 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66  n appliation-def
122c0 69 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50  ined index (or P
122d0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20  RIMARY KEY or.  
122e0 20 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73    ** UNIQUE cons
122f0 74 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65  traint) with one
12300 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73   or more == cons
12310 74 72 61 69 6e 74 73 20 69 73 20 62 65 74 74 65  traints is bette
12320 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e  r.    ** than an
12330 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
12340 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 61  . Unless it is a
12350 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20   skip-scan. */. 
12360 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
12370 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
12380 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20 26  INDEX)!=0.     &
12390 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53  & (pTemplate->nS
123a0 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  kip)==0.     && 
123b0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
123c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
123d0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 26 26 20  XED)!=0.     && 
123e0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
123f0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
12400 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 26  MN_EQ)!=0.     &
12410 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
12420 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
12430 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
12440 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20 20 20  ereq.    ){.    
12450 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
12460 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74 69      /* If existi
12470 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  ng WhereLoop p i
12480 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54  s better than pT
12490 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61  emplate, pTempla
124a0 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a  te can be.    **
124b0 20 64 69 73 63 61 72 64 65 64 2e 20 20 57 68 65   discarded.  Whe
124c0 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
124d0 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20  er if:.    **   
124e0 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f  (1)  p has no mo
124f0 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  re dependencies 
12500 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
12510 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
12520 20 20 70 20 68 61 73 20 61 6e 20 65 71 75 61 6c    p has an equal
12530 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
12540 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  han pTemplate.  
12550 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
12560 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
12570 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d  ate->prereq)==p-
12580 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28 31  >prereq    /* (1
12590 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
125a0 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61  >rSetup<=pTempla
125b0 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20 20  te->rSetup      
125c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
125d0 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
125e0 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74  ->rRun<=pTemplat
125f0 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20  e->rRun         
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12610 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2b) */.     && 
12620 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61  p->nOut<=pTempla
12630 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20  te->nOut        
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12650 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2c) */.    ){.
12660 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
12670 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65 6d   /* Discard pTem
12680 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a  plate */.    }..
12690 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c      /* If pTempl
126a0 61 74 65 20 69 73 20 61 6c 77 61 79 73 20 62 65  ate is always be
126b0 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68 65  tter than p, the
126c0 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62 65 20  n cause p to be 
126d0 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20 20  overwritten.    
126e0 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ** with pTemplat
126f0 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  e.  pTemplate is
12700 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 20 69   better than p i
12710 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20  f:.    **   (1) 
12720 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 6e   pTemplate has n
12730 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
12740 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20  es than p, and. 
12750 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54 65     **   (2)  pTe
12760 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65 71  mplate has an eq
12770 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
12780 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f  t than p..    */
12790 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
127a0 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
127b0 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c  >prereq)==pTempl
127c0 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a  ate->prereq   /*
127d0 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
127e0 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c   p->rRun>=pTempl
127f0 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20  ate->rRun       
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
12820 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
12830 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  >=pTemplate->nOu
12840 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12860 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2b) */.    ){.
12870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
12880 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
12890 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a  te->rSetup ); /*
128a0 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
128b0 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20   above */.      
128c0 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73  break;   /* Caus
128d0 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
128e0 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c 61  itten by pTempla
128f0 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  te */.    }.  }.
12900 20 20 72 65 74 75 72 6e 20 70 70 50 72 65 76 3b    return ppPrev;
12910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
12920 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68   or replace a Wh
12930 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73  ereLoop entry us
12940 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65  ing the template
12950 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a   supplied..**.**
12960 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   An existing Whe
12970 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67  reLoop entry mig
12980 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ht be overwritte
12990 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d  n if the new tem
129a0 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74  plate.** is bett
129b0 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72  er and has fewer
129c0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20   dependencies.  
129d0 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  Or the template 
129e0 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a  will be ignored.
129f0 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74  ** and no insert
12a00 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61   will occur if a
12a10 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
12a20 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61  Loop is faster a
12a30 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20  nd has.** fewer 
12a40 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
12a50 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20  n the template. 
12a60 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77   Otherwise a new
12a70 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a   WhereLoop is.**
12a80 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20   added based on 
12a90 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a  the template..**
12aa0 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d  .** If pBuilder-
12ab0 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e  >pOrSet is not N
12ac0 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72 65  ULL then we care
12ad0 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a   about only the.
12ae0 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ** prerequisites
12af0 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f   and rRun and nO
12b00 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20  ut costs of the 
12b10 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54  N best loops.  T
12b20 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  hat.** informati
12b30 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69  on is gathered i
12b40 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e  n the pBuilder->
12b50 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  pOrSet object.  
12b60 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20  This special.** 
12b70 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20  processing mode 
12b80 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72  is used only for
12b90 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
12ba0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ssing..**.** Whe
12bb0 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d  n accumulating m
12bc0 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77  ultiple loops (w
12bd0 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  hen pBuilder->pO
12be0 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65  rSet is NULL) we
12bf0 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20  .** still might 
12c00 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61  overwrite simila
12c10 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65  r loops with the
12c20 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66   new template if
12c30 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70   the.** new temp
12c40 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
12c50 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
12c60 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
12c70 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
12c80 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
12c90 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
12ca0 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
12cb0 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
12cc0 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
12cd0 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
12ce0 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
12cf0 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
12d00 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
12d10 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
12d20 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
12d30 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
12d40 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
12d50 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
12d60 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
12d70 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69  nt loop.*/.stati
12d80 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49  c int whereLoopI
12d90 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42  nsert(WhereLoopB
12da0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
12db0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
12dc0 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65  mplate){.  Where
12dd0 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a  Loop **ppPrev, *
12de0 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p;.  WhereInfo *
12df0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
12e00 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c  r->pWInfo;.  sql
12e10 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
12e20 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
12e30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 53   int rc;..  /* S
12e40 74 6f 70 20 74 68 65 20 73 65 61 72 63 68 20 6f  top the search o
12e50 6e 63 65 20 77 65 20 68 69 74 20 74 68 65 20 71  nce we hit the q
12e60 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 73 65 61  uery planner sea
12e70 72 63 68 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 69  rch limit */.  i
12e80 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 69 50 6c  f( pBuilder->iPl
12e90 61 6e 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  anLimit==0 ){.  
12ea0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
12eb0 66 66 66 66 66 66 66 2c 28 22 3d 3d 3d 20 71 75  fffffff,("=== qu
12ec0 65 72 79 20 70 6c 61 6e 6e 65 72 20 73 65 61 72  ery planner sear
12ed0 63 68 20 6c 69 6d 69 74 20 72 65 61 63 68 65 64  ch limit reached
12ee0 20 3d 3d 3d 5c 6e 22 29 29 3b 0a 20 20 20 20 69   ===\n"));.    i
12ef0 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  f( pBuilder->pOr
12f00 53 65 74 20 29 20 70 42 75 69 6c 64 65 72 2d 3e  Set ) pBuilder->
12f10 70 4f 72 53 65 74 2d 3e 6e 20 3d 20 30 3b 0a 20  pOrSet->n = 0;. 
12f20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12f30 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 70 42 75  _DONE;.  }.  pBu
12f40 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69  ilder->iPlanLimi
12f50 74 2d 2d 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42  t--;..  /* If pB
12f60 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
12f70 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
12f80 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20  only keep track 
12f90 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a  of the costs.  *
12fa0 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20  * and prereqs.. 
12fb0 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64   */.  if( pBuild
12fc0 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b  er->pOrSet!=0 ){
12fd0 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61  .    if( pTempla
12fe0 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69  te->nLTerm ){.#i
12ff0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
13000 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e  BLED.      u16 n
13010 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   = pBuilder->pOr
13020 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e  Set->n;.      in
13030 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20  t x =.#endif.   
13040 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
13050 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  (pBuilder->pOrSe
13060 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  t, pTemplate->pr
13070 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d  ereq, pTemplate-
13080 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20  >rRun,.         
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130a0 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
130b0 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  late->nOut);.#if
130c0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
130d0 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
130e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
130f0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
13100 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13110 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f  e3DebugPrintf(x?
13120 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20  "   or-%d:  ":" 
13130 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a    or-X:  ", n);.
13140 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
13150 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
13160 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
13170 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13180 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
13190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
131a0 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..  /* Look for 
131b0 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
131c0 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65  eLoop to replace
131d0 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a   with pTemplate.
131e0 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70    */.  whereLoop
131f0 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66  AdjustCost(pWInf
13200 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
13210 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20  late);.  ppPrev 
13220 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
13230 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70  esser(&pWInfo->p
13240 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
13250 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76  );..  if( ppPrev
13260 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
13270 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
13280 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ts a WhereLoop o
13290 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  n the list that 
132a0 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
132b0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
132c0 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20   so just ignore 
132d0 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66  pTemplate */.#if
132e0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
132f0 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
13300 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
13310 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
13320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
13330 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b  bugPrintf("   sk
13340 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ip: ");.      wh
13350 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
13360 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
13370 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
13380 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
13390 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d  SQLITE_OK;  .  }
133a0 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70  else{.    p = *p
133b0 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pPrev;.  }..  /*
133c0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
133d0 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73  s point it means
133e0 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d   that either p[]
133f0 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77   should be overw
13400 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68  ritten.  ** with
13410 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20   pTemplate[] if 
13420 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69  p[] exists, or i
13430 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61  f p==NULL then a
13440 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20  llocate a new.  
13450 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64  ** WhereLoop and
13460 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f   insert it..  */
13470 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
13480 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
13490 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  /.  if( sqlite3W
134a0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
134b0 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20  ){.    if( p!=0 
134c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
134d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65 70  DebugPrintf("rep
134e0 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20  lace: ");.      
134f0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
13500 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
13510 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
13520 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 77  ebugPrintf("   w
13530 69 74 68 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c  ith: ");.    }el
13540 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
13550 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
13560 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 7d    add: ");.    }
13570 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
13580 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
13590 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
135a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
135b0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  p==0 ){.    /* A
135c0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
135d0 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74  ereLoop to add t
135e0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
135f0 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70   list */.    *pp
13600 50 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74  Prev = p = sqlit
13610 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
13620 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  db, sizeof(Where
13630 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  Loop));.    if( 
13640 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
13650 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
13660 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  .    whereLoopIn
13670 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e  it(p);.    p->pN
13680 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d  extLoop = 0;.  }
13690 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20  else{.    /* We 
136a0 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
136b0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b  ing WhereLoop p[
136c0 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65 20 77  ].  But before w
136d0 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20  e do, first.    
136e0 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68  ** go through th
136f0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69  e rest of the li
13700 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e  st and delete an
13710 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20  y other entries 
13720 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70  besides.    ** p
13730 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  [] that are also
13740 20 73 75 70 70 6c 61 74 65 64 20 62 79 20 70 54   supplated by pT
13750 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57  emplate */.    W
13760 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69  hereLoop **ppTai
13770 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f  l = &p->pNextLoo
13780 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  p;.    WhereLoop
13790 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68   *pToDel;.    wh
137a0 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a  ile( *ppTail ){.
137b0 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77        ppTail = w
137c0 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
137d0 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70  er(ppTail, pTemp
137e0 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  late);.      if(
137f0 20 70 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65   ppTail==0 ) bre
13800 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c  ak;.      pToDel
13810 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20   = *ppTail;.    
13820 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20    if( pToDel==0 
13830 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a  ) break;.      *
13840 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d  ppTail = pToDel-
13850 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20  >pNextLoop;.#if 
13860 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
13870 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
13880 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
13890 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
138a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
138b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 64  3DebugPrintf(" d
138c0 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20  elete: ");.     
138d0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
138e0 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64  t(pToDel, pBuild
138f0 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
13900 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77  }.#endif.      w
13910 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
13920 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20  b, pToDel);.    
13930 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65  }.  }.  rc = whe
13940 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
13950 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
13960 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
13970 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
13980 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
13990 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
139a0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
139b0 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
139c0 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
139d0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
139e0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
139f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
13a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13a10 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
13a20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76  WhereLoop.nOut v
13a30 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f  alue downward to
13a40 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72   account for ter
13a50 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45  ms of the.** WHE
13a60 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72  RE clause that r
13a70 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f  eference the loo
13a80 70 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20  p but which are 
13a90 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a  not used by an.*
13aa0 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f  * index..*.** Fo
13ab0 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  r every WHERE cl
13ac0 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69  ause term that i
13ad0 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  s not used by th
13ae0 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77  e index.** and w
13af0 68 69 63 68 20 68 61 73 20 61 20 74 72 75 74 68  hich has a truth
13b00 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73 73   probability ass
13b10 69 67 6e 65 64 20 62 79 20 6f 6e 65 20 6f 66 20  igned by one of 
13b20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  the likelihood()
13b30 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f  ,.** likely(), o
13b40 72 20 75 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c  r unlikely() SQL
13b50 20 66 75 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75   functions, redu
13b60 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ce the estimated
13b70 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75   number.** of ou
13b80 74 70 75 74 20 72 6f 77 73 20 62 79 20 74 68 65  tput rows by the
13b90 20 70 72 6f 62 61 62 69 6c 69 74 79 20 73 70 65   probability spe
13ba0 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55  cified..**.** TU
13bb0 4e 49 4e 47 3a 20 20 46 6f 72 20 65 76 65 72 79  NING:  For every
13bc0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
13bd0 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75  rm that is not u
13be0 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  sed by the index
13bf0 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 64 6f  .** and which do
13c00 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 61  es not have an a
13c10 73 73 69 67 6e 65 64 20 74 72 75 74 68 20 70 72  ssigned truth pr
13c20 6f 62 61 62 69 6c 69 74 79 2c 20 68 65 75 72 69  obability, heuri
13c30 73 74 69 63 73 0a 2a 2a 20 64 65 73 63 72 69 62  stics.** describ
13c40 65 64 20 62 65 6c 6f 77 20 61 72 65 20 75 73 65  ed below are use
13c50 64 20 74 6f 20 74 72 79 20 74 6f 20 65 73 74 69  d to try to esti
13c60 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
13c70 72 6f 62 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54  robability..** T
13c80 4f 44 4f 20 2d 2d 3e 20 50 65 72 68 61 70 73 20  ODO --> Perhaps 
13c90 74 68 69 73 20 69 73 20 73 6f 6d 65 74 68 69 6e  this is somethin
13ca0 67 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20  g that could be 
13cb0 69 6d 70 72 6f 76 65 64 20 62 79 20 62 65 74 74  improved by bett
13cc0 65 72 0a 2a 2a 20 74 61 62 6c 65 20 73 74 61 74  er.** table stat
13cd0 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65  istics..**.** He
13ce0 75 72 69 73 74 69 63 20 31 3a 20 20 45 73 74 69  uristic 1:  Esti
13cf0 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
13d00 72 6f 62 61 62 69 6c 69 74 79 20 61 73 20 39 33  robability as 93
13d10 2e 37 35 25 2e 20 20 54 68 65 20 39 33 2e 37 35  .75%.  The 93.75
13d20 25 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 72 72 65  %.** value corre
13d30 73 70 6f 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20  sponds to -1 in 
13d40 4c 6f 67 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c  LogEst notation,
13d50 20 73 6f 20 74 68 69 73 20 6d 65 61 6e 73 20 64   so this means d
13d60 65 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20  ecrement.** the 
13d70 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66  WhereLoop.nOut f
13d80 69 65 6c 64 20 66 6f 72 20 65 76 65 72 79 20 73  ield for every s
13d90 75 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  uch WHERE clause
13da0 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75   term..**.** Heu
13db0 72 69 73 74 69 63 20 32 3a 20 20 49 66 20 74 68  ristic 2:  If th
13dc0 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f  ere exists one o
13dd0 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61  r more WHERE cla
13de0 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
13df0 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50  .** form "x==EXP
13e00 52 22 20 61 6e 64 20 45 58 50 52 20 69 73 20 6e  R" and EXPR is n
13e10 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 20  ot a constant 0 
13e20 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20  or 1, then make 
13e30 73 75 72 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61  sure the.** fina
13e40 6c 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74  l output row est
13e50 69 6d 61 74 65 20 69 73 20 6e 6f 20 67 72 65 61  imate is no grea
13e60 74 65 72 20 74 68 61 6e 20 31 2f 34 20 6f 66 20  ter than 1/4 of 
13e70 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
13e80 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  .** of rows in t
13e90 68 65 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  he table.  In ot
13ea0 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
13eb0 65 20 74 68 61 74 20 78 3d 3d 45 58 50 52 20 77  e that x==EXPR w
13ec0 69 6c 6c 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75  ill filter.** ou
13ed0 74 20 61 74 20 6c 65 61 73 74 20 33 20 6f 75 74  t at least 3 out
13ee0 20 6f 66 20 34 20 72 6f 77 73 2e 20 20 49 66 20   of 4 rows.  If 
13ef0 45 58 50 52 20 69 73 20 2d 31 20 6f 72 20 30 20  EXPR is -1 or 0 
13f00 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 79 62 65  or 1, then maybe
13f10 20 74 68 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75   the.** "x" colu
13f20 6d 6e 20 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72  mn is boolean or
13f30 20 65 6c 73 65 20 2d 31 20 6f 72 20 30 20 6f 72   else -1 or 0 or
13f40 20 31 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64   1 is a common d
13f50 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20  efault value.** 
13f60 6f 6e 20 74 68 65 20 22 78 22 20 63 6f 6c 75 6d  on the "x" colum
13f70 6e 20 61 6e 64 20 73 6f 20 69 6e 20 74 68 61 74  n and so in that
13f80 20 63 61 73 65 20 6f 6e 6c 79 20 63 61 70 20 74   case only cap t
13f90 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73  he output row es
13fa0 74 69 6d 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32  timate.** at 1/2
13fb0 20 69 6e 73 74 65 61 64 20 6f 66 20 31 2f 34 2e   instead of 1/4.
13fc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13fd0 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
13fe0 64 6a 75 73 74 28 0a 20 20 57 68 65 72 65 43 6c  djust(.  WhereCl
13ff0 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
14000 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
14010 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  use */.  WhereLo
14020 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20  op *pLoop,      
14030 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61  /* The loop to a
14040 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64 20 2a  djust downward *
14050 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20  /.  LogEst nRow 
14060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14070 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
14080 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
14090 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
140a0 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a  rm *pTerm, *pX;.
140b0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c    Bitmask notAll
140c0 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e  owed = ~(pLoop->
140d0 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61  prereq|pLoop->ma
140e0 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69  skSelf);.  int i
140f0 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74  , j, k;.  LogEst
14100 20 69 52 65 64 75 63 65 20 3d 20 30 3b 20 20 20   iReduce = 0;   
14110 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20   /* pLoop->nOut 
14120 73 68 6f 75 6c 64 20 6e 6f 74 20 65 78 63 65 65  should not excee
14130 64 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 2a  d nRow-iReduce *
14140 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c  /..  assert( (pL
14150 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
14160 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
14170 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ==0 );.  for(i=p
14180 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d  WC->nTerm, pTerm
14190 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  =pWC->a; i>0; i-
141a0 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
141b0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
141c0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
141d0 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  UAL)!=0 ) break;
141e0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
141f0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
14200 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30  op->maskSelf)==0
14210 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14220 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
14230 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f  reqAll & notAllo
14240 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  wed)!=0 ) contin
14250 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ue;.    for(j=pL
14260 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  oop->nLTerm-1; j
14270 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
14280 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54   pX = pLoop->aLT
14290 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
142a0 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ( pX==0 ) contin
142b0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ue;.      if( pX
142c0 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
142d0 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69  .      if( pX->i
142e0 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70  Parent>=0 && (&p
142f0 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e  WC->a[pX->iParen
14300 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65  t])==pTerm ) bre
14310 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14320 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ( j<0 ){.      i
14330 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
14340 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
14350 20 20 2f 2a 20 49 66 20 61 20 74 72 75 74 68 20    /* If a truth 
14360 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73 20 73  probability is s
14370 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 74  pecified using t
14380 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  he likelihood() 
14390 68 69 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a  hints,.        *
143a0 2a 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 70  * then use the p
143b0 72 6f 62 61 62 69 6c 69 74 79 20 70 72 6f 76 69  robability provi
143c0 64 65 64 20 62 79 20 74 68 65 20 61 70 70 6c 69  ded by the appli
143d0 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
143e0 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b     pLoop->nOut +
143f0 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
14400 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ob;.      }else{
14410 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
14420 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 65 78  he absence of ex
14430 70 6c 69 63 69 74 20 74 72 75 74 68 20 70 72 6f  plicit truth pro
14440 62 61 62 69 6c 69 74 69 65 73 2c 20 75 73 65 20  babilities, use 
14450 68 65 75 72 69 73 74 69 63 73 20 74 6f 0a 20 20  heuristics to.  
14460 20 20 20 20 20 20 2a 2a 20 67 75 65 73 73 20 61        ** guess a
14470 20 72 65 61 73 6f 6e 61 62 6c 65 20 74 72 75 74   reasonable trut
14480 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a  h probability. *
14490 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  /.        pLoop-
144a0 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20  >nOut--;.       
144b0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
144c0 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f  rator&(WO_EQ|WO_
144d0 49 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IS) ){.         
144e0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
144f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
14500 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
14510 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14520 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pExpr->op==TK_I
14530 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  S );.          i
14540 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
14550 49 6e 74 65 67 65 72 28 70 52 69 67 68 74 2c 20  Integer(pRight, 
14560 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26  &k) && k>=(-1) &
14570 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20  & k<=1 ){.      
14580 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20        k = 10;.  
14590 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
145a0 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32             k = 2
145b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
145c0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 65           if( iRe
145d0 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65  duce<k ) iReduce
145e0 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = k;.        }.
145f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14600 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  }.  if( pLoop->n
14610 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75  Out > nRow-iRedu
14620 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  ce )  pLoop->nOu
14630 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75  t = nRow - iRedu
14640 63 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65  ce;.}../* .** Te
14650 72 6d 20 70 54 65 72 6d 20 69 73 20 61 20 76 65  rm pTerm is a ve
14660 63 74 6f 72 20 72 61 6e 67 65 20 63 6f 6d 70 61  ctor range compa
14670 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  rison operation.
14680 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61   The first compa
14690 72 69 73 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  rison.** in the 
146a0 76 65 63 74 6f 72 20 63 61 6e 20 62 65 20 6f 70  vector can be op
146b0 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 63 6f  timized using co
146c0 6c 75 6d 6e 20 6e 45 71 20 6f 66 20 74 68 65 20  lumn nEq of the 
146d0 69 6e 64 65 78 2e 20 54 68 69 73 0a 2a 2a 20 66  index. This.** f
146e0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
146f0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
14700 20 6f 66 20 76 65 63 74 6f 72 20 65 6c 65 6d 65   of vector eleme
14710 6e 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  nts that can be 
14720 75 73 65 64 0a 2a 2a 20 61 73 20 70 61 72 74 20  used.** as part 
14730 6f 66 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6d  of the range com
14740 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  parison..**.** F
14750 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
14760 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
14770 2a 2a 20 20 20 57 48 45 52 45 20 61 20 3d 20 3f  **   WHERE a = ?
14780 20 41 4e 44 20 28 62 2c 20 63 2c 20 64 29 20 3e   AND (b, c, d) >
14790 20 28 3f 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a   (?, ?, ?).**.**
147a0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 3a 0a   and the index:.
147b0 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
147c0 4e 44 45 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20  NDEX ... ON (a, 
147d0 62 2c 20 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a  b, c, d, e).**.*
147e0 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
147f0 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 69 6e  tion would be in
14800 76 6f 6b 65 64 20 77 69 74 68 20 6e 45 71 3d 31  voked with nEq=1
14810 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
14820 72 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20  rned in.** this 
14830 63 61 73 65 20 69 73 20 33 2e 0a 2a 2f 0a 73 74  case is 3..*/.st
14840 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
14850 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20  ngeVectorLen(.  
14860 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
14870 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
14880 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
14890 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
148a0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
148b0 20 6f 6e 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e   on pIdx */.  In
148c0 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
148d0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
148e0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  to be used for a
148f0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
14900 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  traint */.  int 
14910 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  nEq,            
14920 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72   /* Number of pr
14930 69 6f 72 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ior equality con
14940 73 74 72 61 69 6e 74 73 20 6f 6e 20 73 61 6d 65  straints on same
14950 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
14960 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20  eTerm *pTerm    
14970 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 20 69   /* The vector i
14980 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
14990 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  aint */.){.  int
149a0 20 6e 43 6d 70 20 3d 20 73 71 6c 69 74 65 33 45   nCmp = sqlite3E
149b0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 54  xprVectorSize(pT
149c0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
149d0 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  t);.  int i;..  
149e0 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c  nCmp = MIN(nCmp,
149f0 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20   (pIdx->nColumn 
14a00 2d 20 6e 45 71 29 29 3b 0a 20 20 66 6f 72 28 69  - nEq));.  for(i
14a10 3d 31 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29  =1; i<nCmp; i++)
14a20 7b 0a 20 20 20 20 2f 2a 20 54 65 73 74 20 69 66  {.    /* Test if
14a30 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66   comparison i of
14a40 20 70 54 65 72 6d 20 69 73 20 63 6f 6d 70 61 74   pTerm is compat
14a50 69 62 6c 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e  ible with column
14a60 20 28 69 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a   (i+nEq) .    **
14a70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49   of the index. I
14a80 66 20 6e 6f 74 2c 20 65 78 69 74 20 74 68 65 20  f not, exit the 
14a90 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68  loop.  */.    ch
14aa0 61 72 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  ar aff;         
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14ac0 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69  omparison affini
14ad0 74 79 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 69  ty */.    char i
14ae0 64 78 61 66 66 20 3d 20 30 3b 20 20 20 20 20 20  dxaff = 0;      
14af0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
14b00 65 64 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  ed columns affin
14b10 69 74 79 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  ity */.    CollS
14b20 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
14b30 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
14b40 61 72 69 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e  arison collation
14b50 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20   sequence */.   
14b60 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 70 54   Expr *pLhs = pT
14b70 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
14b80 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  t->x.pList->a[i]
14b90 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  .pExpr;.    Expr
14ba0 20 2a 70 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e   *pRhs = pTerm->
14bb0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
14bc0 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61     if( pRhs->fla
14bd0 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
14be0 74 20 29 7b 0a 20 20 20 20 20 20 70 52 68 73 20  t ){.      pRhs 
14bf0 3d 20 70 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63  = pRhs->x.pSelec
14c00 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
14c10 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
14c20 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70  {.      pRhs = p
14c30 52 68 73 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  Rhs->x.pList->a[
14c40 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a  i].pExpr;.    }.
14c50 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
14c60 61 74 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  at the LHS of th
14c70 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
14c80 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  a column referen
14c90 63 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ce to.    ** the
14ca0 20 72 69 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66   right column of
14cb0 20 74 68 65 20 72 69 67 68 74 20 73 6f 75 72 63   the right sourc
14cc0 65 20 74 61 62 6c 65 2e 20 41 6e 64 20 74 68 61  e table. And tha
14cd0 74 20 74 68 65 20 73 6f 72 74 0a 20 20 20 20 2a  t the sort.    *
14ce0 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 69  * order of the i
14cf0 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 73 20 74  ndex column is t
14d00 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
14d10 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65  ort order of the
14d20 0a 20 20 20 20 2a 2a 20 6c 65 66 74 6d 6f 73 74  .    ** leftmost
14d30 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 2e 20 20   index column.  
14d40 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d  */.    if( pLhs-
14d50 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a  >op!=TK_COLUMN .
14d60 20 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 54       || pLhs->iT
14d70 61 62 6c 65 21 3d 69 43 75 72 20 0a 20 20 20 20  able!=iCur .    
14d80 20 7c 7c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d   || pLhs->iColum
14d90 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n!=pIdx->aiColum
14da0 6e 5b 69 2b 6e 45 71 5d 20 0a 20 20 20 20 20 7c  n[i+nEq] .     |
14db0 7c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  | pIdx->aSortOrd
14dc0 65 72 5b 69 2b 6e 45 71 5d 21 3d 70 49 64 78 2d  er[i+nEq]!=pIdx-
14dd0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
14de0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
14df0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
14e00 74 65 73 74 63 61 73 65 28 20 70 4c 68 73 2d 3e  testcase( pLhs->
14e10 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
14e20 44 20 29 3b 0a 20 20 20 20 61 66 66 20 3d 20 73  D );.    aff = s
14e30 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
14e40 69 6e 69 74 79 28 70 52 68 73 2c 20 73 71 6c 69  inity(pRhs, sqli
14e50 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
14e60 70 4c 68 73 29 29 3b 0a 20 20 20 20 69 64 78 61  pLhs));.    idxa
14e70 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  ff = sqlite3Tabl
14e80 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
14e90 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 4c  pIdx->pTable, pL
14ea0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  hs->iColumn);.  
14eb0 20 20 69 66 28 20 61 66 66 21 3d 69 64 78 61 66    if( aff!=idxaf
14ec0 66 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  f ) break;..    
14ed0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
14ee0 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
14ef0 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73  Seq(pParse, pLhs
14f00 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28  , pRhs);.    if(
14f10 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 62 72 65 61   pColl==0 ) brea
14f20 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  k;.    if( sqlit
14f30 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
14f40 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
14f50 43 6f 6c 6c 5b 69 2b 6e 45 71 5d 29 20 29 20 62  Coll[i+nEq]) ) b
14f60 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
14f70 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn i;.}../*.** A
14f80 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 43  djust the cost C
14f90 20 62 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74   by the costMult
14fa0 20 66 61 63 74 65 72 20 54 2e 20 20 54 68 69 73   facter T.  This
14fb0 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a   only occurs if.
14fc0 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  ** compiled with
14fd0 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45   -DSQLITE_ENABLE
14fe0 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66  _COSTMULT.*/.#if
14ff0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15000 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66  E_COSTMULT.# def
15010 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
15020 74 69 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20  tiplier(C,T)  C 
15030 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66  += T.#else.# def
15040 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
15050 74 69 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e  tiplier(C,T).#en
15060 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61  dif../*.** We ha
15070 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
15080 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
15090 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
150a0 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69  rms of the .** i
150b0 6e 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79  ndex pIndex. Try
150c0 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f   to match one mo
150d0 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  re..**.** When t
150e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
150f0 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72  called, pBuilder
15100 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e  ->pNew->nOut con
15110 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75  tains the .** nu
15120 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
15130 65 63 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  ected to be visi
15140 74 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67  ted by filtering
15150 20 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a   using the nEq .
15160 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49  ** terms only. I
15170 66 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64  f it is modified
15180 2c 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  , this value is 
15190 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20  restored before 
151a0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
151b0 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
151c0 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d   If pProbe->tnum
151d0 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
151e0 70 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65  pIndex is a fake
151f0 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20   index used for 
15200 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
15210 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73  RIMARY KEY..*/.s
15220 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
15230 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
15240 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
15250 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
15260 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
15270 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a  Loop factory */.
15280 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
15290 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
152a0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
152b0 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
152c0 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  yzed */.  Index 
152d0 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20  *pProbe,        
152e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
152f0 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f  index on pSrc */
15300 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c  .  LogEst nInMul
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15320 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72     /* log(Number
15330 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64   of iterations d
15340 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a  ue to IN) */.){.
15350 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
15360 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
15370 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52  pWInfo;  /* WHER
15380 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78  E analyse contex
15390 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
153a0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
153b0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a  Parse;        /*
153c0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
153d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
153e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
153f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
15400 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c  e connection mal
15410 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  loc context */. 
15420 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
15430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15440 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
15450 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e  reLoop under con
15460 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  struction */.  W
15470 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15490 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e  * A WhereTerm un
154a0 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  der consideratio
154b0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73  n */.  int opMas
154c0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
154d0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20         /* Valid 
154e0 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f  operators for co
154f0 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57  nstraints */.  W
15500 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20  hereScan scan;  
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15520 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57  * Iterator for W
15530 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20  HERE terms */.  
15540 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72  Bitmask saved_pr
15550 65 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20  ereq;           
15560 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
15570 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65  e of pNew->prere
15580 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  q */.  u16 saved
15590 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20  _nLTerm;        
155a0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
155b0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
155c0 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31  ->nLTerm */.  u1
155d0 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20  6 saved_nEq;    
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155f0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
15600 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  of pNew->u.btree
15610 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  .nEq */.  u16 sa
15620 76 65 64 5f 6e 42 74 6d 3b 20 20 20 20 20 20 20  ved_nBtm;       
15630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
15640 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
15650 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
15660 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  m */.  u16 saved
15670 5f 6e 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  _nTop;          
15680 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
15690 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
156a0 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 2a  ->u.btree.nTop *
156b0 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53  /.  u16 saved_nS
156c0 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kip;            
156d0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
156e0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
156f0 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61  Skip */.  u32 sa
15700 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20  ved_wsFlags;    
15710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
15720 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
15730 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a  New->wsFlags */.
15740 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e    LogEst saved_n
15750 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
15760 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
15770 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
15780 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
15790 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
157a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
157b0 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73   code */.  LogEs
157c0 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t rSize;        
157d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
157e0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
157f0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c  the table */.  L
15800 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20  ogEst rLogSize; 
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15820 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
15830 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57  able size */.  W
15840 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d  hereTerm *pTop =
15850 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f   0, *pBtm = 0; /
15860 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d  * Top and bottom
15870 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
15880 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20  ts */..  pNew = 
15890 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
158a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
158b0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
158c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
158d0 54 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  T;.  WHERETRACE(
158e0 30 78 38 30 30 2c 20 28 22 42 45 47 49 4e 20 25  0x800, ("BEGIN %
158f0 73 2e 61 64 64 42 74 72 65 65 49 64 78 28 25 73  s.addBtreeIdx(%s
15900 29 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20  ), nEq=%d\n",.  
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c     pProbe->pTabl
15930 65 2d 3e 7a 4e 61 6d 65 2c 70 50 72 6f 62 65 2d  e->zName,pProbe-
15940 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 75 2e  >zName, pNew->u.
15950 62 74 72 65 65 2e 6e 45 71 29 29 3b 0a 0a 20 20  btree.nEq));..  
15960 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
15970 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
15980 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
15990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  );.  assert( (pN
159a0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
159b0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
159c0 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  0 );.  if( pNew-
159d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
159e0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
159f0 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54    opMask = WO_LT
15a00 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_LE;.  }else{
15a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
15a20 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3d  w->u.btree.nBtm=
15a30 3d 30 20 29 3b 0a 20 20 20 20 6f 70 4d 61 73 6b  =0 );.    opMask
15a40 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
15a50 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
15a60 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_LE|WO_ISNULL
15a70 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66  |WO_IS;.  }.  if
15a80 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  ( pProbe->bUnord
15a90 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d  ered ) opMask &=
15aa0 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57   ~(WO_GT|WO_GE|W
15ab0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20  O_LT|WO_LE);..  
15ac0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e  assert( pNew->u.
15ad0 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65  btree.nEq<pProbe
15ae0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20  ->nColumn );..  
15af0 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77  saved_nEq = pNew
15b00 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
15b10 20 73 61 76 65 64 5f 6e 42 74 6d 20 3d 20 70 4e   saved_nBtm = pN
15b20 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
15b30 3b 0a 20 20 73 61 76 65 64 5f 6e 54 6f 70 20 3d  ;.  saved_nTop =
15b40 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15b50 54 6f 70 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b  Top;.  saved_nSk
15b60 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  ip = pNew->nSkip
15b70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  ;.  saved_nLTerm
15b80 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b   = pNew->nLTerm;
15b90 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73  .  saved_wsFlags
15ba0 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73   = pNew->wsFlags
15bb0 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65 71  ;.  saved_prereq
15bc0 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b   = pNew->prereq;
15bd0 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20  .  saved_nOut = 
15be0 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54  pNew->nOut;.  pT
15bf0 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49  erm = whereScanI
15c00 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c  nit(&scan, pBuil
15c10 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e  der->pWC, pSrc->
15c20 69 43 75 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e  iCursor, saved_n
15c30 45 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Eq,.            
15c40 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61              opMa
15c50 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 70  sk, pProbe);.  p
15c60 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
15c70 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62  .  rSize = pProb
15c80 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  e->aiRowLogEst[0
15c90 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  ];.  rLogSize = 
15ca0 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20  estLog(rSize);. 
15cb0 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
15cc0 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30  E_OK && pTerm!=0
15cd0 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53  ; pTerm = whereS
15ce0 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b  canNext(&scan)){
15cf0 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70  .    u16 eOp = p
15d00 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b  Term->eOperator;
15d10 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20     /* Shorthand 
15d20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  for pTerm->eOper
15d30 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45  ator */.    LogE
15d40 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20 20 20  st rCostIdx;.   
15d50 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61 64   LogEst nOutUnad
15d60 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20 20 2f  justed;        /
15d70 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20 49 4e  * nOut before IN
15d80 28 29 20 61 6e 64 20 57 48 45 52 45 20 61 64 6a  () and WHERE adj
15d90 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  ustments */.    
15da0 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66  int nIn = 0;.#if
15db0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15dc0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
15dd0 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c  .    int nRecVal
15de0 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  id = pBuilder->n
15df0 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
15e00 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d 3d 57  .    if( (eOp==W
15e10 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65  O_ISNULL || (pTe
15e20 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d  rm->wtFlags&TERM
15e30 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20  _VNULL)!=0).    
15e40 20 26 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e   && indexColumnN
15e50 6f 74 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73  otNull(pProbe, s
15e60 61 76 65 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b  aved_nEq).    ){
15e70 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
15e80 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e   /* ignore IS [N
15e90 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  OT] NULL constra
15ea0 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c  ints on NOT NULL
15eb0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
15ec0 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  }.    if( pTerm-
15ed0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
15ee0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
15ef0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
15f00 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74  * Do not allow t
15f10 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f  he upper bound o
15f20 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  f a LIKE optimiz
15f30 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73  ation range cons
15f40 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f  traint.    ** to
15f50 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65   mix with a lowe
15f60 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72  r range bound fr
15f70 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f  om some other so
15f80 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  urce */.    if( 
15f90 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
15fa0 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26   TERM_LIKEOPT &&
15fb0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
15fc0 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69  r==WO_LT ) conti
15fd0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  nue;..    /* Do 
15fe0 6e 6f 74 20 61 6c 6c 6f 77 20 63 6f 6e 73 74 72  not allow constr
15ff0 61 69 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 57  aints from the W
16000 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
16010 65 20 75 73 65 64 20 62 79 20 74 68 65 0a 20 20  e used by the.  
16020 20 20 2a 2a 20 72 69 67 68 74 20 74 61 62 6c 65    ** right table
16030 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
16040 20 20 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e    Only constrain
16050 74 73 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ts in the ON cla
16060 75 73 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  use are.    ** a
16070 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66  llowed */.    if
16080 28 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e  ( (pSrc->fg.join
16090 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
160a0 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70 72  =0.     && !Expr
160b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
160c0 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
160d0 6d 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20  mJoin).    ){.  
160e0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
160f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 49 73 55    }..    if( IsU
16100 6e 69 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62  niqueIndex(pProb
16110 65 29 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d  e) && saved_nEq=
16120 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
16130 2d 31 20 29 7b 0a 20 20 20 20 20 20 70 42 75 69  -1 ){.      pBui
16140 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c  lder->bldFlags |
16150 3d 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 55 4e  = SQLITE_BLDF_UN
16160 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  IQUE;.    }else{
16170 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d  .      pBuilder-
16180 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c  >bldFlags |= SQL
16190 49 54 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44  ITE_BLDF_INDEXED
161a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
161b0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
161c0 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
161d0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
161e0 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
161f0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
16200 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74  nBtm = saved_nBt
16210 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  m;.    pNew->u.b
16220 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65  tree.nTop = save
16230 64 5f 6e 54 6f 70 3b 0a 20 20 20 20 70 4e 65 77  d_nTop;.    pNew
16240 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
16250 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  _nLTerm;.    if(
16260 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
16270 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
16280 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
16290 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
162a0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
162b0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
162c0 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
162d0 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
162e0 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  d_prereq | pTerm
162f0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
16300 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
16310 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ;..    assert( n
16320 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20  InMul==0.       
16330 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
16340 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
16350 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20  N_NULL)!=0 .    
16360 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
16370 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
16380 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20  LUMN_IN)!=0 .   
16390 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
163a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
163b0 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20  KIPSCAN)!=0 .   
163c0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70   );..    if( eOp
163d0 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
163e0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
163f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
16400 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
16410 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16420 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
16430 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
16440 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20   (SELECT ...)": 
16450 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c   TUNING: the SEL
16460 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72  ECT returns 25 r
16470 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ows */.        i
16480 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 49  nt i;.        nI
16490 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28  n = 46;  assert(
164a0 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   46==sqlite3LogE
164b0 73 74 28 32 35 29 20 29 3b 0a 0a 20 20 20 20 20  st(25) );..     
164c0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
164d0 73 69 6f 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c  sion may actuall
164e0 79 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  y be of the form
164f0 20 28 78 2c 20 79 29 20 49 4e 20 28 53 45 4c 45   (x, y) IN (SELE
16500 43 54 2e 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20  CT...)..        
16510 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
16520 74 68 65 72 65 20 69 73 20 61 20 73 65 70 61 72  there is a separ
16530 61 74 65 20 74 65 72 6d 20 66 6f 72 20 65 61 63  ate term for eac
16540 68 20 6f 66 20 28 78 29 20 61 6e 64 20 28 79 29  h of (x) and (y)
16550 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77  ..        ** How
16560 65 76 65 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75  ever, the nIn mu
16570 6c 74 69 70 6c 69 65 72 20 73 68 6f 75 6c 64 20  ltiplier should 
16580 6f 6e 6c 79 20 62 65 20 61 70 70 6c 69 65 64 20  only be applied 
16590 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20  once, not once. 
165a0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 65 61         ** for ea
165b0 63 68 20 73 75 63 68 20 74 65 72 6d 2e 20 54 68  ch such term. Th
165c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70  e following loop
165d0 20 63 68 65 63 6b 73 20 74 68 61 74 20 70 54 65   checks that pTe
165e0 72 6d 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  rm is the.      
165f0 20 20 2a 2a 20 66 69 72 73 74 20 73 75 63 68 20    ** first such 
16600 74 65 72 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64  term in use, and
16610 20 73 65 74 73 20 6e 49 6e 20 62 61 63 6b 20 74   sets nIn back t
16620 6f 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  o 0 if it is not
16630 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  . */.        for
16640 28 69 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c  (i=0; i<pNew->nL
16650 54 65 72 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  Term-1; i++){.  
16660 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
16670 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70  ->aLTerm[i] && p
16680 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e  New->aLTerm[i]->
16690 70 45 78 70 72 3d 3d 70 45 78 70 72 20 29 20 6e  pExpr==pExpr ) n
166a0 49 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  In = 0;.        
166b0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
166c0 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
166d0 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72  x.pList && pExpr
166e0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
166f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16700 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61  "x IN (value, va
16710 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20  lue, ...)" */.  
16720 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69        nIn = sqli
16730 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d  te3LogEst(pExpr-
16740 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
16750 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16760 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52  ( nIn>0 );  /* R
16770 48 53 20 61 6c 77 61 79 73 20 68 61 73 20 32 20  HS always has 2 
16780 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e  or more terms...
16790 20 20 54 68 65 20 70 61 72 73 65 72 0a 20 20 20    The parser.   
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167b0 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65         ** change
167c0 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74  s "x IN (?)" int
167d0 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20  o "x=?". */.    
167e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
167f0 72 6f 62 65 2d 3e 68 61 73 53 74 61 74 31 20 29  robe->hasStat1 )
16800 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  {.        LogEst
16810 20 4d 2c 20 6c 6f 67 4b 2c 20 73 61 66 65 74 79   M, logK, safety
16820 4d 61 72 67 69 6e 3b 0a 20 20 20 20 20 20 20 20  Margin;.        
16830 2f 2a 20 4c 65 74 3a 0a 20 20 20 20 20 20 20 20  /* Let:.        
16840 2a 2a 20 20 20 4e 20 3d 20 74 68 65 20 74 6f 74  **   N = the tot
16850 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  al number of row
16860 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a 20  s in the table. 
16870 20 20 20 20 20 20 20 2a 2a 20 20 20 4b 20 3d 20         **   K = 
16880 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
16890 74 72 69 65 73 20 6f 6e 20 74 68 65 20 52 48 53  tries on the RHS
168a0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
168b0 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  tor.        **  
168c0 20 4d 20 3d 20 74 68 65 20 6e 75 6d 62 65 72 20   M = the number 
168d0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
168e0 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
168f0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 0a 20 20  terms to the .  
16900 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74        **       t
16910 6f 20 74 68 65 20 6c 65 66 74 20 69 6e 20 74 68  o the left in th
16920 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 49  e same index.  I
16930 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
16940 72 20 69 73 20 6f 6e 0a 20 20 20 20 20 20 20 20  r is on.        
16950 2a 2a 20 20 20 20 20 20 20 74 68 65 20 6c 65 66  **       the lef
16960 74 2d 6d 6f 73 74 20 69 6e 64 65 78 20 63 6f 6c  t-most index col
16970 75 6d 6e 2c 20 4d 3d 3d 4e 2e 0a 20 20 20 20 20  umn, M==N..     
16980 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
16990 20 47 69 76 65 6e 20 74 68 65 20 64 65 66 69 6e   Given the defin
169a0 69 74 69 6f 6e 73 20 61 62 6f 76 65 2c 20 69 74  itions above, it
169b0 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 6f 6d   is better to om
169c0 69 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  it the IN operat
169d0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  or.        ** fr
169e0 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 6c 6f 6f  om the index loo
169f0 6b 75 70 20 61 6e 64 20 69 6e 73 74 65 61 64 20  kup and instead 
16a00 64 6f 20 61 20 73 63 61 6e 20 6f 66 20 74 68 65  do a scan of the
16a10 20 4d 20 65 6c 65 6d 65 6e 74 73 2c 0a 20 20 20   M elements,.   
16a20 20 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20       ** testing 
16a30 65 61 63 68 20 73 63 61 6e 6e 65 64 20 72 6f 77  each scanned row
16a40 20 61 67 61 69 6e 73 74 20 74 68 65 20 49 4e 20   against the IN 
16a50 6f 70 65 72 61 74 6f 72 20 73 65 70 61 72 61 74  operator separat
16a60 65 6c 79 2c 20 69 66 3a 0a 20 20 20 20 20 20 20  ely, if:.       
16a70 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
16a80 20 20 20 20 20 20 4d 2a 6c 6f 67 28 4b 29 20 3c        M*log(K) <
16a90 20 4b 2a 6c 6f 67 28 4e 29 0a 20 20 20 20 20 20   K*log(N).      
16aa0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
16ab0 4f 75 72 20 65 73 74 69 6d 61 74 65 73 20 66 6f  Our estimates fo
16ac0 72 20 4d 2c 20 4b 2c 20 61 6e 64 20 4e 20 6d 69  r M, K, and N mi
16ad0 67 68 74 20 62 65 20 69 6e 61 63 63 75 72 61 74  ght be inaccurat
16ae0 65 2c 20 73 6f 20 77 65 20 62 75 69 6c 64 20 69  e, so we build i
16af0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73  n.        ** a s
16b00 61 66 65 74 79 20 6d 61 72 67 69 6e 20 6f 66 20  afety margin of 
16b10 32 20 28 4c 6f 67 45 73 74 3a 20 31 30 29 20 74  2 (LogEst: 10) t
16b20 68 61 74 20 66 61 76 6f 72 73 20 75 73 69 6e 67  hat favors using
16b30 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16b40 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
16b50 20 74 68 65 20 69 6e 64 65 78 2c 20 61 73 20 75   the index, as u
16b60 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 68 61  sing an index ha
16b70 73 20 62 65 74 74 65 72 20 77 6f 72 73 74 2d 63  s better worst-c
16b80 61 73 65 20 62 65 68 61 76 69 6f 72 2e 0a 20 20  ase behavior..  
16b90 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64        ** If we d
16ba0 6f 20 6e 6f 74 20 68 61 76 65 20 72 65 61 6c 20  o not have real 
16bb0 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74  sqlite_stat1 dat
16bc0 61 2c 20 61 6c 77 61 79 73 20 70 72 65 66 65 72  a, always prefer
16bd0 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 20 20   to use.        
16be0 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ** the index..  
16bf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16c00 20 4d 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52   M = pProbe->aiR
16c10 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e  owLogEst[saved_n
16c20 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 6c 6f 67  Eq];.        log
16c30 4b 20 3d 20 65 73 74 4c 6f 67 28 6e 49 6e 29 3b  K = estLog(nIn);
16c40 0a 20 20 20 20 20 20 20 20 73 61 66 65 74 79 4d  .        safetyM
16c50 61 72 67 69 6e 20 3d 20 31 30 3b 20 20 2f 2a 20  argin = 10;  /* 
16c60 54 55 4e 49 4e 47 3a 20 65 78 74 72 61 20 77 65  TUNING: extra we
16c70 69 67 68 74 20 66 6f 72 20 69 6e 64 65 78 65 64  ight for indexed
16c80 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   IN */.        i
16c90 66 28 20 4d 20 2b 20 6c 6f 67 4b 20 2b 20 73 61  f( M + logK + sa
16ca0 66 65 74 79 4d 61 72 67 69 6e 20 3c 20 6e 49 6e  fetyMargin < nIn
16cb0 20 2b 20 72 4c 6f 67 53 69 7a 65 20 29 7b 0a 20   + rLogSize ){. 
16cc0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52           WHERETR
16cd0 41 43 45 28 30 78 34 30 2c 0a 20 20 20 20 20 20  ACE(0x40,.      
16ce0 20 20 20 20 20 20 28 22 53 63 61 6e 20 70 72 65        ("Scan pre
16cf0 66 65 72 72 65 64 20 6f 76 65 72 20 49 4e 20 6f  ferred over IN o
16d00 70 65 72 61 74 6f 72 20 6f 6e 20 63 6f 6c 75 6d  perator on colum
16d10 6e 20 25 64 20 6f 66 20 5c 22 25 73 5c 22 20 28  n %d of \"%s\" (
16d20 25 64 3c 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20  %d<%d)\n",.     
16d30 20 20 20 20 20 20 20 20 73 61 76 65 64 5f 6e 45          saved_nE
16d40 71 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  q, pProbe->zName
16d50 2c 20 4d 2b 6c 6f 67 4b 2b 31 30 2c 20 6e 49 6e  , M+logK+10, nIn
16d60 2b 72 4c 6f 67 53 69 7a 65 29 29 3b 0a 20 20 20  +rLogSize));.   
16d70 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
16d80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16d90 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
16da0 52 41 43 45 28 30 78 34 30 2c 0a 20 20 20 20 20  RACE(0x40,.     
16db0 20 20 20 20 20 20 20 28 22 49 4e 20 6f 70 65 72         ("IN oper
16dc0 61 74 6f 72 20 70 72 65 66 65 72 72 65 64 20 6f  ator preferred o
16dd0 6e 20 63 6f 6c 75 6d 6e 20 25 64 20 6f 66 20 5c  n column %d of \
16de0 22 25 73 5c 22 20 28 25 64 3e 3d 25 64 29 5c 6e  "%s\" (%d>=%d)\n
16df0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16e00 73 61 76 65 64 5f 6e 45 71 2c 20 70 50 72 6f 62  saved_nEq, pProb
16e10 65 2d 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c 6f 67 4b  e->zName, M+logK
16e20 2b 31 30 2c 20 6e 49 6e 2b 72 4c 6f 67 53 69 7a  +10, nIn+rLogSiz
16e30 65 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e));.        }. 
16e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
16e50 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
16e60 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
16e70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
16e80 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29   & (WO_EQ|WO_IS)
16e90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
16ea0 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43  ol = pProbe->aiC
16eb0 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d  olumn[saved_nEq]
16ec0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
16ed0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
16ee0 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20  OLUMN_EQ;.      
16ef0 61 73 73 65 72 74 28 20 73 61 76 65 64 5f 6e 45  assert( saved_nE
16f00 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  q==pNew->u.btree
16f10 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20 69 66  .nEq );.      if
16f20 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
16f30 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69 43 6f   .       || (iCo
16f40 6c 3e 3d 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d  l>=0 && nInMul==
16f50 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d  0 && saved_nEq==
16f60 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d  pProbe->nKeyCol-
16f70 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
16f80 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e      if( iCol==XN
16f90 5f 52 4f 57 49 44 20 7c 7c 20 70 50 72 6f 62 65  _ROWID || pProbe
16fa0 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 0a 20  ->uniqNotNull . 
16fb0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f          || (pPro
16fc0 62 65 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26  be->nKeyCol==1 &
16fd0 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f  & pProbe->onErro
16fe0 72 20 26 26 20 65 4f 70 3d 3d 57 4f 5f 45 51 29  r && eOp==WO_EQ)
16ff0 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
17000 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
17010 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
17020 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 65  EROW;.        }e
17030 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
17040 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
17050 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
17060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17070 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
17080 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
17090 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  L ){.      pNew-
170a0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
170b0 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
170c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
170d0 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
170e0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
170f0 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20  se( eOp & WO_GT 
17100 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17110 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29  e( eOp & WO_GE )
17120 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
17130 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
17140 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
17150 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
17160 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
17170 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65 52 61 6e  .nBtm = whereRan
17180 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20  geVectorLen(.   
17190 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
171a0 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50  Src->iCursor, pP
171b0 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c  robe, saved_nEq,
171c0 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a   pTerm.      );.
171d0 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
171e0 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
171f0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   0;.      if( pT
17200 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
17210 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20  ERM_LIKEOPT ){. 
17220 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20         /* Range 
17230 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20  contraints that 
17240 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49  come from the LI
17250 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
17260 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
17270 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61  lways used in pa
17280 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  irs. */.        
17290 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d  pTop = &pTerm[1]
172a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
172b0 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e  ( (pTop-(pTerm->
172c0 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e  pWC->a))<pTerm->
172d0 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20  pWC->nTerm );.  
172e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
172f0 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  op->wtFlags & TE
17300 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20  RM_LIKEOPT );.  
17310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
17320 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  op->eOperator==W
17330 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20  O_LT );.        
17340 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
17350 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
17360 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
17370 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
17380 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
17390 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
173a0 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20  rm++] = pTop;.  
173b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
173c0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
173d0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
173e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
173f0 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  op = 1;.      }.
17400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17410 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
17420 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a  WO_LT|WO_LE) );.
17430 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17440 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  eOp & WO_LT );. 
17450 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
17460 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  Op & WO_LE );.  
17470 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
17480 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
17490 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f  N_RANGE|WHERE_TO
174a0 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  P_LIMIT;.      p
174b0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  New->u.btree.nTo
174c0 70 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56 65  p = whereRangeVe
174d0 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20 20  ctorLen(.       
174e0 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63 2d     pParse, pSrc-
174f0 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62 65  >iCursor, pProbe
17500 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54 65  , saved_nEq, pTe
17510 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  rm.      );.    
17520 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a    pTop = pTerm;.
17530 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e        pBtm = (pN
17540 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
17550 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d  ERE_BTM_LIMIT)!=
17560 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
17570 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
17580 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
17590 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d  rm-2] : 0;.    }
175a0 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
175b0 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75   point pNew->nOu
175c0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
175d0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
175e0 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a  xpected to.    *
175f0 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20  * be visited by 
17600 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62  the index scan b
17610 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e  efore considerin
17620 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72  g term pTerm, or
17630 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75   the.    ** valu
17640 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49  es of nIn and nI
17650 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  nMul. In other w
17660 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74  ords, assuming t
17670 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  hat all .    ** 
17680 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d  "x IN(...)" term
17690 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20 77  s are replaced w
176a0 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69  ith "x = ?". Thi
176b0 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a  s block updates.
176c0 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
176d0 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74   of pNew->nOut t
176e0 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54  o account for pT
176f0 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e  erm (but not nIn
17700 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20  /nInMul).  */.  
17710 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
17720 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
17730 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
17740 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
17750 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
17760 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
17770 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61  t nOut using sta
17780 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f  t3/stat4 data. O
17790 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  r, if there is n
177a0 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20  o stat3/stat4.  
177b0 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69      ** data, usi
177c0 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73  ng some other es
177d0 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20  timate.  */.    
177e0 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
177f0 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
17800 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70  lder, pBtm, pTop
17810 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c  , pNew);.    }el
17820 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  se{.      int nE
17830 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74  q = ++pNew->u.bt
17840 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61  ree.nEq;.      a
17850 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f  ssert( eOp & (WO
17860 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f  _ISNULL|WO_EQ|WO
17870 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20  _IN|WO_IS) );.. 
17880 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
17890 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
178a0 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Out );.      if(
178b0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
178c0 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e  b<=0 && pProbe->
178d0 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e  aiColumn[saved_n
178e0 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eq]>=0 ){.      
178f0 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20 26    assert( (eOp &
17900 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d   WO_IN) || nIn==
17910 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
17920 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
17930 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  IN );.        pN
17940 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  ew->nOut += pTer
17950 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
17960 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
17970 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d   -= nIn;.      }
17980 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
17990 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
179a0 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20 20  _OR_STAT4.      
179b0 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d    tRowcnt nOut =
179c0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
179d0 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20  nInMul==0 .     
179e0 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e      && pProbe->n
179f0 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
17a00 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
17a10 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq<=pProbe->n
17a20 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20  SampleCol.      
17a30 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57 4f     && ((eOp & WO
17a40 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72  _IN)==0 || !Expr
17a50 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
17a60 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  m->pExpr, EP_xIs
17a70 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20 20  Select)).       
17a80 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
17a90 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
17aa0 49 54 45 5f 53 74 61 74 33 34 29 0a 20 20 20 20  ITE_Stat34).    
17ab0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
17ac0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
17ad0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
17ae0 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20         if( (eOp 
17af0 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
17b00 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b  LL|WO_IS))!=0 ){
17b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
17b20 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
17b30 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EQ );.          
17b40 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
17b50 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
17b60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17b70 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
17b80 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
17b90 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
17ba0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
17bb0 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
17bc0 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a  pRight, &nOut);.
17bd0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
17be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17bf0 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  = whereInScanEst
17c00 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
17c10 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  r, pExpr->x.pLis
17c20 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20  t, &nOut);.     
17c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17c40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17c50 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
17c60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
17c70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17c80 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20  ITE_OK ) break; 
17c90 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
17ca0 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65 72   out of the pTer
17cb0 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  m loop */.      
17cc0 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a      if( nOut ){.
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
17ce0 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
17cf0 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20  LogEst(nOut);.  
17d00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
17d10 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e  ew->nOut>saved_n
17d20 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out ) pNew->nOut
17d30 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
17d40 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
17d50 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20  >nOut -= nIn;.  
17d60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17d70 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17d80 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66  nOut==0 ).#endif
17d90 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
17da0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
17db0 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  += (pProbe->aiRo
17dc0 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70  wLogEst[nEq] - p
17dd0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
17de0 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20  st[nEq-1]);.    
17df0 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20        if( eOp & 
17e00 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
17e10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
17e20 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20  NG: If there is 
17e30 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  no likelihood() 
17e40 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68  value, assume th
17e50 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 20 20  at a .          
17e60 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c    ** "col IS NUL
17e70 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  L" expression ma
17e80 74 63 68 65 73 20 74 77 69 63 65 20 61 73 20 6d  tches twice as m
17e90 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20  any rows .      
17ea0 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c        ** as (col
17eb0 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  =?). */.        
17ec0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
17ed0 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
17ee0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17ef0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
17f00 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78 20 74  * Set rCostIdx t
17f10 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69  o the cost of vi
17f20 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20  siting selected 
17f30 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41  rows in index. A
17f40 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20  dd.    ** it to 
17f50 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63  pNew->rRun, whic
17f60 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  h is currently s
17f70 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  et to the cost o
17f80 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  f the index.    
17f90 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68  ** seek only. Th
17fa0 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  en, if this is a
17fb0 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
17fc0 64 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73  dex, add the cos
17fd0 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69  t of.    ** visi
17fe0 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e  ting the rows in
17ff0 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
18000 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64    */.    rCostId
18010 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b  x = pNew->nOut +
18020 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d   1 + (15*pProbe-
18030 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d  >szIdxRow)/pSrc-
18040 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  >pTab->szTabRow;
18050 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
18060 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
18070 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f  dd(rLogSize, rCo
18080 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20  stIdx);.    if( 
18090 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
180a0 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
180b0 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20  |WHERE_IPK))==0 
180c0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  ){.      pNew->r
180d0 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
180e0 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
180f0 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20  n, pNew->nOut + 
18100 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41  16);.    }.    A
18110 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
18120 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
18130 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63  Probe->pTable->c
18140 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e  ostMult);..    n
18150 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20  OutUnadjusted = 
18160 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  pNew->nOut;.    
18170 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49  pNew->rRun += nI
18180 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
18190 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49  pNew->nOut += nI
181a0 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
181b0 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
181c0 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e  djust(pBuilder->
181d0 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
181e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  );.    rc = wher
181f0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
18200 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  lder, pNew);..  
18210 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
18220 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
18230 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
18240 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
18250 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d  aved_nOut;.    }
18260 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
18270 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61  ->nOut = nOutUna
18280 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a  djusted;.    }..
18290 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
182a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
182b0 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20  OP_LIMIT)==0.   
182c0 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
182d0 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  ee.nEq<pProbe->n
182e0 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20  Column.    ){.  
182f0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
18300 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
18310 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
18320 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a  e, nInMul+nIn);.
18330 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
18340 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
18350 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
18360 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
18370 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c  _STAT4.    pBuil
18380 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
18390 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64   nRecValid;.#end
183a0 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  if.  }.  pNew->p
183b0 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72  rereq = saved_pr
183c0 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  ereq;.  pNew->u.
183d0 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
183e0 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  d_nEq;.  pNew->u
183f0 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61  .btree.nBtm = sa
18400 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77  ved_nBtm;.  pNew
18410 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
18420 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70   saved_nTop;.  p
18430 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
18440 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77  ed_nSkip;.  pNew
18450 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
18460 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
18470 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
18480 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
18490 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
184a0 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69  erm;..  /* Consi
184b0 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70  der using a skip
184c0 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61  -scan if there a
184d0 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
184e0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
184f0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   ** available fo
18500 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  r the left-most 
18510 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
18520 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61  ex, and if the a
18530 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  verage.  ** numb
18540 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e  er of repeats in
18550 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
18560 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74  erms is at least
18570 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   18. .  **.  ** 
18580 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  The magic number
18590 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20   18 is selected 
185a0 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61  on the basis tha
185b0 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f  t scanning 17 ro
185c0 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73  ws.  ** is almos
185d0 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72  t always quicker
185e0 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73   than an index s
185f0 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68  eek (even though
18600 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   if the index.  
18610 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ** contains fewe
18620 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73  r than 2^17 rows
18630 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72   we assume other
18640 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61  wise in other pa
18650 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  rts of.  ** the 
18660 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e  code). And, even
18670 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   if it is not, i
18680 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
18690 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e  too much slower.
186a0 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74   .  ** On the ot
186b0 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78  her hand, the ex
186c0 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20  tra seeks could 
186d0 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67  end up being sig
186e0 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
186f0 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20  more expensive. 
18700 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32   */.  assert( 42
18710 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
18720 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76  18) );.  if( sav
18730 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53  ed_nEq==saved_nS
18740 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f  kip.   && saved_
18750 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b  nEq+1<pProbe->nK
18760 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f  eyCol.   && pPro
18770 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d  be->noSkipScan==
18780 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
18790 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
187a0 53 51 4c 49 54 45 5f 53 6b 69 70 53 63 61 6e 29  SQLITE_SkipScan)
187b0 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61  .   && pProbe->a
187c0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
187d0 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20  _nEq+1]>=42  /* 
187e0 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20  TUNING: Minimum 
187f0 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f  for skip-scan */
18800 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65  .   && (rc = whe
18810 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
18820 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
18830 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f  erm+1))==SQLITE_
18840 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45  OK.  ){.    LogE
18850 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e  st nIter;.    pN
18860 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
18870 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  +;.    pNew->nSk
18880 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ip++;.    pNew->
18890 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
188a0 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  erm++] = 0;.    
188b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
188c0 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b   WHERE_SKIPSCAN;
188d0 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72  .    nIter = pPr
188e0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
188f0 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50  [saved_nEq] - pP
18900 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
18910 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a  t[saved_nEq+1];.
18920 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
18930 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20  = nIter;.    /* 
18940 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65  TUNING:  Because
18950 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69   uncertainties i
18960 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20  n the estimates 
18970 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75  for skip-scan qu
18980 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64  eries,.    ** ad
18990 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20  d a 1.375 fudge 
189a0 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73  factor to make s
189b0 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c  kip-scan slightl
189c0 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a  y less likely. *
189d0 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35  /.    nIter += 5
189e0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41  ;.    whereLoopA
189f0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
18a00 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
18a10 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e  obe, nIter + nIn
18a20 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Mul);.    pNew->
18a30 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
18a40 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  t;.    pNew->u.b
18a50 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
18a60 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
18a70 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53  nSkip = saved_nS
18a80 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  kip;.    pNew->w
18a90 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
18aa0 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 57  sFlags;.  }..  W
18ab0 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c  HERETRACE(0x800,
18ac0 20 28 22 45 4e 44 20 25 73 2e 61 64 64 42 74 72   ("END %s.addBtr
18ad0 65 65 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25  eeIdx(%s), nEq=%
18ae0 64 2c 20 72 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  d, rc=%d\n",.   
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 20 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c     pProbe->pTabl
18b10 65 2d 3e 7a 4e 61 6d 65 2c 20 70 50 72 6f 62 65  e->zName, pProbe
18b20 2d 3e 7a 4e 61 6d 65 2c 20 73 61 76 65 64 5f 6e  ->zName, saved_n
18b30 45 71 2c 20 72 63 29 29 3b 0a 20 20 72 65 74 75  Eq, rc));.  retu
18b40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18b50 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
18b60 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
18b70 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
18b80 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
18b90 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
18ba0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18bb0 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
18bc0 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
18bd0 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
18be0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
18bf0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18c00 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
18c10 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
18c20 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
18c30 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
18c40 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
18c50 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
18c60 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
18c70 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
18c80 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
18c90 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
18ca0 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
18cb0 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
18cc0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
18cd0 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  pOB;.  ExprList 
18ce0 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e 74  *aColExpr;.  int
18cf0 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
18d00 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
18d10 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
18d20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
18d30 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
18d40 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
18d50 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
18d60 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
18d70 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
18d80 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
18d90 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
18da0 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
18db0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
18dc0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
18dd0 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
18de0 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  le==iCursor ){. 
18df0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
18e00 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
18e10 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  rn 1;.      for(
18e20 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
18e30 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b  >nKeyCol; jj++){
18e40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
18e50 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  pr->iColumn==pIn
18e60 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
18e70 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ] ) return 1;.  
18e80 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
18e90 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d 20  if( (aColExpr = 
18ea0 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
18eb0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
18ec0 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
18ed0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
18ee0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
18ef0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
18f00 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20 63  jj]!=XN_EXPR ) c
18f10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
18f20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
18f30 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 45 78 70  CompareSkip(pExp
18f40 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a  r,aColExpr->a[jj
18f50 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29  ].pExpr,iCursor)
18f60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
18f70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
18f80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18f90 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18fa0 30 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74  0;.}../* Check t
18fb0 6f 20 73 65 65 20 69 66 20 61 20 70 61 72 74 69  o see if a parti
18fc0 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70 50  al index with pP
18fd0 61 72 74 49 6e 64 65 78 57 68 65 72 65 20 63 61  artIndexWhere ca
18fe0 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20  n be used.** in 
18ff0 74 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72  the current quer
19000 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  y.  Return true 
19010 69 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64  if it can be and
19020 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
19030 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
19040 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
19050 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57  ndex(int iTab, W
19060 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
19070 20 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a   Expr *pWhere){.
19080 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
19090 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 50  Term *pTerm;.  P
190a0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
190b0 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
190c0 73 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68  se;.  while( pWh
190d0 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ere->op==TK_AND 
190e0 29 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65 72  ){.    if( !wher
190f0 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
19100 64 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68  dex(iTab,pWC,pWh
19110 65 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65  ere->pLeft) ) re
19120 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65  turn 0;.    pWhe
19130 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69  re = pWhere->pRi
19140 67 68 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ght;.  }.  if( p
19150 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
19160 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   & SQLITE_Enable
19170 51 50 53 47 20 29 20 70 50 61 72 73 65 20 3d 20  QPSG ) pParse = 
19180 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54  0;.  for(i=0, pT
19190 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
191a0 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
191b0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
191c0 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
191d0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
191e0 20 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72   (!ExprHasProper
191f0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
19200 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d  mJoin) || pExpr-
19210 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
19220 3d 3d 69 54 61 62 29 0a 20 20 20 20 20 26 26 20  ==iTab).     && 
19230 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
19240 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  esExpr(pParse, p
19250 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54  Expr, pWhere, iT
19260 61 62 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ab) .    ){.    
19270 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
19280 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
19290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
192a0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
192b0 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ects for a singl
192c0 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
192d0 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61  oin where the ta
192e0 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69  ble.** is identi
192f0 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
19300 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
19310 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
19320 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ranteed to be.**
19330 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c   a b-tree table,
19340 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
19350 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
19360 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70  costs (WhereLoop
19370 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d  .rRun) of the b-
19380 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64  tree loops added
19390 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
193a0 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61  n.** are calcula
193b0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
193c0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c  **.** For a full
193d0 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20   scan, assuming 
193e0 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e  the table (or in
193f0 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52  dex) contains nR
19400 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  ow rows:.**.**  
19410 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
19420 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20   3.0            
19430 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d          // full-
19440 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20  table scan.**   
19450 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
19460 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
19470 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
19480 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  f covering index
19490 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
194a0 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20  Row * (K+3.0)   
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
194c0 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65  scan of non-cove
194d0 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a  ring index.**.**
194e0 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61   where K is a va
194f0 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20  lue between 1.1 
19500 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65  and 3.0 set base
19510 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  d on the relativ
19520 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  e .** estimated 
19530 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
19540 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
19550 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a  ble records..**.
19560 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20  ** For an index 
19570 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73  scan, where nVis
19580 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  it is the number
19590 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76   of index rows v
195a0 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  isited.** by the
195b0 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b   scan, and nSeek
195c0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
195d0 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  f seek operation
195e0 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a  s required on .*
195f0 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  * the index b-tr
19600 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ee:.**.**     co
19610 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
19620 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56  g(nRow) + K * nV
19630 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f  isit)          /
19640 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  / covering index
19650 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
19660 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
19670 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56  ) + (K+3.0) * nV
19680 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d  isit)    // non-
19690 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
196a0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e  *.** Normally, n
196b0 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b  Seek is 1. nSeek
196c0 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
196d0 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75  than 1 come abou
196e0 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45  t if the .** WHE
196f0 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64  RE clause includ
19700 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22  es "x IN (....)"
19710 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70   terms used in p
19720 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f  lace of "x=?". O
19730 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69  r when .** impli
19740 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43  cit "x IN (SELEC
19750 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74  T x FROM tbl)" t
19760 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66  erms are added f
19770 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a  or skip-scans..*
19780 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
19790 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c  ed values (nRow,
197a0 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20   nVisit, nSeek) 
197b0 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20  often contain a 
197c0 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  large amount.** 
197d0 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20  of uncertainty. 
197e0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
197f0 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73  , scoring is des
19800 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c  igned to pick pl
19810 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20  ans that.** "do 
19820 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20  the least harm" 
19830 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  if the estimates
19840 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e   are inaccurate.
19850 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61    For example, a
19860 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61  .** log(nRow) fa
19870 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20  ctor is omitted 
19880 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  from a non-cover
19890 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69  ing index scan i
198a0 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69  n order to.** bi
198b0 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69  as the scoring i
198c0 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67  n favor of using
198d0 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65   an index, since
198e0 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a   the worst-case.
198f0 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ** performance o
19900 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  f using an index
19910 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20 74   is far better t
19920 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61  han the worst-ca
19930 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  se performance.*
19940 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c  * of a full tabl
19950 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  e scan..*/.stati
19960 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
19970 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65  ddBtree(.  Where
19980 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
19990 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20  ilder, /* WHERE 
199a0 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
199b0 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
199c0 6d 50 72 65 72 65 71 20 20 20 20 20 20 20 20 20  mPrereq         
199d0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65      /* Extra pre
199e0 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75  requesites for u
199f0 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20  sing this table 
19a00 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
19a10 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
19a20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
19a30 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
19a40 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
19a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19a60 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
19a70 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
19a80 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20    Index sPk;    
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19aa0 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62   A fake index ob
19ab0 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69  ject for the pri
19ac0 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f  mary key */.  Lo
19ad0 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b  gEst aiRowEstPk[
19ae0 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  2];       /* The
19af0 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76   aiRowLogEst[] v
19b00 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
19b10 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20   index */.  i16 
19b20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
19b30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
19b40 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
19b50 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
19b60 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
19b70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
19b80 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
19b90 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
19ba0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19bb0 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src;  /* The FRO
19bc0 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74  M clause btree t
19bd0 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  erm to add */.  
19be0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19c00 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
19c10 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
19c20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19c30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ;         /* Ret
19c40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
19c50 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20  t iSortIdx = 1; 
19c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19c70 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ex number */.  i
19c80 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20  nt b;           
19c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19ca0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f  boolean value */
19cb0 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19cd0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
19ce0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
19cf0 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
19d00 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
19d10 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
19d20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
19d30 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
19d40 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
19d50 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
19d60 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48  /* The parsed WH
19d70 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
19d80 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
19d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19da0 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
19db0 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20  ed */.  .  pNew 
19dc0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
19dd0 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
19de0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
19df0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   pTabList = pWIn
19e00 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
19e10 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d  pSrc = pTabList-
19e20 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
19e30 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
19e40 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  pTab;.  pWC = pB
19e50 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61  uilder->pWC;.  a
19e60 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
19e70 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
19e80 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
19e90 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  BIndex ){.    /*
19ea0 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
19eb0 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
19ec0 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
19ed0 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
19ee0 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
19ef0 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  pIBIndex;.  }els
19f00 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
19f10 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
19f20 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
19f30 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
19f40 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
19f50 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
19f60 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
19f70 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
19f80 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
19f90 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
19fa0 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
19fb0 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
19fc0 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
19fd0 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
19fe0 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
19ff0 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
1a000 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
1a010 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
1a020 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
1a030 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
1a040 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a060 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
1a070 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
1a080 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
1a090 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
1a0a0 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
1a0b0 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
1a0c0 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
1a0d0 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
1a0e0 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
1a0f0 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
1a100 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77  owLogEst = aiRow
1a110 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
1a120 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
1a130 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
1a140 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  ble = pTab;.    
1a150 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  sPk.szIdxRow = p
1a160 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
1a170 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
1a180 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
1a190 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
1a1a0 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  tPk[1] = 0;.    
1a1b0 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
1a1c0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1a1d0 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f   if( pSrc->fg.no
1a1e0 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
1a1f0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c       /* The real
1a200 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
1a210 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63  table are only c
1a220 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65  onsidered if the
1a230 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e  .      ** NOT IN
1a240 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20  DEXED qualifier 
1a250 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
1a260 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1a270 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  */.      sPk.pNe
1a280 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
1a290 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
1a2a0 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a  &sPk;.  }.  rSiz
1a2b0 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  e = pTab->nRowLo
1a2c0 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65  gEst;.  rLogSize
1a2d0 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29   = estLog(rSize)
1a2e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1a2f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
1a300 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f  _INDEX.  /* Auto
1a310 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f  matic indexes */
1a320 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72  .  if( !pBuilder
1a330 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a  ->pOrSet      /*
1a340 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20   Not part of an 
1a350 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
1a360 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  */.   && (pWInfo
1a370 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1a380 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
1a390 45 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49  E)==0.   && (pWI
1a3a0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
1a3b0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1a3c0 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
1a3d0 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64   && pSrc->pIBInd
1a3e0 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61  ex==0      /* Ha
1a3f0 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
1a400 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20  clause */.   && 
1a410 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64  !pSrc->fg.notInd
1a420 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f  exed   /* Has no
1a430 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
1a440 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73  use */.   && Has
1a450 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20 20  Rowid(pTab)     
1a460 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f      /* Not WITHO
1a470 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
1a480 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f  (FIXME: Why not?
1a490 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  ) */.   && !pSrc
1a4a0 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
1a4b0 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65  d /* Not a corre
1a4c0 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a  lated subquery *
1a4d0 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
1a4e0 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 20 2f  g.isRecursive  /
1a4f0 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76  * Not a recursiv
1a500 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65  e common table e
1a510 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20  xpression. */.  
1a520 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
1a530 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
1a540 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
1a550 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1a560 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
1a570 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
1a580 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
1a590 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
1a5a0 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
1a5b0 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
1a5c0 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
1a5d0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
1a5e0 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
1a5f0 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
1a600 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1a610 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
1a620 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
1a630 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
1a640 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
1a650 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
1a660 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ew->nSkip = 0;. 
1a670 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
1a680 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
1a690 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
1a6a0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
1a6b0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
1a6c0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
1a6d0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
1a6e0 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
1a6f0 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
1a700 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
1a710 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74  s.        ** est
1a720 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e  imated to be X*N
1a730 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
1a740 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a750 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20  f rows in.      
1a760 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
1a770 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64  eing indexed and
1a780 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28 4c   where X is 7 (L
1a790 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f  ogEst=28) for no
1a7a0 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rmal.        ** 
1a7b0 74 61 62 6c 65 73 20 6f 72 20 30 2e 35 20 28 4c  tables or 0.5 (L
1a7c0 6f 67 45 73 74 3d 2d 31 30 29 20 66 6f 72 20 76  ogEst=-10) for v
1a7d0 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
1a7e0 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  ies.  The value.
1a7f0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20          ** of X 
1a800 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76  is smaller for v
1a810 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
1a820 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ies so that the 
1a830 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20  query planner.  
1a840 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
1a850 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65   more aggressive
1a860 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e   about generatin
1a870 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  g automatic inde
1a880 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20  xes for.        
1a890 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73  ** those objects
1a8a0 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  , since there is
1a8b0 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   no opportunity 
1a8c0 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20  to add schema.  
1a8d0 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73        ** indexes
1a8e0 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61   on subqueries a
1a8f0 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20  nd views. */.   
1a900 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
1a910 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
1a920 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
1a930 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
1a940 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  =0 && (pTab->tab
1a950 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
1a960 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eral)==0 ){.    
1a970 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
1a980 75 70 20 2b 3d 20 32 38 3b 0a 20 20 20 20 20 20  up += 28;.      
1a990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a9a0 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
1a9b0 2d 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d  -= 10;.        }
1a9c0 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
1a9d0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
1a9e0 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d  w->rSetup, pTab-
1a9f0 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
1aa00 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 72 53      if( pNew->rS
1aa10 65 74 75 70 3c 30 20 29 20 70 4e 65 77 2d 3e 72  etup<0 ) pNew->r
1aa20 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
1aa30 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
1aa40 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
1aa50 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
1aa60 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
1aa70 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
1aa80 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
1aa90 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
1aaa0 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
1aab0 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
1aac0 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e      ** of knowin
1aad0 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
1aae0 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
1aaf0 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
1ab00 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
1ab10 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
1ab20 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
1ab30 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
1ab40 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
1ab50 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
1ab60 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
1ab70 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
1ab80 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
1ab90 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
1aba0 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
1abb0 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
1abc0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
1abd0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
1abe0 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
1abf0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
1ac00 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54 65 72  = mPrereq | pTer
1ac10 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1ac20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1ac30 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
1ac40 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
1ac50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ac60 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ac70 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
1ac80 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
1ac90 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
1aca0 69 63 65 73 2e 20 49 66 20 74 68 65 72 65 20 77  ices. If there w
1acb0 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
1acc0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
1acd0 6c 79 20 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65  ly .  ** conside
1ace0 72 20 69 6e 64 65 78 20 70 50 72 6f 62 65 2e 20  r index pProbe. 
1acf0 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d   */.  for(; rc==
1ad00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72  SQLITE_OK && pPr
1ad10 6f 62 65 3b 20 0a 20 20 20 20 20 20 70 50 72 6f  obe; .      pPro
1ad20 62 65 3d 28 70 53 72 63 2d 3e 70 49 42 49 6e 64  be=(pSrc->pIBInd
1ad30 65 78 20 3f 20 30 20 3a 20 70 50 72 6f 62 65 2d  ex ? 0 : pProbe-
1ad40 3e 70 4e 65 78 74 29 2c 20 69 53 6f 72 74 49 64  >pNext), iSortId
1ad50 78 2b 2b 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  x++.  ){.    if(
1ad60 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
1ad70 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26  xWhere!=0.     &
1ad80 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  & !whereUsablePa
1ad90 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d  rtialIndex(pSrc-
1ada0 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70  >iCursor, pWC, p
1adb0 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
1adc0 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74  here) ){.      t
1add0 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69  estcase( pNew->i
1ade0 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  Tab!=pSrc->iCurs
1adf0 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69  or );  /* See ti
1ae00 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35  cket [98d973b8f5
1ae10 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  ] */.      conti
1ae20 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c  nue;  /* Partial
1ae30 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72   index inappropr
1ae40 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75  iate for this qu
1ae50 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ery */.    }.   
1ae60 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 4e 6f   if( pProbe->bNo
1ae70 51 75 65 72 79 20 29 20 63 6f 6e 74 69 6e 75 65  Query ) continue
1ae80 3b 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50  ;.    rSize = pP
1ae90 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
1aea0 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  t[0];.    pNew->
1aeb0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b  u.btree.nEq = 0;
1aec0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
1aed0 65 65 2e 6e 42 74 6d 20 3d 20 30 3b 0a 20 20 20  ee.nBtm = 0;.   
1aee0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
1aef0 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Top = 0;.    pNe
1af00 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  w->nSkip = 0;.  
1af10 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
1af20 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
1af30 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
1af40 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1af50 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
1af60 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 20 20  eq = mPrereq;.  
1af70 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
1af80 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Size;.    pNew->
1af90 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
1afa0 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d   pProbe;.    b =
1afb0 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
1afc0 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c  ithOrderBy(pBuil
1afd0 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72  der, pProbe, pSr
1afe0 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
1aff0 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f   /* The ONEPASS_
1b000 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65  DESIRED flags ne
1b010 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74  ver occurs toget
1b020 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42  her with ORDER B
1b030 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  Y */.    assert(
1b040 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1b050 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
1b060 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
1b070 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20   || b==0 );.    
1b080 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
1b090 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
1b0a0 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
1b0b0 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
1b0c0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
1b0d0 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
1b0e0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
1b0f0 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
1b100 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
1b110 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
1b120 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e   0;.      /* TUN
1b130 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c  ING: Cost of ful
1b140 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20  l table scan is 
1b150 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20  (N*3.0). */.    
1b160 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
1b170 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20  Size + 16;.     
1b180 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
1b190 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
1b1a0 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
1b1b0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
1b1c0 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
1b1d0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
1b1e0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1b1f0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1b200 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1b210 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1b220 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  rSize;.      if(
1b230 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
1b240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
1b250 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69  tmask m;.      i
1b260 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76  f( pProbe->isCov
1b270 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  ering ){.       
1b280 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1b290 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
1b2a0 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  | WHERE_INDEXED;
1b2b0 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a  .        m = 0;.
1b2c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b2d0 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63       m = pSrc->c
1b2e0 6f 6c 55 73 65 64 20 26 20 70 50 72 6f 62 65 2d  olUsed & pProbe-
1b2f0 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3b 0a 20 20  >colNotIdxed;.  
1b300 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
1b310 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28  ags = (m==0) ? (
1b320 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
1b330 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20  HERE_INDEXED) : 
1b340 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
1b350 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1b360 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69   Full scan via i
1b370 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
1b380 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48  ( b.       || !H
1b390 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20  asRowid(pTab).  
1b3a0 20 20 20 20 20 7c 7c 20 70 50 72 6f 62 65 2d 3e       || pProbe->
1b3b0 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
1b3c0 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d  .       || ( m==
1b3d0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  0.         && pP
1b3e0 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
1b3f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
1b400 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  (pProbe->szIdxRo
1b410 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
1b420 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
1b430 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1b440 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
1b450 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20  S_DESIRED)==0.  
1b460 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1b470 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55  3GlobalConfig.bU
1b480 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26  seCis.         &
1b490 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
1b4a0 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50  abled(pWInfo->pP
1b4b0 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
1b4c0 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20  _CoverIdxScan). 
1b4d0 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
1b4e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
1b4f0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
1b500 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a   iSortIdx : 0;..
1b510 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1b520 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
1b530 74 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69  the index rows i
1b540 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69  s N*K, where K i
1b550 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74  s.        ** bet
1b560 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30  ween 1.1 and 3.0
1b570 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
1b580 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65  he relative size
1b590 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  s of the.       
1b5a0 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61   ** index and ta
1b5b0 62 6c 65 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20  ble rows. */.   
1b5c0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
1b5d0 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31  = rSize + 1 + (1
1b5e0 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
1b5f0 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52  ow)/pTab->szTabR
1b600 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
1b610 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
1b620 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1b630 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
1b640 6e 64 65 78 20 73 63 61 6e 2c 20 61 64 64 20 69  ndex scan, add i
1b650 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20  n the cost of.  
1b660 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67          ** doing
1b670 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20   table lookups. 
1b680 20 54 68 65 20 63 6f 73 74 20 77 69 6c 6c 20 62   The cost will b
1b690 65 20 33 78 20 74 68 65 20 6e 75 6d 62 65 72 20  e 3x the number 
1b6a0 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  of.          ** 
1b6b0 6c 6f 6f 6b 75 70 73 2e 20 20 54 61 6b 65 20 69  lookups.  Take i
1b6c0 6e 74 6f 20 61 63 63 6f 75 6e 74 20 57 48 45 52  nto account WHER
1b6d0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
1b6e0 68 61 74 20 63 61 6e 20 62 65 0a 20 20 20 20 20  hat can be.     
1b6f0 20 20 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65       ** satisfie
1b700 64 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65  d using just the
1b710 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 61 74   index, and that
1b720 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
1b730 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  a.          ** t
1b740 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a  able lookup. */.
1b750 20 20 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74            LogEst
1b760 20 6e 4c 6f 6f 6b 75 70 20 3d 20 72 53 69 7a 65   nLookup = rSize
1b770 20 2b 20 31 36 3b 20 20 2f 2a 20 42 61 73 65 20   + 16;  /* Base 
1b780 63 6f 73 74 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20  cost:  N*3 */.  
1b790 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
1b7a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
1b7b0 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  ur = pSrc->iCurs
1b7c0 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 57 68  or;.          Wh
1b7d0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 32 20  ereClause *pWC2 
1b7e0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
1b7f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
1b800 3d 30 3b 20 69 69 3c 70 57 43 32 2d 3e 6e 54 65  =0; ii<pWC2->nTe
1b810 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rm; ii++){.     
1b820 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
1b830 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 32 2d   *pTerm = &pWC2-
1b840 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  >a[ii];.        
1b850 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
1b860 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64  ExprCoveredByInd
1b870 65 78 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ex(pTerm->pExpr,
1b880 20 69 43 75 72 2c 20 70 50 72 6f 62 65 29 20 29   iCur, pProbe) )
1b890 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b8a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1b8b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b8c0 20 2f 2a 20 70 54 65 72 6d 20 63 61 6e 20 62 65   /* pTerm can be
1b8d0 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67   evaluated using
1b8e0 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 2e   just the index.
1b8f0 20 20 53 6f 20 72 65 64 75 63 65 0a 20 20 20 20    So reduce.    
1b900 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
1b910 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
1b920 66 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 20  f table lookups 
1b930 61 63 63 6f 72 64 69 6e 67 6c 79 20 2a 2f 0a 20  accordingly */. 
1b940 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1b950 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
1b960 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b970 20 20 20 20 6e 4c 6f 6f 6b 75 70 20 2b 3d 20 70      nLookup += p
1b980 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
1b990 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
1b9a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1b9b0 20 20 6e 4c 6f 6f 6b 75 70 2d 2d 3b 0a 20 20 20    nLookup--;.   
1b9c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1b9d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1b9e0 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  & (WO_EQ|WO_IS) 
1b9f0 29 20 6e 4c 6f 6f 6b 75 70 20 2d 3d 20 31 39 3b  ) nLookup -= 19;
1ba00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1ba10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ba20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
1ba30 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
1ba40 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e  ite3LogEstAdd(pN
1ba50 65 77 2d 3e 72 52 75 6e 2c 20 6e 4c 6f 6f 6b 75  ew->rRun, nLooku
1ba60 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
1ba70 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
1ba80 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
1ba90 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
1baa0 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 77  Mult);.        w
1bab0 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
1bac0 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20  just(pWC, pNew, 
1bad0 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  rSize);.        
1bae0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
1baf0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
1bb00 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  New);.        pN
1bb10 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
1bb20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1bb30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1bb40 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 42 75  }.    }..    pBu
1bb50 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20  ilder->bldFlags 
1bb60 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  = 0;.    rc = wh
1bb70 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
1bb80 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
1bb90 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b  Src, pProbe, 0);
1bba0 0a 20 20 20 20 69 66 28 20 70 42 75 69 6c 64 65  .    if( pBuilde
1bbb0 72 2d 3e 62 6c 64 46 6c 61 67 73 3d 3d 53 51 4c  r->bldFlags==SQL
1bbc0 49 54 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44  ITE_BLDF_INDEXED
1bbd0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1bbe0 61 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 69 6e 64  a non-unique ind
1bbf0 65 78 20 69 73 20 75 73 65 64 2c 20 6f 72 20 69  ex is used, or i
1bc00 66 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  f a prefix of th
1bc10 65 20 6b 65 79 20 66 6f 72 0a 20 20 20 20 20 20  e key for.      
1bc20 2a 2a 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20  ** unique index 
1bc30 69 73 20 75 73 65 64 20 28 6d 61 6b 69 6e 67 20  is used (making 
1bc40 74 68 65 20 69 6e 64 65 78 20 66 75 6e 63 74 69  the index functi
1bc50 6f 6e 61 6c 6c 79 20 6e 6f 6e 2d 75 6e 69 71 75  onally non-uniqu
1bc60 65 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e).      ** then
1bc70 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
1bc80 31 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 69  1 data becomes i
1bc90 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 63 6f  mportant for sco
1bca0 72 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a  ring the.      *
1bcb0 2a 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20  * plan */.      
1bcc0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
1bcd0 3d 20 54 46 5f 53 74 61 74 73 55 73 65 64 3b 0a  = TF_StatsUsed;.
1bce0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
1bcf0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
1bd00 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71  _OR_STAT4.    sq
1bd10 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46  lite3Stat4ProbeF
1bd20 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52  ree(pBuilder->pR
1bd30 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  ec);.    pBuilde
1bd40 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30  r->nRecValid = 0
1bd50 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
1bd60 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66  pRec = 0;.#endif
1bd70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1bd80 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1bd90 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1bda0 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  TABLE../*.** Arg
1bdb0 75 6d 65 6e 74 20 70 49 64 78 49 6e 66 6f 20 69  ument pIdxInfo i
1bdc0 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
1bdd0 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e  ted with all con
1bde0 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61  straints that ma
1bdf0 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 62 79 20  y.** be used by 
1be00 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1be10 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
1be20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
1be30 69 54 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75  iTab. This.** fu
1be40 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73  nction marks a s
1be50 75 62 73 65 74 20 6f 66 20 74 68 6f 73 65 20 63  ubset of those c
1be60 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c  onstraints usabl
1be70 65 2c 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a  e, invokes the.*
1be80 2a 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  * xBestIndex met
1be90 68 6f 64 20 61 6e 64 20 61 64 64 73 20 74 68 65  hod and adds the
1bea0 20 72 65 74 75 72 6e 65 64 20 70 6c 61 6e 20 74   returned plan t
1beb0 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  o pBuilder..**.*
1bec0 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  * A constraint i
1bed0 73 20 6d 61 72 6b 65 64 20 75 73 61 62 6c 65 20  s marked usable 
1bee0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72  if:.**.**   * Ar
1bef0 67 75 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20 69  gument mUsable i
1bf00 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 69 74  ndicates that it
1bf10 73 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  s prerequisites 
1bf20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61  are available, a
1bf30 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20  nd.**.**   * It 
1bf40 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68  is not one of th
1bf50 65 20 6f 70 65 72 61 74 6f 72 73 20 73 70 65 63  e operators spec
1bf60 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 45 78  ified in the mEx
1bf70 63 6c 75 64 65 20 6d 61 73 6b 20 70 61 73 73 65  clude mask passe
1bf80 64 0a 2a 2a 20 20 20 20 20 61 73 20 74 68 65 20  d.**     as the 
1bf90 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
1bfa0 28 77 68 69 63 68 20 69 6e 20 70 72 61 63 74 69  (which in practi
1bfb0 63 65 20 69 73 20 65 69 74 68 65 72 20 57 4f 5f  ce is either WO_
1bfc0 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  IN or 0)..**.** 
1bfd0 41 72 67 75 6d 65 6e 74 20 6d 50 72 65 72 65 71  Argument mPrereq
1bfe0 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 74 61   is a mask of ta
1bff0 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1c000 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
1c010 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
1c020 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f  table in questio
1c030 6e 2e 20 54 68 65 73 65 20 61 72 65 20 61 64 64  n. These are add
1c040 65 64 20 74 6f 20 74 68 65 20 70 6c 61 6e 73 20  ed to the plans 
1c050 70 72 65 72 65 71 75 69 73 69 74 65 73 0a 2a 2a  prerequisites.**
1c060 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 61 64   before it is ad
1c070 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 2e  ded to pBuilder.
1c080 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61  .**.** Output pa
1c090 72 61 6d 65 74 65 72 20 2a 70 62 49 6e 20 69 73  rameter *pbIn is
1c0a0 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
1c0b0 74 68 65 20 70 6c 61 6e 20 61 64 64 65 64 20 74  the plan added t
1c0c0 6f 20 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73  o pBuilder.** us
1c0d0 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  es one or more W
1c0e0 4f 5f 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66  O_IN terms, or f
1c0f0 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
1c100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1c110 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1c120 6c 4f 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  lOne(.  WhereLoo
1c130 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1c140 65 72 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50  er,.  Bitmask mP
1c150 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 20 20  rereq,          
1c160 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1c170 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73   tables that mus
1c180 74 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20  t be used. */.  
1c190 42 69 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c  Bitmask mUsable,
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c  /* Mask of usabl
1c1c0 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75 31  e tables */.  u1
1c1d0 36 20 6d 45 78 63 6c 75 64 65 2c 20 20 20 20 20  6 mExclude,     
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c1f0 20 45 78 63 6c 75 64 65 20 74 65 72 6d 73 20 75   Exclude terms u
1c200 73 69 6e 67 20 74 68 65 73 65 20 6f 70 65 72 61  sing these opera
1c210 74 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tors */.  sqlite
1c220 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
1c230 64 78 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f 70  dxInfo,   /* Pop
1c240 75 6c 61 74 65 64 20 6f 62 6a 65 63 74 20 66 6f  ulated object fo
1c250 72 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  r xBestIndex */.
1c260 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 2c 20 20    u16 mNoOmit,  
1c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c280 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 6d 69 74    /* Do not omit
1c290 20 74 68 65 73 65 20 63 6f 6e 73 74 72 61 69 6e   these constrain
1c2a0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 49  ts */.  int *pbI
1c2b0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
1c2c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1c2d0 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65  True if plan use
1c2e0 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 20  s an IN(...) op 
1c2f0 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c 61  */.){.  WhereCla
1c300 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69 6c  use *pWC = pBuil
1c310 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72 75  der->pWC;.  stru
1c320 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1c330 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
1c340 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
1c350 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
1c360 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
1c370 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
1c380 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
1c390 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  age;.  int i;.  
1c3a0 69 6e 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e  int mxTerm;.  in
1c3b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1c3c0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
1c3d0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1c3e0 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a 70  pNew;.  Parse *p
1c3f0 50 61 72 73 65 20 3d 20 70 42 75 69 6c 64 65 72  Parse = pBuilder
1c400 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
1c410 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1c420 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
1c430 26 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66  &pBuilder->pWInf
1c440 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1c450 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69 6e  New->iTab];.  in
1c460 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
1c470 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
1c480 72 61 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  raint;..  assert
1c490 28 20 28 6d 55 73 61 62 6c 65 20 26 20 6d 50 72  ( (mUsable & mPr
1c4a0 65 72 65 71 29 3d 3d 6d 50 72 65 72 65 71 20 29  ereq)==mPrereq )
1c4b0 3b 0a 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a 20  ;.  *pbIn = 0;. 
1c4c0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
1c4d0 6d 50 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20 53  mPrereq;..  /* S
1c4e0 65 74 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c  et the usable fl
1c4f0 61 67 20 6f 6e 20 74 68 65 20 73 75 62 73 65 74  ag on the subset
1c500 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
1c510 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 20  identified by . 
1c520 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d 55   ** arguments mU
1c530 73 61 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c 75  sable and mExclu
1c540 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  de. */.  pIdxCon
1c550 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
1c560 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
1c570 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
1c580 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
1c590 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1c5a0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
1c5b0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
1c5c0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1c5d0 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49 64 78 43   = &pWC->a[pIdxC
1c5e0 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
1c5f0 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d  ];.    pIdxCons-
1c600 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
1c610 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1c620 72 65 71 52 69 67 68 74 20 26 20 6d 55 73 61 62  reqRight & mUsab
1c630 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72  le)==pTerm->prer
1c640 65 71 52 69 67 68 74 20 0a 20 20 20 20 20 26 26  eqRight .     &&
1c650 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1c660 6f 72 20 26 20 6d 45 78 63 6c 75 64 65 29 3d 3d  or & mExclude)==
1c670 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1c680 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
1c690 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
1c6a0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1c6b0 74 68 65 20 6f 75 74 70 75 74 20 66 69 65 6c 64  the output field
1c6c0 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
1c6d0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
1c6e0 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  cture */.  memse
1c6f0 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
1c700 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 6e  eof(pUsage[0])*n
1c710 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 61  Constraint);.  a
1c720 73 73 65 72 74 28 20 70 49 64 78 49 6e 66 6f 2d  ssert( pIdxInfo-
1c730 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1c740 72 3d 3d 30 20 29 3b 0a 20 20 70 49 64 78 49 6e  r==0 );.  pIdxIn
1c750 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
1c760 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
1c770 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  um = 0;.  pIdxIn
1c780 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
1c790 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  med = 0;.  pIdxI
1c7a0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
1c7b0 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
1c7c0 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b  DBL / (double)2;
1c7d0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
1c7e0 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b  imatedRows = 25;
1c7f0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
1c800 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 49 64  Flags = 0;.  pId
1c810 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d  xInfo->colUsed =
1c820 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
1c830 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a  pSrc->colUsed;..
1c840 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
1c850 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 42  virtual table xB
1c860 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f  estIndex() metho
1c870 64 20 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61 62  d */.  rc = vtab
1c880 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
1c890 2c 20 70 53 72 63 2d 3e 70 54 61 62 2c 20 70 49  , pSrc->pTab, pI
1c8a0 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72  dxInfo);.  if( r
1c8b0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  c ){.    if( rc=
1c8c0 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
1c8d0 4e 54 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  NT ){.      /* I
1c8e0 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  f the xBestIndex
1c8f0 20 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73 20   method returns 
1c900 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1c910 54 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  T, that means.  
1c920 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
1c930 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69  particular combi
1c940 6e 61 74 69 6f 6e 20 6f 66 20 70 61 72 61 6d 65  nation of parame
1c950 74 65 72 73 20 70 72 6f 76 69 64 65 64 20 69 73  ters provided is
1c960 20 75 6e 75 73 61 62 6c 65 2e 0a 20 20 20 20 20   unusable..     
1c970 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 65 6e 74 72   ** Make no entr
1c980 69 65 73 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20  ies in the loop 
1c990 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  table..      */.
1c9a0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1c9b0 28 30 78 66 66 66 66 2c 20 28 22 20 20 5e 5e 5e  (0xffff, ("  ^^^
1c9c0 5e 2d 2d 2d 20 6e 6f 6e 2d 76 69 61 62 6c 65 20  ^--- non-viable 
1c9d0 70 6c 61 6e 20 72 65 6a 65 63 74 65 64 21 5c 6e  plan rejected!\n
1c9e0 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
1c9f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1ca00 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
1ca10 3b 0a 20 20 7d 0a 0a 20 20 6d 78 54 65 72 6d 20  ;.  }..  mxTerm 
1ca20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  = -1;.  assert( 
1ca30 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43  pNew->nLSlot>=nC
1ca40 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 66  onstraint );.  f
1ca50 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
1ca60 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77  raint; i++) pNew
1ca70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b  ->aLTerm[i] = 0;
1ca80 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1ca90 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  omitMask = 0;.  
1caa0 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
1cab0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
1cac0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
1cad0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
1cae0 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30  raint;.  for(i=0
1caf0 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
1cb00 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
1cb10 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d  ){.    int iTerm
1cb20 3b 0a 20 20 20 20 69 66 28 20 28 69 54 65 72 6d  ;.    if( (iTerm
1cb30 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67   = pUsage[i].arg
1cb40 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29  vIndex - 1)>=0 )
1cb50 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
1cb60 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20 20  m *pTerm;.      
1cb70 69 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73  int j = pIdxCons
1cb80 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
1cb90 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d       if( iTerm>=
1cba0 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20  nConstraint.    
1cbb0 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20     || j<0.      
1cbc0 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72   || j>=pWC->nTer
1cbd0 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77  m.       || pNew
1cbe0 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21  ->aLTerm[iTerm]!
1cbf0 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  =0.       || pId
1cc00 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30  xCons->usable==0
1cc10 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1cc20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1cc30 67 28 70 50 61 72 73 65 2c 22 25 73 2e 78 42 65  g(pParse,"%s.xBe
1cc40 73 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74  stIndex malfunct
1cc50 69 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d  ion",pSrc->pTab-
1cc60 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
1cc70 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 49   testcase( pIdxI
1cc80 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1cc90 64 78 53 74 72 20 29 3b 0a 20 20 20 20 20 20 20  dxStr );.       
1cca0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1ccb0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
1ccc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
1ccd0 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm==nConstraint
1cce0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
1ccf0 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20  case( j==0 );.  
1cd00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1cd10 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
1cd20 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
1cd30 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
1cd40 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
1cd50 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
1cd60 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
1cd70 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e  t( iTerm<pNew->n
1cd80 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70  LSlot );.      p
1cd90 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
1cda0 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
1cdb0 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65    if( iTerm>mxTe
1cdc0 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54  rm ) mxTerm = iT
1cdd0 65 72 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  erm;.      testc
1cde0 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29  ase( iTerm==15 )
1cdf0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ce00 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20  ( iTerm==16 );. 
1ce10 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
1ce20 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
1ce30 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
1ce40 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
1ce50 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  <<iTerm;.      i
1ce60 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1ce70 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
1ce80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
1ce90 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
1cea0 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
1ceb0 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75  ed by an IN clau
1cec0 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20  se may not.     
1ced0 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68     ** consume th
1cee0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1cef0 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68  e because (1) th
1cf00 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65  e order of IN te
1cf10 72 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  rms.        ** i
1cf20 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
1cf30 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
1cf40 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
1cf50 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
1cf60 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70     ** (2) Multip
1cf70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20  le outputs from 
1cf80 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75  a single IN valu
1cf90 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65  e will not merge
1cfa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65  .        ** toge
1cfb0 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
1cfc0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
1cfd0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
1cfe0 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
1cff0 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e  o->idxFlags &= ~
1d000 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
1d010 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  N_UNIQUE;.      
1d020 20 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73 73    *pbIn = 1; ass
1d030 65 72 74 28 20 28 6d 45 78 63 6c 75 64 65 20 26  ert( (mExclude &
1d040 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20   WO_IN)==0 );.  
1d050 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d060 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
1d070 6d 69 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f  mitMask &= ~mNoO
1d080 6d 69 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c  mit;..  pNew->nL
1d090 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
1d0a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d  .  for(i=0; i<=m
1d0b0 78 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  xTerm; i++){.   
1d0c0 20 69 66 28 20 70 4e 65 77 2d 3e 61 4c 54 65 72   if( pNew->aLTer
1d0d0 6d 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  m[i]==0 ){.     
1d0e0 20 2f 2a 20 54 68 65 20 6e 6f 6e 2d 7a 65 72 6f   /* The non-zero
1d0f0 20 61 72 67 76 49 64 78 20 76 61 6c 75 65 73 20   argvIdx values 
1d100 6d 75 73 74 20 62 65 20 63 6f 6e 74 69 67 75 6f  must be contiguo
1d110 75 73 2e 20 20 52 61 69 73 65 20 61 6e 0a 20 20  us.  Raise an.  
1d120 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 66 20      ** error if 
1d130 74 68 65 79 20 61 72 65 20 6e 6f 74 20 2a 2f 0a  they are not */.
1d140 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1d150 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
1d160 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c 66  .xBestIndex malf
1d170 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e 70  unction",pSrc->p
1d180 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
1d190 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
1d1a0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1d1b0 65 49 64 78 53 74 72 20 29 3b 0a 20 20 20 20 20  eIdxStr );.     
1d1c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1d1d0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
1d1e0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1d1f0 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c  nLTerm<=pNew->nL
1d200 53 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  Slot );.  pNew->
1d210 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20  u.vtab.idxNum = 
1d220 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
1d230 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1d240 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78  .needFree = pIdx
1d250 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1d260 49 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49 6e  IdxStr;.  pIdxIn
1d270 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1d280 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77  xStr = 0;.  pNew
1d290 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
1d2a0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  = pIdxInfo->idxS
1d2b0 74 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74  tr;.  pNew->u.vt
1d2c0 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  ab.isOrdered = (
1d2d0 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  i8)(pIdxInfo->or
1d2e0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a  derByConsumed ?.
1d2f0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
1d300 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20  nOrderBy : 0);. 
1d310 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1d320 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  0;.  pNew->rRun 
1d330 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46  = sqlite3LogEstF
1d340 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
1d350 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
1d360 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  t);.  pNew->nOut
1d370 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1d380 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
1d390 61 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a  atedRows);..  /*
1d3a0 20 53 65 74 20 74 68 65 20 57 48 45 52 45 5f 4f   Set the WHERE_O
1d3b0 4e 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74 68  NEROW flag if th
1d3c0 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  e xBestIndex() m
1d3d0 65 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64 0a  ethod indicated.
1d3e0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63    ** that the sc
1d3f0 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74  an will visit at
1d400 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43   most one row. C
1d410 6c 65 61 72 20 69 74 20 6f 74 68 65 72 77 69 73  lear it otherwis
1d420 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78  e. */.  if( pIdx
1d430 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26  Info->idxFlags &
1d440 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43   SQLITE_INDEX_SC
1d450 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20  AN_UNIQUE ){.   
1d460 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
1d470 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  = WHERE_ONEROW;.
1d480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
1d490 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57  w->wsFlags &= ~W
1d4a0 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d  HERE_ONEROW;.  }
1d4b0 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f  .  rc = whereLoo
1d4c0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
1d4d0 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 70  , pNew);.  if( p
1d4e0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1d4f0 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
1d500 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75  te3_free(pNew->u
1d510 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
1d520 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
1d530 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1d540 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  }.  WHERETRACE(0
1d550 78 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d 25  xffff, ("  bIn=%
1d560 64 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c 6c  d prereqIn=%04ll
1d570 78 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34 6c  x prereqOut=%04l
1d580 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  lx\n",.         
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 62               *pb
1d5a0 49 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e  In, (sqlite3_uin
1d5b0 74 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20 20  t64)mPrereq,.   
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74     (sqlite3_uint
1d5e0 36 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65 71  64)(pNew->prereq
1d5f0 20 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b 0a   & ~mPrereq)));.
1d600 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d610 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  ./*.** If this f
1d620 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1d630 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ed from within a
1d640 6e 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 63  n xBestIndex() c
1d650 61 6c 6c 62 61 63 6b 2c 20 69 74 0a 2a 2a 20 72  allback, it.** r
1d660 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
1d670 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1d680 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
1d690 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
1d6a0 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 73  n.** sequence as
1d6b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 6c  sociated with el
1d6c0 65 6d 65 6e 74 20 69 43 6f 6e 73 20 6f 66 20 74  ement iCons of t
1d6d0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
1d6e0 5f 69 6e 66 6f 2e 61 43 6f 6e 73 74 72 61 69 6e  _info.aConstrain
1d6f0 74 0a 2a 2a 20 61 72 72 61 79 2e 20 4f 72 2c 20  t.** array. Or, 
1d700 69 66 20 69 43 6f 6e 73 20 69 73 20 6f 75 74 20  if iCons is out 
1d710 6f 66 20 72 61 6e 67 65 20 6f 72 20 74 68 65 72  of range or ther
1d720 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 78  e is no active x
1d730 42 65 73 74 49 6e 64 65 78 0a 2a 2a 20 63 61 6c  BestIndex.** cal
1d740 6c 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  l, return NULL..
1d750 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1d760 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6c 6c  qlite3_vtab_coll
1d770 61 74 69 6f 6e 28 73 71 6c 69 74 65 33 5f 69 6e  ation(sqlite3_in
1d780 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
1d790 66 6f 2c 20 69 6e 74 20 69 43 6f 6e 73 29 7b 0a  fo, int iCons){.
1d7a0 20 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66    HiddenIndexInf
1d7b0 6f 20 2a 70 48 69 64 64 65 6e 20 3d 20 28 48 69  o *pHidden = (Hi
1d7c0 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f 2a 29 26  ddenIndexInfo*)&
1d7d0 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 63  pIdxInfo[1];.  c
1d7e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20  onst char *zRet 
1d7f0 3d 20 30 3b 0a 20 20 69 66 28 20 69 43 6f 6e 73  = 0;.  if( iCons
1d800 3e 3d 30 20 26 26 20 69 43 6f 6e 73 3c 70 49 64  >=0 && iCons<pId
1d810 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
1d820 6e 74 20 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  nt ){.    CollSe
1d830 71 20 2a 70 43 20 3d 20 30 3b 0a 20 20 20 20 69  q *pC = 0;.    i
1d840 6e 74 20 69 54 65 72 6d 20 3d 20 70 49 64 78 49  nt iTerm = pIdxI
1d850 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
1d860 5b 69 43 6f 6e 73 5d 2e 69 54 65 72 6d 4f 66 66  [iCons].iTermOff
1d870 73 65 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  set;.    Expr *p
1d880 58 20 3d 20 70 48 69 64 64 65 6e 2d 3e 70 57 43  X = pHidden->pWC
1d890 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
1d8a0 3b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c  ;.    if( pX->pL
1d8b0 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 43 20  eft ){.      pC 
1d8c0 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
1d8d0 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 48  ompareCollSeq(pH
1d8e0 69 64 64 65 6e 2d 3e 70 50 61 72 73 65 2c 20 70  idden->pParse, p
1d8f0 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
1d900 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ight);.    }.   
1d910 20 7a 52 65 74 20 3d 20 28 70 43 20 3f 20 70 43   zRet = (pC ? pC
1d920 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65  ->zName : sqlite
1d930 33 53 74 72 42 49 4e 41 52 59 29 3b 0a 20 20 7d  3StrBINARY);.  }
1d940 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
1d950 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
1d960 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1d970 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f  ts for a table o
1d980 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74  f the join ident
1d990 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69  ified by.** pBui
1d9a0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
1d9b0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
1d9c0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1d9d0 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
1d9e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
1d9f0 65 20 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72  e are no LEFT or
1da00 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e   CROSS JOIN join
1da10 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20  s in the query, 
1da20 62 6f 74 68 20 6d 50 72 65 72 65 71 20 61 6e 64  both mPrereq and
1da30 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72  .** mUnusable ar
1da40 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65  e set to 0. Othe
1da50 72 77 69 73 65 2c 20 6d 50 72 65 72 65 71 20 69  rwise, mPrereq i
1da60 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20  s a mask of all 
1da70 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65  FROM clause.** e
1da80 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
1da90 72 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72  r before the vir
1daa0 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68  tual table in th
1dab0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e  e FROM clause an
1dac0 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74  d are.** separat
1dad0 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
1dae0 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
1daf0 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53  or CROSS JOIN. S
1db00 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a  imilarly, the.**
1db10 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20   mUnusable mask 
1db20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f  contains all FRO
1db30 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73  M clause entries
1db40 20 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65   that occur afte
1db50 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  r the.** virtual
1db60 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73   table and are s
1db70 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
1db80 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
1db90 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f   LEFT or .** CRO
1dba0 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20  SS JOIN. .**.** 
1dbb0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1dbc0 74 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a  the query were:.
1dbd0 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
1dbe0 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49   t1, t2 LEFT JOI
1dbf0 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f  N t3, t4, vt CRO
1dc00 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a  SS JOIN t5, t6;.
1dc10 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72  **.** then mPrer
1dc20 65 71 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  eq corresponds t
1dc30 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d  o (t1, t2) and m
1dc40 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c  Unusable to (t5,
1dc50 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20   t6)..**.** All 
1dc60 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 50  the tables in mP
1dc70 72 65 72 65 71 20 6d 75 73 74 20 62 65 20 73 63  rereq must be sc
1dc80 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  anned before the
1dc90 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
1dca0 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61   .** table. So a
1dcb0 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69  ny terms for whi
1dcc0 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73  ch all prerequis
1dcd0 69 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69  ites are satisfi
1dce0 65 64 20 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65  ed by .** mPrere
1dcf0 71 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69  q may be specifi
1dd00 65 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69  ed as "usable" i
1dd10 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78  n all calls to x
1dd20 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43  BestIndex. .** C
1dd30 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74  onversely, all t
1dd40 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62  ables in mUnusab
1dd50 6c 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  le must be scann
1dd60 65 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72  ed after the cur
1dd70 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20  rent.** virtual 
1dd80 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65  table, so any te
1dd90 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  rms for which th
1dda0 65 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  e prerequisites 
1ddb0 6f 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20  overlap with.** 
1ddc0 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64  mUnusable should
1ddd0 20 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69   always be confi
1dde0 67 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73  gured as "not-us
1ddf0 61 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49  able" for xBestI
1de00 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1de10 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1de20 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
1de30 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1de40 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
1de50 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
1de60 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
1de70 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 20   mPrereq,       
1de80 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
1de90 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
1dea0 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nned before this
1deb0 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73   one */.  Bitmas
1dec0 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20  k mUnusable     
1ded0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
1dee0 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
1def0 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73  anned after this
1df00 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   one */.){.  int
1df10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1df20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1df30 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68  urn code */.  Wh
1df40 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
1df50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
1df60 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
1df70 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
1df80 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1df90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1dfa0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1dfb0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1dfc0 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
1dfd0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1dfe0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1dff0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1e000 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
1e010 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
1e020 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c   search */.  sql
1e030 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1e040 2a 70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a  *p;       /* Obj
1e050 65 63 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ect to pass to x
1e060 42 65 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20  BestIndex() */. 
1e070 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1e080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e090 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1e0a0 72 61 69 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20  raints in p */. 
1e0b0 20 69 6e 74 20 62 49 6e 3b 20 20 20 20 20 20 20   int bIn;       
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e0d0 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73   True if plan us
1e0e0 65 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  es IN(...) opera
1e0f0 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  tor */.  WhereLo
1e100 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d  op *pNew;.  Bitm
1e110 61 73 6b 20 6d 42 65 73 74 3b 20 20 20 20 20 20  ask mBest;      
1e120 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1e130 65 73 20 75 73 65 64 20 62 79 20 62 65 73 74 20  es used by best 
1e140 70 6f 73 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f  possible plan */
1e150 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 3b 0a  .  u16 mNoOmit;.
1e160 0a 20 20 61 73 73 65 72 74 28 20 28 6d 50 72 65  .  assert( (mPre
1e170 72 65 71 20 26 20 6d 55 6e 75 73 61 62 6c 65 29  req & mUnusable)
1e180 3d 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20  ==0 );.  pWInfo 
1e190 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1e1a0 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
1e1b0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1e1c0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
1e1d0 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70  >pWC;.  pNew = p
1e1e0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1e1f0 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d   pSrc = &pWInfo-
1e200 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
1e210 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73 65  w->iTab];.  asse
1e220 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 53  rt( IsVirtual(pS
1e230 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20 70  rc->pTab) );.  p
1e240 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78   = allocateIndex
1e250 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43  Info(pParse, pWC
1e260 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72  , mUnusable, pSr
1e270 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  c, pBuilder->pOr
1e280 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 26 6d  derBy, .      &m
1e290 4e 6f 4f 6d 69 74 29 3b 0a 20 20 69 66 28 20 70  NoOmit);.  if( p
1e2a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1e2b0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1e2c0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1e2d0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c   0;.  pNew->wsFl
1e2e0 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
1e2f0 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77  UALTABLE;.  pNew
1e300 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
1e310 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1e320 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f  dFree = 0;.  nCo
1e330 6e 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43  nstraint = p->nC
1e340 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
1e350 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
1e360 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65  (pParse->db, pNe
1e370 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20  w, nConstraint) 
1e380 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1e390 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1e3a0 20 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   p);.    return 
1e3b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1e3c0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72  T;.  }..  /* Fir
1e3d0 73 74 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64  st call xBestInd
1e3e0 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20 63 6f  ex() with all co
1e3f0 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65  nstraints usable
1e400 2e 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43  . */.  WHERETRAC
1e410 45 28 30 78 38 30 30 2c 20 28 22 42 45 47 49 4e  E(0x800, ("BEGIN
1e420 20 25 73 2e 61 64 64 56 69 72 74 75 61 6c 28 29   %s.addVirtual()
1e430 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
1e440 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 57 48 45 52  >zName));.  WHER
1e450 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1e460 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c   VirtualOne: all
1e470 20 75 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20   usable\n"));.  
1e480 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1e490 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69  dVirtualOne(pBui
1e4a0 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41  lder, mPrereq, A
1e4b0 4c 4c 42 49 54 53 2c 20 30 2c 20 70 2c 20 6d 4e  LLBITS, 0, p, mN
1e4c0 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 0a 20  oOmit, &bIn);.. 
1e4d0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20   /* If the call 
1e4e0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1e4f0 77 69 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65  with all terms e
1e500 6e 61 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20  nabled produced 
1e510 61 20 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74  a plan.  ** that
1e520 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
1e530 65 20 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62  e any source tab
1e540 6c 65 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e  les (IOW: a plan
1e550 20 77 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c   with mBest==0),
1e560 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
1e570 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1e580 6d 61 6b 69 6e 67 20 61 6e 79 20 66 75 72 74 68  making any furth
1e590 65 72 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  er calls to xBes
1e5a0 74 49 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20 73  tIndex() .  ** s
1e5b0 69 6e 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61  ince they will a
1e5c0 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ll return the sa
1e5d0 6d 65 20 72 65 73 75 6c 74 20 28 69 66 20 74 68  me result (if th
1e5e0 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 20  e xBestIndex(). 
1e5f0 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
1e600 6f 6e 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a  on is sane). */.
1e610 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e620 5f 4f 4b 20 26 26 20 28 6d 42 65 73 74 20 3d 20  _OK && (mBest = 
1e630 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20  (pNew->prereq & 
1e640 7e 6d 50 72 65 72 65 71 29 29 21 3d 30 20 29 7b  ~mPrereq))!=0 ){
1e650 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72  .    int seenZer
1e660 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
1e670 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
1e680 70 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65  plan with no pre
1e690 72 65 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20  reqs seen */.   
1e6a0 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49   int seenZeroNoI
1e6b0 4e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  N = 0;         /
1e6c0 2a 20 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70  * Plan with no p
1e6d0 72 65 72 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e  rereqs and no IN
1e6e0 28 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20  (...) seen */.  
1e6f0 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 76 20    Bitmask mPrev 
1e700 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b  = 0;.    Bitmask
1e710 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a   mBestNoIn = 0;.
1e720 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
1e730 6c 61 6e 20 70 72 6f 64 75 63 65 64 20 62 79 20  lan produced by 
1e740 74 68 65 20 65 61 72 6c 69 65 72 20 63 61 6c 6c  the earlier call
1e750 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29   uses an IN(...)
1e760 20 74 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20   term, call.    
1e770 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20 61 67  ** xBestIndex ag
1e780 61 69 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77  ain, this time w
1e790 69 74 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d  ith IN(...) term
1e7a0 73 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20  s disabled. */. 
1e7b0 20 20 20 69 66 28 20 62 49 6e 20 29 7b 0a 20 20     if( bIn ){.  
1e7c0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1e7d0 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c  x40, ("  Virtual
1e7e0 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20  One: all usable 
1e7f0 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20  w/o IN\n"));.   
1e800 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1e810 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1e820 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64            pBuild
1e830 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c  er, mPrereq, ALL
1e840 42 49 54 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20  BITS, WO_IN, p, 
1e850 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a  mNoOmit, &bIn);.
1e860 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 49        assert( bI
1e870 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 42  n==0 );.      mB
1e880 65 73 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e  estNoIn = pNew->
1e890 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65  prereq & ~mPrere
1e8a0 71 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65  q;.      if( mBe
1e8b0 73 74 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20  stNoIn==0 ){.   
1e8c0 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20       seenZero = 
1e8d0 31 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a  1;.        seenZ
1e8e0 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  eroNoIN = 1;.   
1e8f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1e900 2f 2a 20 43 61 6c 6c 20 78 42 65 73 74 49 6e 64  /* Call xBestInd
1e910 65 78 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ex once for each
1e920 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75 65 20   distinct value 
1e930 6f 66 20 28 70 72 65 72 65 71 52 69 67 68 74 20  of (prereqRight 
1e940 26 20 7e 6d 50 72 65 72 65 71 29 20 0a 20 20 20  & ~mPrereq) .   
1e950 20 2a 2a 20 69 6e 20 74 68 65 20 73 65 74 20 6f   ** in the set o
1e960 66 20 74 65 72 6d 73 20 74 68 61 74 20 61 70 70  f terms that app
1e970 6c 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ly to the curren
1e980 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  t virtual table.
1e990 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1e9a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e9b0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1e9c0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78      Bitmask mNex
1e9d0 74 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20  t = ALLBITS;.   
1e9e0 20 20 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74     assert( mNext
1e9f0 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >0 );.      for(
1ea00 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
1ea10 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
1ea20 20 20 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20    Bitmask mThis 
1ea30 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  = (.            
1ea40 70 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74  pWC->a[p->aConst
1ea50 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
1ea60 66 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68  fset].prereqRigh
1ea70 74 20 26 20 7e 6d 50 72 65 72 65 71 0a 20 20 20  t & ~mPrereq.   
1ea80 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1ea90 69 66 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20  if( mThis>mPrev 
1eaa0 26 26 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29  && mThis<mNext )
1eab0 20 6d 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a   mNext = mThis;.
1eac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50        }.      mP
1ead0 72 65 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20  rev = mNext;.   
1eae0 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c     if( mNext==AL
1eaf0 4c 42 49 54 53 20 29 20 62 72 65 61 6b 3b 0a 20  LBITS ) break;. 
1eb00 20 20 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d       if( mNext==
1eb10 6d 42 65 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d  mBest || mNext==
1eb20 6d 42 65 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74  mBestNoIn ) cont
1eb30 69 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52  inue;.      WHER
1eb40 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1eb50 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72   VirtualOne: mPr
1eb60 65 76 3d 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d  ev=%04llx mNext=
1eb70 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20  %04llx\n",.     
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb90 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36    (sqlite3_uint6
1eba0 34 29 6d 50 72 65 76 2c 20 28 73 71 6c 69 74 65  4)mPrev, (sqlite
1ebb0 33 5f 75 69 6e 74 36 34 29 6d 4e 65 78 74 29 29  3_uint64)mNext))
1ebc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
1ebd0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1ebe0 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  One(.          p
1ebf0 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1ec00 2c 20 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c  , mNext|mPrereq,
1ec10 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20   0, p, mNoOmit, 
1ec20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &bIn);.      if(
1ec30 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d   pNew->prereq==m
1ec40 50 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20  Prereq ){.      
1ec50 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a    seenZero = 1;.
1ec60 20 20 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d          if( bIn=
1ec70 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49  =0 ) seenZeroNoI
1ec80 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  N = 1;.      }. 
1ec90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1eca0 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65  the calls to xBe
1ecb0 73 74 49 6e 64 65 78 28 29 20 69 6e 20 74 68 65  stIndex() in the
1ecc0 20 61 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20   above loop did 
1ecd0 6e 6f 74 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a  not find a plan.
1ece0 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75      ** that requ
1ecf0 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74  ires no source t
1ed00 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 28 69 2e  ables at all (i.
1ed10 65 2e 20 6f 6e 65 20 67 75 61 72 61 6e 74 65 65  e. one guarantee
1ed20 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75  d to be.    ** u
1ed30 73 61 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63  sable), make a c
1ed40 61 6c 6c 20 68 65 72 65 20 77 69 74 68 20 61 6c  all here with al
1ed50 6c 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  l source tables 
1ed60 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20  disabled */.    
1ed70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ed80 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30  K && seenZero==0
1ed90 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54   ){.      WHERET
1eda0 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1edb0 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64  irtualOne: all d
1edc0 69 73 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20  isabled\n"));.  
1edd0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1ede0 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1edf0 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c  .          pBuil
1ee00 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50  der, mPrereq, mP
1ee10 72 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f  rereq, 0, p, mNo
1ee20 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20  Omit, &bIn);.   
1ee30 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20     if( bIn==0 ) 
1ee40 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31  seenZeroNoIN = 1
1ee50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ee60 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20  If the calls to 
1ee70 78 42 65 73 74 49 6e 64 65 78 28 29 20 68 61 76  xBestIndex() hav
1ee80 65 20 73 6f 20 66 61 72 20 66 61 69 6c 65 64 20  e so far failed 
1ee90 74 6f 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20  to find a plan. 
1eea0 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69     ** that requi
1eeb0 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61  res no source ta
1eec0 62 6c 65 73 20 61 74 20 61 6c 6c 20 61 6e 64 20  bles at all and 
1eed0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20  does not use an 
1eee0 49 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f  IN(...).    ** o
1eef0 70 65 72 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20  perator, make a 
1ef00 66 69 6e 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62  final call to ob
1ef10 74 61 69 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20  tain one here.  
1ef20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1ef30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e  QLITE_OK && seen
1ef40 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20  ZeroNoIN==0 ){. 
1ef50 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1ef60 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1ef70 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c  lOne: all disabl
1ef80 65 64 20 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22  ed and w/o IN\n"
1ef90 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
1efa0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1efb0 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20  alOne(.         
1efc0 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72   pBuilder, mPrer
1efd0 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f  eq, mPrereq, WO_
1efe0 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20  IN, p, mNoOmit, 
1eff0 26 62 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  &bIn);.    }.  }
1f000 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54  ..  if( p->needT
1f010 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
1f020 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64  lite3_free(p->id
1f030 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
1f040 44 62 46 72 65 65 4e 4e 28 70 50 61 72 73 65 2d  DbFreeNN(pParse-
1f050 3e 64 62 2c 20 70 29 3b 0a 20 20 57 48 45 52 45  >db, p);.  WHERE
1f060 54 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 45  TRACE(0x800, ("E
1f070 4e 44 20 25 73 2e 61 64 64 56 69 72 74 75 61 6c  ND %s.addVirtual
1f080 28 29 2c 20 72 63 3d 25 64 5c 6e 22 2c 20 70 53  (), rc=%d\n", pS
1f090 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  rc->pTab->zName,
1f0a0 20 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   rc));.  return 
1f0b0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
1f0c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1f0d0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
1f0e0 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70  ** Add WhereLoop
1f0f0 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64   entries to hand
1f100 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68  le OR terms.  Th
1f110 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74  is works for eit
1f120 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72  her.** btrees or
1f130 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
1f140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1f150 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20  hereLoopAddOr(. 
1f160 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
1f170 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20 20  r *pBuilder, .  
1f180 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c  Bitmask mPrereq,
1f190 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75   .  Bitmask mUnu
1f1a0 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65  sable.){.  Where
1f1b0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
1f1c0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
1f1d0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1f1e0 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
1f1f0 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54   *pNew;.  WhereT
1f200 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43  erm *pTerm, *pWC
1f210 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  End;.  int rc = 
1f220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
1f230 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c   iCur;.  WhereCl
1f240 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57  ause tempWC;.  W
1f250 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1f260 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65  sSubBuild;.  Whe
1f270 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43  reOrSet sSum, sC
1f280 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  ur;.  struct Src
1f290 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1f2a0 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75  ;.  .  pWC = pBu
1f2b0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57  ilder->pWC;.  pW
1f2c0 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
1f2d0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e  pWC->nTerm;.  pN
1f2e0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1f2f0 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  New;.  memset(&s
1f300 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Sum, 0, sizeof(s
1f310 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d  Sum));.  pItem =
1f320 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
1f330 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
1f340 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  b;.  iCur = pIte
1f350 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66  m->iCursor;..  f
1f360 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
1f370 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26   pTerm<pWCEnd &&
1f380 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1f390 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
1f3a0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1f3b0 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a  tor & WO_OR)!=0.
1f3c0 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
1f3d0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
1f3e0 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73  able & pNew->mas
1f3f0 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29  kSelf)!=0 .    )
1f400 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61  {.      WhereCla
1f410 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  use * const pOrW
1f420 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  C = &pTerm->u.pO
1f430 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  rInfo->wc;.     
1f440 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e   WhereTerm * con
1f450 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70  st pOrWCEnd = &p
1f460 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e  OrWC->a[pOrWC->n
1f470 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65  Term];.      Whe
1f480 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
1f490 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  .      int once 
1f4a0 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 1;.      int i
1f4b0 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20  , j;.    .      
1f4c0 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75  sSubBuild = *pBu
1f4d0 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75  ilder;.      sSu
1f4e0 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20  bBuild.pOrderBy 
1f4f0 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42  = 0;.      sSubB
1f500 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73  uild.pOrSet = &s
1f510 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52  Cur;..      WHER
1f520 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
1f530 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  Begin processing
1f540 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22   OR-clause %p\n"
1f550 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  , pTerm));.     
1f560 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72   for(pOrTerm=pOr
1f570 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70  WC->a; pOrTerm<p
1f580 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d  OrWCEnd; pOrTerm
1f590 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1f5a0 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
1f5b0 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
1f5c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1f5d0 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
1f5e0 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
1f5f0 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
1f600 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
1f610 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
1f620 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
1f630 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20    tempWC.pWInfo 
1f640 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
1f650 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1f660 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
1f670 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f          tempWC.o
1f680 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
1f690 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
1f6a0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
1f6b0 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
1f6c0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
1f6d0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
1f6e0 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20  &tempWC;.       
1f6f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f700 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1f710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43      }.        sC
1f720 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66  ur.n = 0;.#ifdef
1f730 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
1f740 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45 52  LED.        WHER
1f750 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
1f760 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70  OR-term %d of %p
1f770 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d 73   has %d subterms
1f780 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  :\n", .         
1f790 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
1f7a0 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61  pOrTerm-pOrWC->a
1f7b0 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75  ), pTerm, sSubBu
1f7c0 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29  ild.pWC->nTerm))
1f7d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1f7e0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
1f7f0 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20  & 0x400 ){.     
1f800 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
1f810 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73 53 75  eClausePrint(sSu
1f820 62 42 75 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20  bBuild.pWC);.   
1f830 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69       }.#endif.#i
1f840 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f850 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1f860 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72         if( IsVir
1f870 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62  tual(pItem->pTab
1f880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
1f890 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1f8a0 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69  Virtual(&sSubBui
1f8b0 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e  ld, mPrereq, mUn
1f8c0 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  usable);.       
1f8d0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1f8e0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1f8f0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1f900 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75  AddBtree(&sSubBu
1f910 69 6c 64 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20  ild, mPrereq);. 
1f920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f930 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f940 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1f950 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1f960 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20  dOr(&sSubBuild, 
1f970 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62  mPrereq, mUnusab
1f980 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  le);.        }. 
1f990 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
1f9a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
1f9b0 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  sCur.n==0 );.   
1f9c0 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d       if( sCur.n=
1f9d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1f9e0 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
1f9f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fa00 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
1fa10 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nce ){.         
1fa20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53   whereOrMove(&sS
1fa30 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20  um, &sCur);.    
1fa40 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
1fa50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1fa60 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72           WhereOr
1fa70 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20  Set sPrev;.     
1fa80 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65       whereOrMove
1fa90 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b  (&sPrev, &sSum);
1faa0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
1fab0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1fac0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65   for(i=0; i<sPre
1fad0 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  v.n; i++){.     
1fae0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1faf0 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a  j<sCur.n; j++){.
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
1fb10 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75  ereOrInsert(&sSu
1fb20 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72  m, sPrev.a[i].pr
1fb30 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d  ereq | sCur.a[j]
1fb40 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  .prereq,.       
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
1fb70 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
1fb80 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d  .rRun, sCur.a[j]
1fb90 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20  .rRun),.        
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
1fbc0 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
1fbd0 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  nOut, sCur.a[j].
1fbe0 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20  nOut));.        
1fbf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1fc00 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1fc10 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
1fc20 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
1fc30 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
1fc40 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
1fc50 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1fc60 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b   WHERE_MULTI_OR;
1fc70 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  .      pNew->rSe
1fc80 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tup = 0;.      p
1fc90 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
1fca0 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  0;.      memset(
1fcb0 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a  &pNew->u, 0, siz
1fcc0 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20  eof(pNew->u));. 
1fcd0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63       for(i=0; rc
1fce0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1fcf0 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  <sSum.n; i++){. 
1fd00 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
1fd10 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d  : Currently sSum
1fd20 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65  .a[i].rRun is se
1fd30 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20  t to the sum of 
1fd40 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20  the costs.      
1fd50 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d    ** of all sub-
1fd60 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62  scans required b
1fd70 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48  y the OR-scan. H
1fd80 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72  owever, due to r
1fd90 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20  ounding.        
1fda0 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61  ** errors, it ma
1fdb0 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f  y be that the co
1fdc0 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61  st of the OR-sca
1fdd0 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74  n is equal to it
1fde0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73  s.        ** mos
1fdf0 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d  t expensive sub-
1fe00 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d  scan. Add the sm
1fe10 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20  allest possible 
1fe20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20  penalty .       
1fe30 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20   ** (equivalent 
1fe40 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74  to multiplying t
1fe50 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29  he cost by 1.07)
1fe60 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1fe70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73  .        ** this
1fe80 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
1fe90 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  . Otherwise, for
1fea0 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73   WHERE clauses s
1feb0 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20  uch as the.     
1fec0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
1fed0 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61  where there is a
1fee0 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a  n index on "y":.
1fef0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1ff00 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20     **     WHERE 
1ff10 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20  likelihood(x=?, 
1ff20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20  0.99) OR y=?.   
1ff30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1ff40 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d  ** the planner m
1ff50 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22  ay elect to "OR"
1ff60 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c   together a full
1ff70 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20  -table scan and 
1ff80 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
1ff90 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20  dex lookup. And 
1ffa0 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20  other similarly 
1ffb0 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f  odd results.  */
1ffc0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
1ffd0 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Run = sSum.a[i].
1ffe0 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20  rRun + 1;.      
1fff0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
20000 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20  Sum.a[i].nOut;. 
20010 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
20020 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  req = sSum.a[i].
20030 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20  prereq;.        
20040 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
20050 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
20060 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
20070 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
20080 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63  x200, ("End proc
20090 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65  essing OR-clause
200a0 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b   %p\n", pTerm));
200b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
200c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
200d0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
200e0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
200f0 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74  ll tables .*/.st
20100 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
20110 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f  opAddAll(WhereLo
20120 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
20130 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
20140 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
20150 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
20160 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 20  Bitmask mPrereq 
20170 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
20180 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
20190 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
201a0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
201b0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
201c0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
201d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
201e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
201f0 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62  em *pEnd = &pTab
20200 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  List->a[pWInfo->
20210 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74  nLevel];.  sqlit
20220 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
20230 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
20240 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20250 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  K;.  WhereLoop *
20260 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72  pNew;.  u8 prior
20270 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20  Jointype = 0;.. 
20280 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
20290 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
202a0 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
202b0 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
202c0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
202d0 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
202e0 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 70 42  Init(pNew);.  pB
202f0 75 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c 69 6d  uilder->iPlanLim
20300 69 74 20 3d 20 53 51 4c 49 54 45 5f 51 55 45 52  it = SQLITE_QUER
20310 59 5f 50 4c 41 4e 4e 45 52 5f 4c 49 4d 49 54 3b  Y_PLANNER_LIMIT;
20320 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70  .  for(iTab=0, p
20330 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  Item=pTabList->a
20340 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20 69 54  ; pItem<pEnd; iT
20350 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a  ab++, pItem++){.
20360 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75      Bitmask mUnu
20370 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70  sable = 0;.    p
20380 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62  New->iTab = iTab
20390 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
203a0 69 50 6c 61 6e 4c 69 6d 69 74 20 2b 3d 20 53 51  iPlanLimit += SQ
203b0 4c 49 54 45 5f 51 55 45 52 59 5f 50 4c 41 4e 4e  LITE_QUERY_PLANN
203c0 45 52 5f 4c 49 4d 49 54 5f 49 4e 43 52 3b 0a 20  ER_LIMIT_INCR;. 
203d0 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c     pNew->maskSel
203e0 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  f = sqlite3Where
203f0 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
20400 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d  >sMaskSet, pItem
20410 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
20420 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e  if( ((pItem->fg.
20430 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f  jointype|priorJo
20440 69 6e 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45  intype) & (JT_LE
20450 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
20460 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
20470 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
20480 72 75 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69  rue when pItem i
20490 73 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  s the FROM claus
204a0 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20  e term on the.  
204b0 20 20 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e      ** right-han
204c0 64 2d 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54  d-side of a LEFT
204d0 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20   or CROSS JOIN. 
204e0 20 2a 2f 0a 20 20 20 20 20 20 6d 50 72 65 72 65   */.      mPrere
204f0 71 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20  q = mPrior;.    
20500 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74  }.    priorJoint
20510 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e  ype = pItem->fg.
20520 6a 6f 69 6e 74 79 70 65 3b 0a 23 69 66 6e 64 65  jointype;.#ifnde
20530 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
20540 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
20550 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
20560 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
20570 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
20580 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20  t_item *p;.     
20590 20 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d   for(p=&pItem[1]
205a0 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
205b0 20 20 20 20 20 20 20 20 69 66 28 20 6d 55 6e 75          if( mUnu
205c0 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e  sable || (p->fg.
205d0 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
205e0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29  EFT|JT_CROSS)) )
205f0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 55 6e 75  {.          mUnu
20600 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33  sable |= sqlite3
20610 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
20620 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
20630 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  p->iCursor);.   
20640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20650 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
20660 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
20670 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
20680 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20   mUnusable);.   
20690 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
206a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
206b0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 20  TUALTABLE */.   
206c0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68   {.      rc = wh
206d0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
206e0 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
206f0 71 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  q);.    }.    if
20700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20710 26 26 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  && pBuilder->pWC
20720 2d 3e 68 61 73 4f 72 20 29 7b 0a 20 20 20 20 20  ->hasOr ){.     
20730 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
20740 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d  ddOr(pBuilder, m
20750 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c  Prereq, mUnusabl
20760 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50  e);.    }.    mP
20770 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61  rior |= pNew->ma
20780 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20  skSelf;.    if( 
20790 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
207a0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
207b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
207c0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ONE ){.        /
207d0 2a 20 57 65 20 68 69 74 20 74 68 65 20 71 75 65  * We hit the que
207e0 72 79 20 70 6c 61 6e 6e 65 72 20 73 65 61 72 63  ry planner searc
207f0 68 20 6c 69 6d 69 74 20 73 65 74 20 62 79 20 69  h limit set by i
20800 50 6c 61 6e 4c 69 6d 69 74 20 2a 2f 0a 20 20 20  PlanLimit */.   
20810 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
20820 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
20830 20 22 61 62 62 72 65 76 69 61 74 65 64 20 71 75   "abbreviated qu
20840 65 72 79 20 61 6c 67 6f 72 69 74 68 6d 20 73 65  ery algorithm se
20850 61 72 63 68 22 29 3b 0a 20 20 20 20 20 20 20 20  arch");.        
20860 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20870 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20880 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20890 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
208a0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
208b0 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74  db, pNew);.  ret
208c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
208d0 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65   Examine a Where
208e0 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61  Path (with the a
208f0 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ddition of the e
20900 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  xtra WhereLoop o
20910 66 20 74 68 65 20 36 74 68 0a 2a 2a 20 70 61 72  f the 6th.** par
20920 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20  ameters) to see 
20930 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f  if it outputs ro
20940 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  ws in the reques
20950 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  ted ORDER BY.** 
20960 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69  (or GROUP BY) wi
20970 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20  thout requiring 
20980 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
20990 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75  operation.  Retu
209a0 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e  rn N:.** .**   N
209b0 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66  >0:   N terms of
209c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
209d0 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69  ause are satisfi
209e0 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e  ed.**   N==0:  N
209f0 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  o terms of the O
20a00 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
20a10 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
20a20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e    N<0:   Unknown
20a30 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65   yet how many te
20a40 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20  rms of ORDER BY 
20a50 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66 69  might be satisfi
20a60 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ed.   .**.** Not
20a70 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e  e that processin
20a80 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55  g for WHERE_GROU
20a90 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49  PBY and WHERE_DI
20aa0 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20  STINCTBY is not 
20ab0 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57  as.** strict.  W
20ac0 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64  ith GROUP BY and
20ad0 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e   DISTINCT the on
20ae0 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69  ly requirement i
20af0 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61  s that.** equiva
20b00 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72  lent rows appear
20b10 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a   immediately adj
20b20 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f  acent to one ano
20b30 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a  ther.  GROUP BY.
20b40 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  ** and DISTINCT 
20b50 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72  do not require r
20b60 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e  ows to appear in
20b70 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
20b80 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a  order as long.**
20b90 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20 72   as equivalent r
20ba0 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  ows are grouped 
20bb0 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20  together.  Thus 
20bc0 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64  for GROUP BY and
20bd0 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65   DISTINCT.** the
20be0 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
20bf0 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69  can be matched i
20c00 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69  n any order.  Wi
20c10 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  th ORDER BY, the
20c20 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65   .** pOrderBy te
20c30 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63  rms must be matc
20c40 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65  hed in strict le
20c50 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65  ft-to-right orde
20c60 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20  r..*/.static i8 
20c70 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
20c80 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  esOrderBy(.  Whe
20c90 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
20ca0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
20cb0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
20cc0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
20cd0 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72    /* ORDER BY or
20ce0 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53   GROUP BY or DIS
20cf0 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20  TINCT clause to 
20d00 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65  check */.  Where
20d10 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20  Path *pPath,    
20d20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74   /* The WherePat
20d30 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  h to check */.  
20d40 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
20d50 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 47        /* WHERE_G
20d60 52 4f 55 50 42 59 20 6f 72 20 5f 44 49 53 54 49  ROUPBY or _DISTI
20d70 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44 45 52 42  NCTBY or _ORDERB
20d80 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 75 31 36  Y_LIMIT */.  u16
20d90 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20   nLoop,         
20da0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20db0 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68  entries in pPath
20dc0 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57  ->aLoop[] */.  W
20dd0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c  hereLoop *pLast,
20de0 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
20df0 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68   WhereLoop to th
20e00 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e  e end of pPath->
20e10 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74  aLoop[] */.  Bit
20e20 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20  mask *pRevMask  
20e30 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20     /* OUT: Mask 
20e40 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f  of WhereLoops to
20e50 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20   run in reverse 
20e60 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38  order */.){.  u8
20e70 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20   revSet;        
20e80 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
20e90 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20  ev is known */. 
20ea0 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20   u8 rev;        
20eb0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73         /* Compos
20ec0 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  ite sort order *
20ed0 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20  /.  u8 revIdx;  
20ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20ef0 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  ex sort order */
20f00 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69 73  .  u8 isOrderDis
20f10 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20  tinct;   /* All 
20f20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73  prior WhereLoops
20f30 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69   are order-disti
20f40 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74  nct */.  u8 dist
20f50 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f  inctColumns;   /
20f60 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f  * True if the lo
20f70 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f  op has UNIQUE NO
20f80 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
20f90 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20  /.  u8 isMatch; 
20fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f            /* iCo
20fb0 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74  lumn matches a t
20fc0 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
20fd0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
20fe0 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b 20 20 20  u16 eqOpMask;   
20ff0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64        /* Allowed
21000 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74   equality operat
21010 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65  ors */.  u16 nKe
21020 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  yCol;          /
21030 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
21040 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65  columns in pInde
21050 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75  x */.  u16 nColu
21060 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
21070 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
21080 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20  ordered columns 
21090 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
210a0 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20    u16 nOrderBy; 
210b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
210c0 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  r terms in the O
210d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
210e0 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
210f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
21100 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ex of WhereLoop 
21110 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70  in pPath being p
21120 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
21130 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
21140 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21150 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
21160 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
21170 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
21180 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65   for current Whe
21190 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  reLoop */.  int 
211a0 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
211b0 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75    /* A column nu
211c0 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c  mber within tabl
211d0 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72  e iCur */.  Wher
211e0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30  eLoop *pLoop = 0
211f0 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65  ; /* Current Whe
21200 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f  reLoop being pro
21210 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65  cessed. */.  Whe
21220 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
21230 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
21240 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
21250 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
21260 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20  r *pOBExpr;     
21270 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
21280 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ion from the ORD
21290 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
212a0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
212b0 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41  ;       /* COLLA
212c0 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d  TE function from
212d0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
212e0 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e  use term */.  In
212f0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
21300 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
21310 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21320 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69   pLoop */.  sqli
21330 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
21340 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  ->pParse->db;  /
21350 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
21360 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ction */.  Bitma
21370 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20  sk obSat = 0;   
21380 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
21390 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
213a0 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  fied so far */. 
213b0 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b   Bitmask obDone;
213c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
213d0 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
213e0 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
213f0 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  k orderDistinctM
21400 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ask;  /* Mask of
21410 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65   all well-ordere
21420 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74  d loops */.  Bit
21430 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20  mask ready;     
21440 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
21450 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20   of inner loops 
21460 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  */..  /*.  ** We
21470 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
21480 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20  op is "one-row" 
21490 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  if it generates 
214a0 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
214b0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74  .  ** row of out
214c0 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f  put.  A WhereLoo
214d0 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20  p is one-row if 
214e0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
214f0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
21500 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64   **  (a) All ind
21510 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68  ex columns match
21520 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55   with WHERE_COLU
21530 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29  MN_EQ..  **  (b)
21540 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e   The index is un
21550 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68  ique.  ** Any Wh
21560 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20  ereLoop with an 
21570 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
21580 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
21590 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72  e rowid is one-r
215a0 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f  ow..  ** Every o
215b0 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
215c0 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57   will have the W
215d0 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20  HERE_ONEROW bit 
215e0 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a  set in wsFlags..
215f0 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    **.  ** We say
21600 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
21610 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  s "order-distinc
21620 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  t" if the set of
21630 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20   columns from.  
21640 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  ** that WhereLoo
21650 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  p that are in th
21660 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
21670 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
21680 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  for every.  ** r
21690 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ow of the WhereL
216a0 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d  oop.  Every one-
216b0 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  row WhereLoop is
216c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
216d0 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   ** order-distin
216e0 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f  ct.   A WhereLoo
216f0 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f  p that has no co
21700 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44  lumns in the ORD
21710 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
21720 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64  * is not order-d
21730 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f  istinct. To be o
21740 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73  rder-distinct is
21750 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73   not quite the s
21760 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a  ame as being.  *
21770 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61  * UNIQUE since a
21780 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f   UNIQUE column o
21790 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65  r index can have
217a0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74   multiple rows t
217b0 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55  hat .  ** are NU
217c0 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75  LL and NULL valu
217d0 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  es are equivalen
217e0 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  t for the purpos
217f0 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69  e of order-disti
21800 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20  nct..  ** To be 
21810 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20  order-distinct, 
21820 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  the columns must
21830 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e   be UNIQUE and N
21840 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  OT NULL..  **.  
21850 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
21860 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61   a table is alwa
21870 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  ys UNIQUE and NO
21880 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76  T NULL so whenev
21890 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69  er the.  ** rowi
218a0 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  d appears in the
218b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
218c0 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
218d0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
218e0 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
218f0 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  lly order-distin
21900 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65  ct..  */..  asse
21910 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
21920 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26  );.  if( nLoop &
21930 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  & OptimizationDi
21940 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
21950 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
21960 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
21970 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
21980 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74  erBy->nExpr;.  t
21990 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42  estcase( nOrderB
219a0 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  y==BMS-1 );.  if
219b0 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31  ( nOrderBy>BMS-1
219c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
219d0 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   Cannot optimize
219e0 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52   overly large OR
219f0 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f  DER BYs */.  isO
21a00 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
21a10 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53  ;.  obDone = MAS
21a20 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31  KBIT(nOrderBy)-1
21a30 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ;.  orderDistinc
21a40 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61  tMask = 0;.  rea
21a50 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f 70 4d 61  dy = 0;.  eqOpMa
21a60 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20 57 4f 5f  sk = WO_EQ | WO_
21a70 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a  IS | WO_ISNULL;.
21a80 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
21a90 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
21aa0 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70 4d 61 73  _LIMIT ) eqOpMas
21ab0 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20 66 6f  k |= WO_IN;.  fo
21ac0 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
21ad0 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
21ae0 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
21af0 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
21b00 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
21b10 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
21b20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
21b30 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3c  ;.    if( iLoop<
21b40 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 70  nLoop ){.      p
21b50 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d 3e 61 4c  Loop = pPath->aL
21b60 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
21b70 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
21b80 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
21b90 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74 69 6e 75  _LIMIT ) continu
21ba0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
21bb0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 61 73      pLoop = pLas
21bc0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
21bd0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
21be0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
21bf0 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  ABLE ){.      if
21c00 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  ( pLoop->u.vtab.
21c10 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61  isOrdered ) obSa
21c20 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20  t = obDone;.    
21c30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
21c40 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d  se{.      pLoop-
21c50 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c  >u.btree.nIdxCol
21c60 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
21c70 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
21c80 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
21c90 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
21ca0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
21cb0 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
21cc0 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
21cd0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
21ce0 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
21cf0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
21d00 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
21d10 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
21d20 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
21d30 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
21d40 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
21d50 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
21d60 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
21d70 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
21d80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
21d90 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
21da0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
21db0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
21dc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
21dd0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
21de0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
21df0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
21e00 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
21e10 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
21e20 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
21e30 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
21e40 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
21e50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21e60 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
21e70 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
21e80 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
21e90 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
21ea0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
21ec0 61 64 79 2c 20 65 71 4f 70 4d 61 73 6b 2c 20 30  ady, eqOpMask, 0
21ed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
21ee0 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
21ef0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
21f00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
21f10 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _IN ){.        /
21f20 2a 20 49 4e 20 74 65 72 6d 73 20 61 72 65 20 6f  * IN terms are o
21f30 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 73 6f  nly valid for so
21f40 72 74 69 6e 67 20 69 6e 20 74 68 65 20 4f 52 44  rting in the ORD
21f50 45 52 20 42 59 20 4c 49 4d 49 54 20 0a 20 20 20  ER BY LIMIT .   
21f60 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61       ** optimiza
21f70 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 6e 20 6f  tion, and then o
21f80 6e 6c 79 20 69 66 20 74 68 65 79 20 61 72 65 20  nly if they are 
21f90 61 63 74 75 61 6c 6c 79 20 75 73 65 64 0a 20 20  actually used.  
21fa0 20 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20        ** by the 
21fb0 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20  query plan */.  
21fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77 63        assert( wc
21fd0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
21fe0 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29  _ORDERBY_LIMIT )
21ff0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
22000 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  0; j<pLoop->nLTe
22010 72 6d 20 26 26 20 70 54 65 72 6d 21 3d 70 4c 6f  rm && pTerm!=pLo
22020 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a  op->aLTerm[j]; j
22030 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  ++){}.        if
22040 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  ( j>=pLoop->nLTe
22050 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  rm ) continue;. 
22060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22070 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
22080 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
22090 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d  )!=0 && pOBExpr-
220a0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
220b0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
220c0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74  e3ExprCollSeqMat
220d0 63 68 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  ch(pWInfo->pPars
220e0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
220f0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
22100 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 54 65 72  a[i].pExpr, pTer
22110 6d 2d 3e 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a  m->pExpr)==0 ){.
22120 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
22130 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
22140 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22150 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  pTerm->pExpr->op
22160 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
22170 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c   }.      obSat |
22180 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
22190 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c    }..    if( (pL
221a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
221b0 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20  HERE_ONEROW)==0 
221c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
221d0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
221e0 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20  ERE_IPK ){.     
221f0 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
22200 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d         nKeyCol =
22210 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c   0;.        nCol
22220 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  umn = 1;.      }
22230 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65 78  else if( (pIndex
22240 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
22250 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20  e.pIndex)==0 || 
22260 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
22270 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ed ){.        re
22280 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
22290 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65  lse{.        nKe
222a0 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e  yCol = pIndex->n
222b0 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
222c0 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  nColumn = pIndex
222d0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
222e0 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
222f0 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c  mn==nKeyCol+1 ||
22300 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65   !HasRowid(pInde
22310 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20  x->pTable) );.  
22320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
22330 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ndex->aiColumn[n
22340 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f  Column-1]==XN_RO
22350 57 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  WID.            
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
22370 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65   !HasRowid(pInde
22380 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20  x->pTable));.   
22390 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
223a0 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49  inct = IsUniqueI
223b0 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
223c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
223d0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
223e0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
223f0 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77  index and deal w
22400 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20  ith the ones.   
22410 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e     ** that are n
22420 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  ot constrained b
22430 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20  y == or IN..    
22440 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d    */.      rev =
22450 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20   revSet = 0;.   
22460 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
22470 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ns = 0;.      fo
22480 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e  r(j=0; j<nColumn
22490 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
224a0 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a  u8 bOnce = 1; /*
224b0 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65   True to run the
224c0 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68   ORDER BY search
224d0 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20   loop */..      
224e0 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 70 4c 6f    assert( j>=pLo
224f0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
22500 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
22510 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a  (pLoop->aLTerm[j
22520 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d  ]==0)==(j<pLoop-
22530 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20 20 20 20  >nSkip).        
22540 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
22550 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
22560 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d  nEq && j>=pLoop-
22570 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  >nSkip ){.      
22580 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 4c      u16 eOp = pL
22590 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e  oop->aLTerm[j]->
225a0 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20 20 20 20  eOperator;..    
225b0 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76        /* Skip ov
225c0 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 61 6e 64  er == and IS and
225d0 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73 2e 20 20   ISNULL terms.  
225e0 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e 20 74 65  (Also skip IN te
225f0 72 6d 73 20 77 68 65 6e 0a 20 20 20 20 20 20 20  rms when.       
22600 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57 48 45 52     ** doing WHER
22610 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
22620 70 72 6f 63 65 73 73 69 6e 67 29 2e 20 0a 20 20  processing). .  
22630 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
22640 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63       ** If the c
22650 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 61  urrent term is a
22660 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 28 28   column of an ((
22670 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 2e  ?,?) IN (SELECT.
22680 2e 2e 29 29 20 0a 20 20 20 20 20 20 20 20 20 20  ..)) .          
22690 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f  ** expression fo
226a0 72 20 77 68 69 63 68 20 74 68 65 20 53 45 4c 45  r which the SELE
226b0 43 54 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  CT returns more 
226c0 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c  than one column,
226d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
226e0 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 74  eck that it is t
226f0 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 20 75  he only column u
22700 73 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  sed by this loop
22710 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
22720 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69 74 20         ** if it 
22730 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f 20 6f 72  is one of two or
22740 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f 66 20 74   more, none of t
22750 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61 6e 20 62  he columns can b
22760 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
22770 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 6d 61 74  onsidered to mat
22780 63 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 74  ch an ORDER BY t
22790 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  erm.  */.       
227a0 20 20 20 69 66 28 20 28 65 4f 70 20 26 20 65 71     if( (eOp & eq
227b0 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  OpMask)!=0 ){.  
227c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f            if( eO
227d0 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
227e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
227f0 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
22800 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
22810 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
22820 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
22830 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22840 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
22850 65 3b 20 20 0a 20 20 20 20 20 20 20 20 20 20 7d  e;  .          }
22860 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
22870 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 29 7b 0a  eOp & WO_IN) ){.
22880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22890 4c 57 41 59 53 28 29 20 6a 75 73 74 69 66 69 63  LWAYS() justific
228a0 61 74 69 6f 6e 3a 20 65 4f 70 20 69 73 20 61 6e  ation: eOp is an
228b0 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74   equality operat
228c0 6f 72 20 64 75 65 20 74 6f 20 74 68 65 0a 20 20  or due to the.  
228d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6a 3c 70            ** j<p
228e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
228f0 71 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 62 6f  q constraint abo
22900 76 65 2e 20 20 41 6e 79 20 65 71 75 61 6c 69 74  ve.  Any equalit
22910 79 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  y other.        
22920 20 20 20 20 2a 2a 20 74 68 61 6e 20 57 4f 5f 49      ** than WO_I
22930 4e 20 69 73 20 63 61 70 74 75 72 65 64 20 62 79  N is captured by
22940 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 69   the previous "i
22950 66 22 2e 20 20 53 6f 20 74 68 69 73 20 6f 6e 65  f".  So this one
22960 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
22970 61 6c 77 61 79 73 20 68 61 73 20 74 6f 20 62 65  always has to be
22980 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20 20 20 20   WO_IN. */.     
22990 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
229a0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
229b0 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  j]->pExpr;.     
229c0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 2b 31         for(i=j+1
229d0 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ; i<pLoop->u.btr
229e0 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20  ee.nEq; i++){.  
229f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22a00 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  pLoop->aLTerm[i]
22a10 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20  ->pExpr==pX ){. 
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
22a30 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 61  ssert( (pLoop->a
22a40 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70 65 72 61  LTerm[i]->eOpera
22a50 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20 29 3b 0a  tor & WO_IN) );.
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a70 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  bOnce = 0;.     
22a80 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
22a90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22aa0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
22ab0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22ac0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
22ad0 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  * Get the column
22ae0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74   number in the t
22af0 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61  able (iColumn) a
22b00 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20  nd sort order.  
22b10 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78        ** (revIdx
22b20 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63  ) for the j-th c
22b30 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
22b40 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ex..        */. 
22b50 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
22b60 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
22b70 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
22b80 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
22b90 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
22ba0 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
22bb0 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
22bc0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
22bd0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  Index->pTable->i
22be0 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d  PKey ) iColumn =
22bf0 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20   XN_ROWID;.     
22c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22c10 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e      iColumn = XN
22c20 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20  _ROWID;.        
22c30 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20    revIdx = 0;.  
22c40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
22c50 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61   /* An unconstra
22c60 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ined column that
22c70 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d   might be NULL m
22c80 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20  eans that this. 
22c90 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c         ** WhereL
22ca0 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d  oop is not well-
22cb0 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  ordered.        
22cc0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
22cd0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20  sOrderDistinct. 
22ce0 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75          && iColu
22cf0 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  mn>=0.         &
22d00 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j>=pLoop->u.bt
22d10 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
22d20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62   && pIndex->pTab
22d30 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
22d40 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
22d50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22d60 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
22d70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
22d80 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ..        /* Fin
22d90 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  d the ORDER BY t
22da0 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70  erm that corresp
22db0 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68  onds to the j-th
22dc0 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
22dd0 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
22de0 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52  and mark that OR
22df0 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20  DER BY term off 
22e00 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22e10 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b      isMatch = 0;
22e20 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
22e30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72  ; bOnce && i<nOr
22e40 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
22e50 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
22e60 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
22e70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22e80 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
22e90 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
22ea0 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
22eb0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
22ec0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22ed0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22ee0 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
22ef0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22f00 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
22f10 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
22f20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22f30 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28   (wctrlFlags & (
22f40 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48  WHERE_GROUPBY|WH
22f50 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29  ERE_DISTINCTBY))
22f60 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b  ==0 ) bOnce = 0;
22f70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
22f80 43 6f 6c 75 6d 6e 3e 3d 58 4e 5f 52 4f 57 49 44  Column>=XN_ROWID
22f90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22fa0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
22fb0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
22fc0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
22fd0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
22fe0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
22ff0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23000 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
23010 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
23020 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
23030 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
23040 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
23050 20 2a 70 49 64 78 45 78 70 72 20 3d 20 70 49 6e   *pIdxExpr = pIn
23060 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  dex->aColExpr->a
23070 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
23080 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
23090 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
230a0 70 28 70 4f 42 45 78 70 72 2c 20 70 49 64 78 45  p(pOBExpr, pIdxE
230b0 78 70 72 2c 20 69 43 75 72 29 20 29 7b 0a 20 20  xpr, iCur) ){.  
230c0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
230d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
230e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
230f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
23100 6f 6c 75 6d 6e 21 3d 58 4e 5f 52 4f 57 49 44 20  olumn!=XN_ROWID 
23110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
23120 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
23130 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 49 6e  prNNCollSeq(pWIn
23140 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
23150 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
23160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
23170 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
23180 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
23190 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  pIndex->azColl[j
231a0 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ])!=0 ) continue
231b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
231c0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
231d0 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d  .btree.nIdxCol =
231e0 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20   j+1;.          
231f0 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20  isMatch = 1;.   
23200 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23220 69 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28  if( isMatch && (
23230 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
23240 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29  RE_GROUPBY)==0 )
23250 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  {.          /* M
23260 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72  ake sure the sor
23270 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61  t order is compa
23280 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45  tible in an ORDE
23290 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
232a0 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f         ** Sort o
232b0 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61  rder is irreleva
232c0 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42  nt for a GROUP B
232d0 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20  Y clause. */.   
232e0 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65         if( revSe
232f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
23300 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49   if( (rev ^ revI
23310 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61  dx)!=pOrderBy->a
23320 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
23330 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
23340 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23350 20 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20            rev = 
23360 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42  revIdx ^ pOrderB
23370 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
23380 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  r;.            i
23390 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61  f( rev ) *pRevMa
233a0 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c  sk |= MASKBIT(iL
233b0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oop);.          
233c0 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20    revSet = 1;.  
233d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
233e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
233f0 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
23400 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
23410 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20  ==XN_ROWID ){.  
23420 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
23430 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  se( distinctColu
23440 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mns==0 );.      
23450 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
23460 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  lumns = 1;.     
23470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23480 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
23490 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  T(i);.        }e
234a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
234b0 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64  * No match found
234c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
234d0 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79  ( j==0 || j<nKey
234e0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
234f0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
23500 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20  rderDistinct!=0 
23510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
23520 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
23530 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
23540 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23550 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23560 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f   } /* end Loop o
23570 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f  ver all index co
23580 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69  lumns */.      i
23590 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  f( distinctColum
235a0 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ns ){.        te
235b0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
235c0 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20  istinct==0 );.  
235d0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
235e0 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20  tinct = 1;.     
235f0 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d   }.    } /* end-
23600 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a  if not one-row *
23610 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  /..    /* Mark o
23620 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44  ff any other ORD
23630 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
23640 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70   reference pLoop
23650 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72   */.    if( isOr
23660 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  derDistinct ){. 
23670 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e       orderDistin
23680 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d  ctMask |= pLoop-
23690 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
236a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
236b0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
236c0 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
236d0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65       Bitmask mTe
236e0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
236f0 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
23700 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
23710 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65         p = pOrde
23720 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
23730 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d  .        mTerm =
23740 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
23750 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e  rUsage(&pWInfo->
23760 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20  sMaskSet,p);.   
23770 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d       if( mTerm==
23780 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
23790 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29  rIsConstant(p) )
237a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
237b0 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f     if( (mTerm&~o
237c0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
237d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
237e0 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
237f0 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
23800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23810 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f   } /* End the lo
23820 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72  op over all Wher
23830 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65  eLoops from oute
23840 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69  r-most down to i
23850 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69  nner-most */.  i
23860 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65  f( obSat==obDone
23870 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f   ) return (i8)nO
23880 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69  rderBy;.  if( !i
23890 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
238a0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64  {.    for(i=nOrd
238b0 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  erBy-1; i>0; i--
238c0 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
238d0 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20   m = MASKBIT(i) 
238e0 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28  - 1;.      if( (
238f0 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65  obSat&m)==m ) re
23900 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
23910 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
23920 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
23930 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  ./*.** If the WH
23940 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
23950 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d   is set in the m
23960 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71  ask passed to sq
23970 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23980 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65  ),.** the planne
23990 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  r assumes that t
239a0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72  he specified pOr
239b0 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63  derBy list is ac
239c0 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a  tually a GROUP.*
239d0 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e  * BY clause - an
239e0 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74  d so any order t
239f0 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20  hat groups rows 
23a00 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69  as required sati
23a10 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71  sfies the.** req
23a20 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  uest..**.** Norm
23a30 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61  ally, in this ca
23a40 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
23a50 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61  sible for the ca
23a60 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e  ller to determin
23a70 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  e.** whether or 
23a80 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65  not the rows are
23a90 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65   really being de
23aa0 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65  livered in sorte
23ab0 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a  d order, or.** j
23ac0 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ust in some othe
23ad0 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f  r order that pro
23ae0 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72  vides the requir
23af0 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77  ed grouping. How
23b00 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  ever,.** if the 
23b10 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
23b20 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70  P flag is also p
23b30 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
23b40 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68  WhereBegin(), th
23b50 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
23b60 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
23b70 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d on the returne
23b80 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65  d WhereInfo obje
23b90 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a  ct. It returns.*
23ba0 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f  * true if the ro
23bb0 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62  ws really will b
23bc0 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20  e sorted in the 
23bd0 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c  specified order,
23be0 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68   or false.** oth
23bf0 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erwise..**.** Fo
23c00 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
23c10 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
23c20 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
23c30 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20  t1(x, Y);.**.** 
23c40 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  then.**.**   SEL
23c50 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
23c60 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52  OUP BY x,y ORDER
23c70 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73   BY x,y;   -- Is
23c80 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20  Sorted()==1.**  
23c90 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
23ca0 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f  1 GROUP BY y,x O
23cb0 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d  RDER BY y,x;   -
23cc0 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a  - IsSorted()==0.
23cd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
23ce0 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72  ereIsSorted(Wher
23cf0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
23d00 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
23d10 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
23d20 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
23d30 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
23d40 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
23d50 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
23d60 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
23d70 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a  nfo->sorted;.}..
23d80 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
23d90 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72  E_ENABLED./* For
23da0 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
23db0 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  nly: */.static c
23dc0 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65  onst char *where
23dd0 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61  PathName(WherePa
23de0 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e  th *pPath, int n
23df0 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  Loop, WhereLoop 
23e00 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69  *pLast){.  stati
23e10 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d  c char zName[65]
23e20 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
23e30 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69  (i=0; i<nLoop; i
23e40 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  ++){ zName[i] = 
23e50 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d  pPath->aLoop[i]-
23e60 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c  >cId; }.  if( pL
23e70 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d  ast ) zName[i++]
23e80 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20   = pLast->cId;. 
23e90 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20   zName[i] = 0;. 
23ea0 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
23eb0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
23ec0 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f  eturn the cost o
23ed0 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72  f sorting nRow r
23ee0 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ows, assuming th
23ef0 61 74 20 74 68 65 20 6b 65 79 73 20 68 61 76 65  at the keys have
23f00 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f   .** nOrderby co
23f10 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74  lumns and that t
23f20 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64  he first nSorted
23f30 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72   columns are alr
23f40 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  eady in.** order
23f50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
23f60 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43  st whereSortingC
23f70 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  ost(.  WhereInfo
23f80 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45   *pWInfo,.  LogE
23f90 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e  st nRow,.  int n
23fa0 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e  OrderBy,.  int n
23fb0 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54  Sorted.){.  /* T
23fc0 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64  UNING: Estimated
23fd0 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20   cost of a full 
23fe0 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77  external sort, w
23ff0 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20  here N is .  ** 
24000 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
24010 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20  ws to sort is:. 
24020 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
24030 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
24040 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  (N))..  ** .  **
24050 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65   Or, if the orde
24060 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20  r-by clause has 
24070 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79  X terms but only
24080 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a   the last Y .  *
24090 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20  * terms are out 
240a0 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62  of order, then b
240b0 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c  lock-sorting wil
240c0 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20  l reduce the .  
240d0 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20  ** sorting cost 
240e0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
240f0 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
24100 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58  * log(N)) * (Y/X
24110 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
24120 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d  (Y/X) term is im
24130 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
24140 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72  stack variable r
24150 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77  Scale.  ** below
24160 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  .  */.  LogEst r
24170 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74  Scale, rSortCost
24180 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64  ;.  assert( nOrd
24190 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71  erBy>0 && 66==sq
241a0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
241b0 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73   );.  rScale = s
241c0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f  qlite3LogEst((nO
241d0 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a  rderBy-nSorted)*
241e0 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20  100/nOrderBy) - 
241f0 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20  66;.  rSortCost 
24200 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c 65 20  = nRow + rScale 
24210 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74  + 16;..  /* Mult
24220 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29 20 77  iple by log(M) w
24230 68 65 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75  here M is the nu
24240 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
24250 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68  ows..  ** Use th
24260 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20 69 66  e LIMIT for M if
24270 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a   it is smaller *
24280 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  /.  if( (pWInfo-
24290 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
242a0 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d  ERE_USE_LIMIT)!=
242b0 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69  0 && pWInfo->iLi
242c0 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20  mit<nRow ){.    
242d0 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69  nRow = pWInfo->i
242e0 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f  Limit;.  }.  rSo
242f0 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67  rtCost += estLog
24300 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e  (nRow);.  return
24310 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f   rSortCost;.}../
24320 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c  *.** Given the l
24330 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
24340 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e   objects at pWIn
24350 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73  fo->pLoops, this
24360 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65   routine.** atte
24370 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65  mpts to find the
24380 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
24390 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61  h that visits ea
243a0 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20  ch WhereLoop.** 
243b0 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68  once.  This path
243c0 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20   is then loaded 
243d0 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d  into the pWInfo-
243e0 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c  >a[].pWLoop fiel
243f0 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65  ds..**.** Assume
24400 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20   that the total 
24410 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
24420 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
24430 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65  need to be sorte
24440 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f  d.** will be nRo
24450 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a  wEst (in the 10*
24460 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74  log2 representat
24470 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72  ion).  Or, ignor
24480 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73  e sorting.** cos
24490 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30  ts if nRowEst==0
244a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
244b0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
244c0 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  ess or SQLITE_NO
244d0 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  MEM of a memory 
244e0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72  allocation.** er
244f0 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
24500 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
24510 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49  athSolver(WhereI
24520 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67  nfo *pWInfo, Log
24530 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20  Est nRowEst){.  
24540 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20  int mxChoice;   
24550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
24560 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
24570 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68  imultaneous path
24580 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69  s tracked */.  i
24590 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt nLoop;       
245a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
245b0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
245c0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72  he join */.  Par
245d0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
245e0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
245f0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
24600 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
24610 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24620 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
24630 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ion */.  int iLo
24640 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
24650 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
24660 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d  er over the term
24670 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
24680 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20  .  int ii, jj;  
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
246a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
246b0 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20  .  int mxI = 0; 
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
246d0 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e  Index of next en
246e0 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a  try to replace *
246f0 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
24700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24710 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
24720 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
24730 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43   */.  LogEst mxC
24740 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ost = 0;        
24750 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20  /* Maximum cost 
24760 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68  of a set of path
24770 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78  s */.  LogEst mx
24780 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20  Unsorted = 0;   
24790 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f   /* Maximum unso
247a0 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73  rted cost of a s
247b0 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20  et of path */.  
247c0 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20  int nTo, nFrom; 
247d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
247e0 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74  ber of valid ent
247f0 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e  ries in aTo[] an
24800 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57  d aFrom[] */.  W
24810 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b  herePath *aFrom;
24820 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
24830 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74  nFrom paths at t
24840 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65  he previous leve
24850 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
24860 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *aTo;          
24870 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74   /* The nTo best
24880 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75   paths at the cu
24890 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  rrent level */. 
248a0 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f   WherePath *pFro
248b0 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  m;         /* An
248c0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f   element of aFro
248d0 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  m[] that we are 
248e0 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
248f0 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20  WherePath *pTo; 
24900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
24910 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d  element of aTo[]
24920 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
24930 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
24940 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
24950 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
24960 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
24970 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72  bjects */.  Wher
24980 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20  eLoop **pX;     
24990 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
249a0 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70   divy up the pSp
249b0 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ace memory */.  
249c0 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73  LogEst *aSortCos
249d0 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72  t = 0;    /* Sor
249e0 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c  ting and partial
249f0 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a   sorting costs *
24a00 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
24a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24a20 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   Temporary memor
24a30 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72  y used by this r
24a40 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
24a50 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  nSpace;         
24a60 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
24a70 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
24a80 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a  d at pSpace */..
24a90 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
24aa0 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
24ab0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
24ac0 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  nLoop = pWInfo->
24ad0 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e  nLevel;.  /* TUN
24ae0 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20  ING: For simple 
24af0 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68  queries, only th
24b00 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74  e best path is t
24b10 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  racked..  ** For
24b20 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68   2-way joins, th
24b30 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61  e 5 best paths a
24b40 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a  re followed..  *
24b50 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33  * For joins of 3
24b60 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c   or more tables,
24b70 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65   track the 10 be
24b80 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78  st paths */.  mx
24b90 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c  Choice = (nLoop<
24ba0 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70  =1) ? 1 : (nLoop
24bb0 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20  ==2 ? 5 : 10);. 
24bc0 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d   assert( nLoop<=
24bd0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
24be0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52  ->nSrc );.  WHER
24bf0 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22  ETRACE(0x002, ("
24c00 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65  ---- begin solve
24c10 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29  r.  (nRowEst=%d)
24c20 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
24c30 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74  .  /* If nRowEst
24c40 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65   is zero and the
24c50 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
24c60 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65  Y clause, ignore
24c70 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a   it. In this.  *
24c80 2a 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f  * case the purpo
24c90 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20  se of this call 
24ca0 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  is to estimate t
24cb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
24cc0 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  s returned.  ** 
24cd0 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71  by the overall q
24ce0 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20  uery. Once this 
24cf0 65 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65  estimate has bee
24d00 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20  n obtained, the 
24d10 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c  caller.  ** will
24d20 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e   invoke this fun
24d30 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74  ction a second t
24d40 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65  ime, passing the
24d50 20 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65   estimate as the
24d60 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61  .  ** nRowEst pa
24d70 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69  rameter.  */.  i
24d80 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
24d90 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73  rBy==0 || nRowEs
24da0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64  t==0 ){.    nOrd
24db0 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
24dc0 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  e{.    nOrderBy 
24dd0 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  = pWInfo->pOrder
24de0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a  By->nExpr;.  }..
24df0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
24e00 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61  d initialize spa
24e10 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f  ce for aTo, aFro
24e20 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b  m and aSortCost[
24e30 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20  ] */.  nSpace = 
24e40 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74  (sizeof(WherePat
24e50 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  h)+sizeof(WhereL
24e60 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43  oop*)*nLoop)*mxC
24e70 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63  hoice*2;.  nSpac
24e80 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  e += sizeof(LogE
24e90 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a  st) * nOrderBy;.
24ea0 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
24eb0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
24ec0 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69  db, nSpace);.  i
24ed0 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72  f( pSpace==0 ) r
24ee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
24ef0 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d  EM_BKPT;.  aTo =
24f00 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70   (WherePath*)pSp
24f10 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61  ace;.  aFrom = a
24f20 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d  To+mxChoice;.  m
24f30 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20  emset(aFrom, 0, 
24f40 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29  sizeof(aFrom[0])
24f50 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65  );.  pX = (Where
24f60 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78  Loop**)(aFrom+mx
24f70 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69  Choice);.  for(i
24f80 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46  i=mxChoice*2, pF
24f90 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69  rom=aTo; ii>0; i
24fa0 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58  i--, pFrom++, pX
24fb0 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20   += nLoop){.    
24fc0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70  pFrom->aLoop = p
24fd0 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72  X;.  }.  if( nOr
24fe0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20  derBy ){.    /* 
24ff0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
25000 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
25010 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69  nd it is not bei
25020 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20  ng ignored, set 
25030 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  up.    ** space 
25040 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73  for the aSortCos
25050 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20  t[] array. Each 
25060 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
25070 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20  SortCost array. 
25080 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
25090 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69  zero - meaning i
250a0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
250b0 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d  en initialized -
250c0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   or the.    ** c
250d0 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e  ost of sorting n
250e0 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64  RowEst rows of d
250f0 61 74 61 20 77 68 65 72 65 20 74 68 65 20 66 69  ata where the fi
25100 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20  rst X terms of. 
25110 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20     ** the ORDER 
25120 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  BY clause are al
25130 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20  ready in order, 
25140 77 68 65 72 65 20 58 20 69 73 20 74 68 65 20 61  where X is the a
25150 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64  rray .    ** ind
25160 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72  ex.  */.    aSor
25170 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a  tCost = (LogEst*
25180 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  )pX;.    memset(
25190 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69  aSortCost, 0, si
251a0 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e  zeof(LogEst) * n
251b0 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20  OrderBy);.  }.  
251c0 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73  assert( aSortCos
251d0 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b  t==0 || &pSpace[
251e0 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29  nSpace]==(char*)
251f0 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65  &aSortCost[nOrde
25200 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  rBy] );.  assert
25210 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c  ( aSortCost!=0 |
25220 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65  | &pSpace[nSpace
25230 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a  ]==(char*)pX );.
25240 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73  .  /* Seed the s
25250 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69 6e  earch with a sin
25260 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63 6f  gle WherePath co
25270 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68  ntaining zero Wh
25280 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20  ereLoops..  **. 
25290 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e   ** TUNING: Do n
252a0 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65  ot let the numbe
252b0 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20  r of iterations 
252c0 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66  go above 28.  If
252d0 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f   the cost.  ** o
252e0 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61  f computing an a
252f0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
25300 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20  s not paid back 
25310 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
25320 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74   28.  ** rows, t
25330 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hen do not use t
25340 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
25350 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30  ex. */.  aFrom[0
25360 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61  ].nRow = MIN(pPa
25370 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c  rse->nQueryLoop,
25380 20 34 38 29 3b 20 20 61 73 73 65 72 74 28 20 34   48);  assert( 4
25390 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  8==sqlite3LogEst
253a0 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20  (28) );.  nFrom 
253b0 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61  = 1;.  assert( a
253c0 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
253d0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f  d==0 );.  if( nO
253e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a  rderBy ){.    /*
253f0 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72   If nLoop is zer
25400 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61 72  o, then there ar
25410 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20  e no FROM terms 
25420 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53 69  in the query. Si
25430 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  nce.    ** in th
25440 69 73 20 63 61 73 65 20 74 68 65 20 71 75 65 72  is case the quer
25450 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d  y may return a m
25460 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f  aximum of one ro
25470 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  w, the results. 
25480 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64     ** are alread
25490 79 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  y in the request
254a0 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73  ed order. Set is
254b0 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65  Ordered to nOrde
254c0 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e  rBy to.    ** in
254d0 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c  dicate this. Or,
254e0 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65   if nLoop is gre
254f0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
25500 73 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f  set isOrdered to
25510 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69  .    ** -1, indi
25520 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  cating that the 
25530 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f  result set may o
25540 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64  r may not be ord
25550 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65  ered, .    ** de
25560 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c  pending on the l
25570 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74 68  oops added to th
25580 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20  e current plan. 
25590 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d   */.    aFrom[0]
255a0 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f  .isOrdered = nLo
255b0 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64  op>0 ? -1 : nOrd
255c0 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  erBy;.  }..  /* 
255d0 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69  Compute successi
255e0 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72  vely longer Wher
255f0 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65  ePaths using the
25600 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61   previous genera
25610 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65  tion.  ** of Whe
25620 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62  rePaths as the b
25630 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78  asis for the nex
25640 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  t.  Keep track o
25650 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20  f the mxChoice. 
25660 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61   ** best paths a
25670 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f  t each generatio
25680 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  n */.  for(iLoop
25690 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
256a0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e   iLoop++){.    n
256b0 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  To = 0;.    for(
256c0 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f  ii=0, pFrom=aFro
256d0 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  m; ii<nFrom; ii+
256e0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
256f0 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57     for(pWLoop=pW
25700 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57  Info->pLoops; pW
25710 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c  Loop; pWLoop=pWL
25720 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b  oop->pNextLoop){
25730 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
25740 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
25750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
25760 77 73 20 76 69 73 69 74 65 64 20 62 79 20 28 70  ws visited by (p
25770 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
25780 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72          LogEst r
25790 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cost;           
257a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
257b0 74 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d  t of path (pFrom
257c0 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
257d0 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f      LogEst rUnso
257e0 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  rted;           
257f0 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65        /* Unsorte
25800 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d  d cost of (pFrom
25810 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
25820 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65 64      i8 isOrdered
25830 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
25840 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72  red;  /* isOrder
25850 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57  ed for (pFrom+pW
25860 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
25870 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77   Bitmask maskNew
25880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25890 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72     /* Mask of sr
258a0 63 20 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e  c visited by (..
258b0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74  ) */.        Bit
258c0 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30  mask revMask = 0
258d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
258e0 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72  * Mask of rev-or
258f0 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e  der loops for (.
25900 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69  .) */..        i
25910 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72  f( (pWLoop->prer
25920 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73  eq & ~pFrom->mas
25930 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
25940 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
25950 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  ( (pWLoop->maskS
25960 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73  elf & pFrom->mas
25970 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
25980 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
25990 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ( (pWLoop->wsFla
259a0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
259b0 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 46 72  INDEX)!=0 && pFr
259c0 6f 6d 2d 3e 6e 52 6f 77 3c 33 20 29 7b 0a 20 20  om->nRow<3 ){.  
259d0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
259e0 74 20 75 73 65 20 61 6e 20 61 75 74 6f 6d 61 74  t use an automat
259f0 69 63 20 69 6e 64 65 78 20 69 66 20 74 68 65 20  ic index if the 
25a00 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 65 78 70  this loop is exp
25a10 65 63 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  ected.          
25a20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73 73 20 74  ** to run less t
25a30 68 61 6e 20 31 2e 32 35 20 74 69 6d 65 73 2e 20  han 1.25 times. 
25a40 20 49 74 20 69 73 20 74 65 6d 70 74 69 6e 67 20   It is tempting 
25a50 74 6f 20 61 6c 73 6f 20 65 78 63 6c 75 64 65 0a  to also exclude.
25a60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
25a70 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 75 73 61  omatic index usa
25a80 67 65 20 6f 6e 20 61 6e 20 6f 75 74 65 72 20 6c  ge on an outer l
25a90 6f 6f 70 2c 20 62 75 74 20 73 6f 6d 65 74 69 6d  oop, but sometim
25aa0 65 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 0a  es an automatic.
25ab0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
25ac0 65 78 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  ex is useful in 
25ad0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 6f  the outer loop o
25ae0 66 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  f a correlated s
25af0 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20  ubquery. */.    
25b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30        assert( 10
25b10 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
25b20 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2) );.          
25b30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
25b40 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
25b50 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70  At this point, p
25b60 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69  WLoop is a candi
25b70 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e  date to be the n
25b80 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20  ext loop. .     
25b90 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74     ** Compute it
25ba0 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20  s cost */.      
25bb0 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71    rUnsorted = sq
25bc0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
25bd0 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57  WLoop->rSetup,pW
25be0 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72  Loop->rRun + pFr
25bf0 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20  om->nRow);.     
25c00 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73     rUnsorted = s
25c10 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
25c20 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d  rUnsorted, pFrom
25c30 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20  ->rUnsorted);.  
25c40 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72        nOut = pFr
25c50 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f  om->nRow + pWLoo
25c60 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  p->nOut;.       
25c70 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d   maskNew = pFrom
25c80 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
25c90 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
25ca0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
25cb0 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ered<0 ){.      
25cc0 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20      isOrdered = 
25cd0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
25ce0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
25cf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25d00 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
25d10 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
25d20 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  , pWInfo->wctrlF
25d30 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f               iLo
25d50 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76  op, pWLoop, &rev
25d60 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  Mask);.        }
25d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25d80 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
25d90 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  >revLoop;.      
25da0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
25db0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20  isOrdered>=0 && 
25dc0 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72  isOrdered<nOrder
25dd0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
25de0 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  if( aSortCost[is
25df0 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20  Ordered]==0 ){. 
25e00 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74             aSort
25e10 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20  Cost[isOrdered] 
25e20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f  = whereSortingCo
25e30 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  st(.            
25e40 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77      pWInfo, nRow
25e50 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69  Est, nOrderBy, i
25e60 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  sOrdered.       
25e70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
25e80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
25e90 20 54 55 4e 49 4e 47 3a 20 20 41 64 64 20 61 20   TUNING:  Add a 
25ea0 73 6d 61 6c 6c 20 65 78 74 72 61 20 70 65 6e 61  small extra pena
25eb0 6c 74 79 20 28 35 29 20 74 6f 20 73 6f 72 74 69  lty (5) to sorti
25ec0 6e 67 20 61 73 20 61 6e 0a 20 20 20 20 20 20 20  ng as an.       
25ed0 20 20 20 2a 2a 20 65 78 74 72 61 20 65 6e 63 6f     ** extra enco
25ee0 75 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20  uragment to the 
25ef0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 74 6f  query planner to
25f00 20 73 65 6c 65 63 74 20 61 20 70 6c 61 6e 0a 20   select a plan. 
25f10 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72           ** wher
25f20 65 20 74 68 65 20 72 6f 77 73 20 65 6d 65 72 67  e the rows emerg
25f30 65 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  e in the correct
25f40 20 6f 72 64 65 72 20 77 69 74 68 6f 75 74 20 61   order without a
25f50 6e 79 20 73 6f 72 74 69 6e 67 0a 20 20 20 20 20  ny sorting.     
25f60 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64       ** required
25f70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
25f80 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Cost = sqlite3Lo
25f90 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65  gEstAdd(rUnsorte
25fa0 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f  d, aSortCost[isO
25fb0 72 64 65 72 65 64 5d 29 20 2b 20 35 3b 0a 0a 20  rdered]) + 5;.. 
25fc0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52           WHERETR
25fd0 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20  ACE(0x002,.     
25fe0 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20           ("---- 
25ff0 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28  sort cost=%-3d (
26000 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73  %d/%d) increases
26010 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33   cost %3d to %-3
26020 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
26030 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69       aSortCost[i
26040 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64  sOrdered], (nOrd
26050 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c  erBy-isOrdered),
26060 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20   nOrderBy, .    
26070 20 20 20 20 20 20 20 20 20 20 20 72 55 6e 73 6f             rUnso
26080 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20  rted, rCost));. 
26090 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
260a0 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
260b0 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20  rUnsorted;.     
260c0 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 2d       rUnsorted -
260d0 3d 20 32 3b 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  = 2;  /* TUNING:
260e0 20 20 53 6c 69 67 68 74 20 62 69 61 73 20 69 6e    Slight bias in
260f0 20 66 61 76 6f 72 20 6f 66 20 6e 6f 2d 73 6f 72   favor of no-sor
26100 74 20 70 6c 61 6e 73 20 2a 2f 0a 20 20 20 20 20  t plans */.     
26110 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
26120 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
26130 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62   pWLoop should b
26140 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73  e added to the s
26150 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  et of.        **
26160 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d 73   mxChoice best-s
26170 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20 20  o-far paths..   
26180 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
26190 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f  ** First look fo
261a0 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61  r an existing pa
261b0 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f  th among best-so
261c0 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20 20 20  -far paths.     
261d0 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65 72     ** that cover
261e0 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  s the same set o
261f0 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20  f loops and has 
26200 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72  the same isOrder
26210 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ed.        ** se
26220 74 74 69 6e 67 20 61 73 20 74 68 65 20 63 75 72  tting as the cur
26230 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69 64  rent path candid
26240 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ate..        **.
26250 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74          ** The t
26260 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72  erm "((pTo->isOr
26270 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29  dered^isOrdered)
26280 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65 71  &0x80)==0" is eq
26290 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20  uivalent.       
262a0 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f   ** to (pTo->isO
262b0 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28  rdered==(-1))==(
262c0 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29  isOrdered==(-1))
262d0 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 0a  " for the range.
262e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65          ** of le
262f0 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 69  gal values for i
26300 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34  sOrdered, -1..64
26310 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26320 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70       for(jj=0, p
26330 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20  To=aTo; jj<nTo; 
26340 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
26350 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
26360 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e  >maskLoop==maskN
26370 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ew.           &&
26380 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ((pTo->isOrdere
26390 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38  d^isOrdered)&0x8
263a0 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  0)==0.          
263b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
263c0 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f  estcase( jj==nTo
263d0 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
263e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
263f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26400 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e         if( jj>=n
26410 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  To ){.          
26420 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65  /* None of the e
26430 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d  xisting best-so-
26440 66 61 72 20 70 61 74 68 73 20 6d 61 74 63 68 20  far paths match 
26450 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a  the candidate. *
26460 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
26470 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20  nTo>=mxChoice.  
26480 20 20 20 20 20 20 20 20 20 26 26 20 28 72 43 6f           && (rCo
26490 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43  st>mxCost || (rC
264a0 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72  ost==mxCost && r
264b0 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f  Unsorted>=mxUnso
264c0 72 74 65 64 29 29 0a 20 20 20 20 20 20 20 20 20  rted)).         
264d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
264e0 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 63  /* The current c
264f0 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20 62  andidate is no b
26500 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20 6f  etter than any o
26510 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20  f the mxChoice. 
26520 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61             ** pa
26530 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ths currently in
26540 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61 72   the best-so-far
26550 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69 73   buffer.  So dis
26560 63 61 72 64 0a 20 20 20 20 20 20 20 20 20 20 20  card.           
26570 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64 61   ** this candida
26580 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c 65  te as not viable
26590 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  . */.#ifdef WHER
265a0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
265b0 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
265c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
265d0 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
265e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
265f0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26600 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f  tf("Skip   %s co
26610 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20  st=%-3d,%3d,%3d 
26620 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
26640 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
26650 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
26660 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
26670 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20   rUnsorted,.    
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
26690 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
266a0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
266b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
266c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
266d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
266e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
266f0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
26700 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69  ch this points i
26710 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
26720 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65 20 70   new candidate p
26730 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ath.          **
26740 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 64   needs to be add
26750 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
26760 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
26770 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  hs. */.         
26780 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63   if( nTo<mxChoic
26790 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
267a0 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
267b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f   size of the aTo
267c0 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20   set by one */. 
267d0 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
267e0 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  nTo++;.         
267f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26800 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20      /* New path 
26810 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69  replaces the pri
26820 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70  or worst to keep
26830 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43   count below mxC
26840 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  hoice */.       
26850 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20       jj = mxI;. 
26860 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26870 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
26880 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
26890 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
268a0 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
268b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
268c0 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
268d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
268e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
268f0 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25  New    %s cost=%
26900 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65  -3d,%3d,%3d orde
26910 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
26920 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
26930 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
26940 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
26950 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f  ost, nOut, rUnso
26960 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
26970 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
26980 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
26990 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
269a0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
269b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
269c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f         /* Contro
269d0 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69  l reaches here i
269e0 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  f best-so-far pa
269f0 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63  th pTo=aTo[jj] c
26a00 6f 76 65 72 73 20 74 68 65 0a 20 20 20 20 20 20  overs the.      
26a10 20 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20      ** same set 
26a20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73  of loops and has
26a30 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65   the same isOrde
26a40 72 65 64 20 73 65 74 74 69 6e 67 20 61 73 20 74  red setting as t
26a50 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
26a60 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20  candidate path. 
26a70 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
26a80 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73   the candidate s
26a90 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20  hould replace.  
26aa0 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f          ** pTo o
26ab0 72 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  r if the candida
26ac0 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69  te should be ski
26ad0 70 70 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  pped..          
26ae0 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ** .          **
26af0 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   The conditional
26b00 20 69 73 20 61 6e 20 65 78 70 61 6e 64 65 64 20   is an expanded 
26b10 76 65 63 74 6f 72 20 63 6f 6d 70 61 72 69 73 6f  vector compariso
26b20 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  n equivalent to:
26b30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
26b40 28 70 54 6f 2d 3e 72 43 6f 73 74 2c 70 54 6f 2d  (pTo->rCost,pTo-
26b50 3e 6e 52 6f 77 2c 70 54 6f 2d 3e 72 55 6e 73 6f  >nRow,pTo->rUnso
26b60 72 74 65 64 29 20 3c 3d 20 28 72 43 6f 73 74 2c  rted) <= (rCost,
26b70 6e 4f 75 74 2c 72 55 6e 73 6f 72 74 65 64 29 0a  nOut,rUnsorted).
26b80 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
26b90 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
26ba0 72 43 6f 73 74 3c 72 43 6f 73 74 20 0a 20 20 20  rCost<rCost .   
26bb0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d          || (pTo-
26bc0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 0a 20 20  >rCost==rCost.  
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
26be0 28 70 54 6f 2d 3e 6e 52 6f 77 3c 6e 4f 75 74 0a  (pTo->nRow<nOut.
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c00 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 6e 52 6f 77     || (pTo->nRow
26c10 3d 3d 6e 4f 75 74 20 26 26 20 70 54 6f 2d 3e 72  ==nOut && pTo->r
26c20 55 6e 73 6f 72 74 65 64 3c 3d 72 55 6e 73 6f 72  Unsorted<=rUnsor
26c30 74 65 64 29 0a 20 20 20 20 20 20 20 20 20 20 20  ted).           
26c40 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
26c50 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
26c60 20 20 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45     ){.#ifdef WHE
26c70 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
26c80 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
26c90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26ca0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
26cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26cc0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
26cd0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
26ce0 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25         "Skip   %
26cf0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c  s cost=%-3d,%3d,
26d00 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
26d30 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
26d40 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
26d50 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20  t, rUnsorted,.  
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
26d80 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
26d90 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
26da0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26db0 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20  rintf("   vs %s 
26dc0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33  cost=%-3d,%3d,%3
26dd0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
26e00 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
26e10 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
26e20 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
26e30 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72            pTo->r
26e40 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e 69  Unsorted, pTo->i
26e50 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
26e60 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
26e70 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
26e80 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
26e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
26ea0 63 61 72 64 20 74 68 65 20 63 61 6e 64 69 64 61  card the candida
26eb0 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72  te path from fur
26ec0 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69  ther considerati
26ed0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
26ee0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
26ef0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b  >rCost==rCost );
26f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
26f10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
26f20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
26f30 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
26f40 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20  t==rCost+1 );.  
26f50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72          /* Contr
26f60 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20  ol reaches here 
26f70 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
26f80 20 70 61 74 68 20 69 73 20 62 65 74 74 65 72 20   path is better 
26f90 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20  than the.       
26fa0 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20     ** pTo path. 
26fb0 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74   Replace pTo wit
26fc0 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
26fd0 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
26fe0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
26ff0 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
27000 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
27010 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
27020 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27030 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27050 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25  Update %s cost=%
27060 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65  -3d,%3d,%3d orde
27070 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
27080 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
27090 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
270a0 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
270b0 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74  t, nOut, rUnsort
270c0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
270d0 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
270e0 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
270f0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
27100 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
27110 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25  gPrintf("  was %
27120 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c  s cost=%-3d,%3d,
27130 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
27140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27150 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
27160 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
27170 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
27180 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
27190 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e          pTo->rUn
271a0 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f  sorted, pTo->isO
271b0 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d  rdered>=0 ? pTo-
271c0 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a  >isOrdered+'0' :
271d0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
271e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
271f0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70    }.        /* p
27200 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65  WLoop is a winne
27210 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74 68  r.  Add it to th
27220 65 20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f  e set of best so
27230 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
27240 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20  pTo->maskLoop = 
27250 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20  pFrom->maskLoop 
27260 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  | pWLoop->maskSe
27270 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  lf;.        pTo-
27280 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61  >revLoop = revMa
27290 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  sk;.        pTo-
272a0 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20  >nRow = nOut;.  
272b0 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74        pTo->rCost
272c0 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20   = rCost;.      
272d0 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64    pTo->rUnsorted
272e0 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20   = rUnsorted;.  
272f0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
27300 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64  ered = isOrdered
27310 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
27320 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72  (pTo->aLoop, pFr
27330 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f  om->aLoop, sizeo
27340 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c  f(WhereLoop*)*iL
27350 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54  oop);.        pT
27360 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  o->aLoop[iLoop] 
27370 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  = pWLoop;.      
27380 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
27390 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
273a0 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20   mxI = 0;.      
273b0 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f      mxCost = aTo
273c0 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  [0].rCost;.     
273d0 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20       mxUnsorted 
273e0 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20  = aTo[0].nRow;. 
273f0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
27400 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20  1, pTo=&aTo[1]; 
27410 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b  jj<mxChoice; jj+
27420 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
27430 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
27440 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20  rCost>mxCost .  
27450 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
27460 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73  To->rCost==mxCos
27470 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  t && pTo->rUnsor
27480 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20  ted>mxUnsorted) 
27490 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
274b0 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73  Cost = pTo->rCos
274c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
274d0 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54   mxUnsorted = pT
274e0 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20  o->rUnsorted;.  
274f0 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49 20              mxI 
27500 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  = jj;.          
27510 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
27520 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27530 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  }.    }..#ifdef 
27540 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
27550 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20  ED  /* >=2 */.  
27560 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
27570 72 65 54 72 61 63 65 20 26 20 30 78 30 32 20 29  reTrace & 0x02 )
27580 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
27590 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
275a0 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20   after round %d 
275b0 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b  ----\n", iLoop);
275c0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  .      for(ii=0,
275d0 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f   pTo=aTo; ii<nTo
275e0 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; ii++, pTo++){.
275f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
27600 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20  ebugPrintf(" %s 
27610 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25  cost=%-3d nrow=%
27620 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
27630 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
27640 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
27650 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
27660 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
27670 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d  .           pTo-
27680 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20  >isOrdered>=0 ? 
27690 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b  (pTo->isOrdered+
276a0 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  '0') : '?');.   
276b0 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73       if( pTo->is
276c0 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20  Ordered>0 ){.   
276d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
276e0 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d  bugPrintf(" rev=
276f0 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e  0x%llx\n", pTo->
27700 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  revLoop);.      
27710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27720 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27730 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
27740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27750 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
27760 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c   /* Swap the rol
27770 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20  es of aFrom and 
27780 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74  aTo for the next
27790 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
277a0 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a     pFrom = aTo;.
277b0 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b      aTo = aFrom;
277c0 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72  .    aFrom = pFr
277d0 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20  om;.    nFrom = 
277e0 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nTo;.  }..  if( 
277f0 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nFrom==0 ){.    
27800 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27810 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72  pParse, "no quer
27820 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20  y solution");.  
27830 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
27840 4e 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  N(db, pSpace);. 
27850 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27860 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
27870 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
27880 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
27890 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
278a0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
278b0 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
278c0 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66  rom = aFrom;.  f
278d0 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
278e0 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
278f0 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
27900 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
27910 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
27920 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ii];.  }.  asser
27930 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
27940 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a  l==nLoop );.  /*
27950 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74   Load the lowest
27960 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20   cost path into 
27970 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28  pWInfo */.  for(
27980 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
27990 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
279a0 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
279b0 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
279c0 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20  >a + iLoop;.    
279d0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d  pLevel->pWLoop =
279e0 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d   pWLoop = pFrom-
279f0 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
27a00 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
27a10 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b   = pWLoop->iTab;
27a20 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
27a30 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  bCur = pWInfo->p
27a40 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
27a50 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
27a60 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57  r;.  }.  if( (pW
27a70 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
27a80 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
27a90 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26  STINCT)!=0.   &&
27aa0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
27ab0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
27ac0 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26  TINCTBY)==0.   &
27ad0 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  & pWInfo->eDisti
27ae0 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
27af0 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e  NCT_NOOP.   && n
27b00 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20  RowEst.  ){.    
27b10 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b  Bitmask notUsed;
27b20 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68  .    int rc = wh
27b30 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
27b40 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
27b50 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
27b60 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20  et, pFrom,.     
27b70 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
27b80 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c  E_DISTINCTBY, nL
27b90 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
27ba0 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e  oop[nLoop-1], &n
27bb0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
27bc0 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65   rc==pWInfo->pRe
27bd0 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29  sultSet->nExpr )
27be0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
27bf0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
27c00 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
27c10 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
27c20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64  pWInfo->bOrdered
27c30 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 30 3b 0a 20  InnerLoop = 0;. 
27c40 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
27c50 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28  derBy ){.    if(
27c60 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
27c70 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
27c80 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20  INCTBY ){.      
27c90 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  if( pFrom->isOrd
27ca0 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  ered==pWInfo->pO
27cb0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
27cc0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
27cd0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
27ce0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
27cf0 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RED;.      }.   
27d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
27d10 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
27d20 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
27d30 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
27d40 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
27d50 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69  revLoop;.      i
27d60 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  f( pWInfo->nOBSa
27d70 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t<=0 ){.        
27d80 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
27d90 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
27da0 6e 4c 6f 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20  nLoop>0 ){.     
27db0 20 20 20 20 20 75 33 32 20 77 73 46 6c 61 67 73       u32 wsFlags
27dc0 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b   = pFrom->aLoop[
27dd0 6e 4c 6f 6f 70 2d 31 5d 2d 3e 77 73 46 6c 61 67  nLoop-1]->wsFlag
27de0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
27df0 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52   (wsFlags & WHER
27e00 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 0a 20 20  E_ONEROW)==0 .  
27e10 20 20 20 20 20 20 20 20 20 26 26 20 28 77 73 46           && (wsF
27e20 6c 61 67 73 26 28 57 48 45 52 45 5f 49 50 4b 7c  lags&(WHERE_IPK|
27e30 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
27e40 29 21 3d 28 57 48 45 52 45 5f 49 50 4b 7c 57 48  )!=(WHERE_IPK|WH
27e50 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 0a 20  ERE_COLUMN_IN). 
27e60 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
27e70 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
27e80 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  m = 0;.         
27e90 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
27ea0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
27eb0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
27ec0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
27ed0 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20  pFrom,.         
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
27ef0 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  RE_ORDERBY_LIMIT
27f00 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d  , nLoop-1, pFrom
27f10 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
27f20 2c 20 26 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  , &m);.         
27f30 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46     testcase( wsF
27f40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
27f50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
27f60 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67  testcase( wsFlag
27f70 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
27f80 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IN );.         
27f90 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66     if( rc==pWInf
27fa0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
27fb0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
27fc0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64      pWInfo->bOrd
27fd0 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20  eredInnerLoop = 
27fe0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
27ff0 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
28000 20 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20 20 20   = m;.          
28010 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
28020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28030 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
28040 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
28050 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
28060 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20  BYGROUP).       
28070 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53   && pWInfo->nOBS
28080 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  at==pWInfo->pOrd
28090 65 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e  erBy->nExpr && n
280a0 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20  Loop>0.    ){.  
280b0 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
280c0 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ask = 0;.      i
280d0 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72  nt nOrder = wher
280e0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
280f0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
28100 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
28110 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
28120 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  , 0, nLoop-1, pF
28130 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
28140 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20  -1], &revMask.  
28150 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
28160 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72  ert( pWInfo->sor
28170 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ted==0 );.      
28180 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e  if( nOrder==pWIn
28190 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
281a0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
281b0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20  WInfo->sorted = 
281c0 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  1;.        pWInf
281d0 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65 76  o->revMask = rev
281e0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mask;.      }.  
281f0 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e    }.  }...  pWIn
28200 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46  fo->nRowOut = pF
28210 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a  rom->nRow;..  /*
28220 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20   Free temporary 
28230 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72  memory and retur
28240 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73  n success */.  s
28250 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
28260 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65  b, pSpace);.  re
28270 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28280 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75  }../*.** Most qu
28290 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61  eries use only a
282a0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74   single table (t
282b0 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e  hey are not join
282c0 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73  s) and have.** s
282d0 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61  imple == constra
282e0 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64  ints against ind
282f0 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68  exed fields.  Th
28300 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
28310 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74  pts.** to plan t
28320 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65  hose simple case
28330 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73  s using much les
28340 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20  s ceremony than 
28350 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70  the.** general-p
28360 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61  urpose query pla
28370 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62  nner, and thereb
28380 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73  y yield faster s
28390 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
283a0 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68  .** times for th
283b0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a  e common case..*
283c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
283d0 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
283e0 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63   if this query c
283f0 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79  an be handled by
28400 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c   this.** no-fril
28410 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  ls query planner
28420 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69  .  Return zero i
28430 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65  f this query nee
28440 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72  ds the .** gener
28450 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
28460 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61   planner..*/.sta
28470 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f  tic int whereSho
28480 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42  rtCut(WhereLoopB
28490 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
284a0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
284b0 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  pWInfo;.  struct
284c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
284d0 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61  Item;.  WhereCla
284e0 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
284f0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
28500 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
28510 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
28520 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a  int j;.  Table *
28530 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
28540 49 64 78 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d  Idx;..  pWInfo =
28550 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
28560 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  o;.  if( pWInfo-
28570 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
28580 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
28590 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
285a0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
285b0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
285c0 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
285d0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
285e0 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
285f0 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
28600 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
28610 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
28620 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
28630 65 78 65 64 42 79 20 29 20 72 65 74 75 72 6e 20  exedBy ) return 
28640 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
28650 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
28660 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
28670 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
28680 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
28690 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
286a0 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70  ;.  pLoop->nSkip
286b0 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20   = 0;.  pTerm = 
286c0 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
286d0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
286e0 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f  -1, 0, WO_EQ|WO_
286f0 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  IS, 0);.  if( pT
28700 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63  erm ){.    testc
28710 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
28720 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
28730 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
28740 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
28750 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
28760 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
28770 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
28780 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
28790 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
287a0 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
287b0 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
287c0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
287d0 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
287e0 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
287f0 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
28800 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69  33;  /* 33==sqli
28810 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f  te3LogEst(10) */
28820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
28830 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
28840 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
28850 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
28860 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a      int opMask;.
28870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
28880 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
28890 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20  ==pLoop->aLTerm 
288a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  );.      if( !Is
288b0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
288c0 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78  ).       || pIdx
288d0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
288e0 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  =0 .       || pI
288f0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61  dx->nKeyCol>Arra
28900 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54  ySize(pLoop->aLT
28910 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20  ermSpace) .     
28920 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
28930 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78     opMask = pIdx
28940 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20  ->uniqNotNull ? 
28950 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20  (WO_EQ|WO_IS) : 
28960 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72  WO_EQ;.      for
28970 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
28980 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
28990 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c       pTerm = sql
289a0 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
289b0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
289c0 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29  0, opMask, pIdx)
289d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
289e0 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
289f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
28a00 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
28a10 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
28a20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
28a30 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[j] = pTerm;.
28a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28a50 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( j!=pIdx->nKeyC
28a60 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
28a70 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
28a80 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
28a90 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52  MN_EQ|WHERE_ONER
28aa0 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  OW|WHERE_INDEXED
28ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
28ac0 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20  ->isCovering || 
28ad0 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  (pItem->colUsed 
28ae0 26 20 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64  & pIdx->colNotId
28af0 78 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xed)==0 ){.     
28b00 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
28b10 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  s |= WHERE_IDX_O
28b20 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NLY;.      }.   
28b30 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d     pLoop->nLTerm
28b40 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
28b50 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
28b60 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
28b70 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
28b80 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a  = pIdx;.      /*
28b90 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
28ba0 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20   a unique index 
28bb0 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a  lookup is 15 */.
28bc0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75        pLoop->rRu
28bd0 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d  n = 39;  /* 39==
28be0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35  sqlite3LogEst(15
28bf0 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  ) */.      break
28c00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
28c10 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
28c20 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e   ){.    pLoop->n
28c30 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b  Out = (LogEst)1;
28c40 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
28c50 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70  ].pWLoop = pLoop
28c60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
28c70 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e 6e  Info->sMaskSet.n
28c80 3d 3d 31 20 26 26 20 69 43 75 72 3d 3d 70 57 49  ==1 && iCur==pWI
28c90 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e 69 78  nfo->sMaskSet.ix
28ca0 5b 30 5d 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  [0] );.    pLoop
28cb0 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 31 3b 20  ->maskSelf = 1; 
28cc0 2f 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 47  /* sqlite3WhereG
28cd0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
28ce0 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  sMaskSet, iCur);
28cf0 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   */.    pWInfo->
28d00 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69  a[0].iTabCur = i
28d10 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  Cur;.    pWInfo-
28d20 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20  >nRowOut = 1;.  
28d30 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
28d40 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d  rderBy ) pWInfo-
28d50 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66  >nOBSat =  pWInf
28d60 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
28d70 70 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  pr;.    if( pWIn
28d80 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
28d90 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
28da0 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57  INCT ){.      pW
28db0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
28dc0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
28dd0 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23  _UNIQUE;.    }.#
28de0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
28df0 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49  UG.    pLoop->cI
28e00 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a  d = '0';.#endif.
28e10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
28e20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
28e30 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
28e40 6e 63 74 69 6f 6e 20 66 6f 72 20 65 78 70 72 49  nction for exprI
28e50 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28 29  sDeterministic()
28e60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28e70 65 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72 6d  exprNodeIsDeterm
28e80 69 6e 69 73 74 69 63 28 57 61 6c 6b 65 72 20 2a  inistic(Walker *
28e90 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
28ea0 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
28eb0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
28ec0 49 4f 4e 20 26 26 20 45 78 70 72 48 61 73 50 72  ION && ExprHasPr
28ed0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
28ee0 5f 43 6f 6e 73 74 46 75 6e 63 29 3d 3d 30 20 29  _ConstFunc)==0 )
28ef0 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
28f00 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65  Code = 0;.    re
28f10 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28f20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
28f30 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
28f40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
28f50 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
28f60 6e 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6e 6f  n contains no no
28f70 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
28f80 53 51 4c 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  SQL .** function
28f90 73 2e 20 44 6f 20 6e 6f 74 20 63 6f 6e 73 69 64  s. Do not consid
28fa0 65 72 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  er non-determini
28fb0 73 74 69 63 20 53 51 4c 20 66 75 6e 63 74 69 6f  stic SQL functio
28fc0 6e 73 20 74 68 61 74 20 61 72 65 20 0a 2a 2a 20  ns that are .** 
28fd0 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65  part of sub-sele
28fe0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ct statements..*
28ff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
29000 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63  rIsDeterministic
29010 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c  (Expr *p){.  Wal
29020 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
29030 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
29040 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31  );.  w.eCode = 1
29050 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
29060 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
29070 44 65 74 65 72 6d 69 6e 69 73 74 69 63 3b 0a 20  Deterministic;. 
29080 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
29090 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ck = sqlite3Sele
290a0 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 20 20 73 71  ctWalkFail;.  sq
290b0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
290c0 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
290d0 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
290e0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65   Generate the be
290f0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
29100 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45  oop used for WHE
29110 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
29120 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  sing..** The ret
29130 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
29140 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61  ointer to an opa
29150 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68  que structure th
29160 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69  at contains.** i
29170 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
29180 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
29190 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c  he loop.  Later,
291a0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
291b0 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69  tine.** should i
291c0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65  nvoke sqlite3Whe
291d0 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65  reEnd() with the
291e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
291f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
29200 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
29210 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45  mplete the WHERE
29220 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
29230 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
29240 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
29250 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29260 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  ns NULL..**.** T
29270 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73  he basic idea is
29280 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20   to do a nested 
29290 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66  loop, one loop f
292a0 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
292b0 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
292c0 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  use of a select.
292d0 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50    (INSERT and UP
292e0 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
292f0 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  are the.** same 
29300 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68  as a SELECT with
29310 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
29320 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
29330 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a   clause.)  For.*
29340 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
29350 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a  e SQL is this:.*
29360 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43  *.**       SELEC
29370 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
29380 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a   t3 WHERE ...;.*
29390 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f  *.** Then the co
293a0 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20  de generated is 
293b0 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b  conceptually lik
293c0 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
293d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  .**.**      fore
293e0 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
293f0 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64  o       \    Cod
29400 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
29410 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
29420 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20  w2 in t2 do     
29430 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
29440 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20  hereBegin().**  
29450 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
29460 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20  row3 in t3 do   
29470 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
29480 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
29490 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
294a0 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64          \    Cod
294b0 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
294c0 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
294d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294e0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
294f0 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20  hereEnd().**    
29500 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
29520 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
29530 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20  the loops might 
29540 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e  not be nested in
29550 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
29560 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65  ich they.** appe
29570 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
29580 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65  lause if a diffe
29590 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65  rent order is be
295a0 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b  tter able to mak
295b0 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69  e.** use of indi
295c0 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ces.  Note also 
295d0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e  that when the IN
295e0 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72   operator appear
295f0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  s in.** the WHER
29600 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67  E clause, it mig
29610 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64  ht result in add
29620 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c  itional nested l
29630 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e  oops for.** scan
29640 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
29650 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72   values on the r
29660 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
29670 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20  f the IN..**.** 
29680 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
29690 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
296a0 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
296b0 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
296c0 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
296d0 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
296e0 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
296f0 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
29700 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
29710 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
29720 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
29730 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
29740 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
29750 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
29760 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
29770 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
29780 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
29790 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  them..**.** The 
297a0 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
297b0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65  3WhereBegin() ge
297c0 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74  nerates leaves t
297d0 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64  he cursors named
297e0 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20  .** in pTabList 
297f0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69  pointing at thei
29800 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  r appropriate en
29810 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e  tries.  The [...
29820 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73  ] code.** can us
29830 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20  e OP_Column and 
29840 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73  OP_Rowid opcodes
29850 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72   on these cursor
29860 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20  s to extract.** 
29870 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61  data from the va
29880 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20  rious tables of 
29890 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
298a0 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
298b0 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  use is empty, th
298c0 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20  e foreach loops 
298d0 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74  must each scan t
298e0 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74  heir.** entire t
298f0 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74  ables.  Thus a t
29900 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73  hree-way join is
29910 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61   an O(N^3) opera
29920 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
29930 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65   the tables have
29940 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
29950 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20  re are terms in 
29960 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
29970 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74   that.** refer t
29980 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c  o those indices,
29990 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c   a complete tabl
299a0 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76  e scan can be av
299b0 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  oided and the.**
299c0 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d   code will run m
299d0 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73  uch faster.  Mos
299e0 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  t of the work of
299f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
29a00 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20   checking.** to 
29a10 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
29a20 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61   indices that ca
29a30 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  n be used to spe
29a40 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a  ed up the loop..
29a50 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74  **.** Terms of t
29a60 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
29a70 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f  are also used to
29a80 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77   limit which row
29a90 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61  s actually.** ma
29aa0 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e  ke it to the "..
29ab0 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ." in the middle
29ac0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41   of the loop.  A
29ad0 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61  fter each "forea
29ae0 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66  ch",.** terms of
29af0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
29b00 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20  e that use only 
29b10 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f  terms in that lo
29b20 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20  op and outer.** 
29b30 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61  loops are evalua
29b40 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65  ted and if false
29b50 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
29b60 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65  around all subse
29b70 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c  quent.** inner l
29b80 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20  oops (or around 
29b90 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65  the "..." if the
29ba0 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74   test occurs wit
29bb0 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a  hin the inner-.*
29bc0 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a  * most loop).**.
29bd0 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a  ** OUTER JOINS.*
29be0 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f  *.** An outer jo
29bf0 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20  in of tables t1 
29c00 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70  and t2 is concep
29c10 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66  tally coded as f
29c20 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
29c30 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
29c40 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66   t1 do.**      f
29c50 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20  lag = 0.**      
29c60 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
29c70 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20  t2 do.**        
29c80 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20  start:.**       
29c90 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
29ca0 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20     flag = 1.**  
29cb0 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20      end.**      
29cc0 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a  if flag==0 then.
29cd0 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74  **        move t
29ce0 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74  he row2 cursor t
29cf0 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20  o a null row.** 
29d00 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72         goto star
29d10 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20  t.**      fi.** 
29d20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44     end.**.** ORD
29d30 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f  ER BY CLAUSE PRO
29d40 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f  CESSING.**.** pO
29d50 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
29d60 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
29d70 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74   BY clause (or t
29d80 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
29d90 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  se.** if the WHE
29da0 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
29db0 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46  is set in wctrlF
29dc0 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43  lags) of a SELEC
29dd0 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69  T statement.** i
29de0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
29df0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
29e00 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
29e10 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
29e20 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
29e30 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
29e40 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
29e50 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42  nt, then pOrderB
29e60 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  y is NULL..**.**
29e70 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61 72   The iIdxCur par
29e80 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63 75  ameter is the cu
29e90 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
29ea0 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a  n index.  If .**
29eb0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
29ec0 55 53 45 20 69 73 20 73 65 74 2c 20 69 49 64 78  USE is set, iIdx
29ed0 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  Cur is the curso
29ee0 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69  r number of an i
29ef0 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66  ndex.** to use f
29f00 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f  or OR clause pro
29f10 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48  cessing.  The WH
29f20 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  ERE clause shoul
29f30 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70  d use this.** sp
29f40 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20  ecific cursor.  
29f50 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53  If WHERE_ONEPASS
29f60 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74 2c  _DESIRED is set,
29f70 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69 73   then iIdxCur is
29f80 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 75  .** the first cu
29f90 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79  rsor in an array
29fa0 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20   of cursors for 
29fb0 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49  all indices.  iI
29fc0 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20  dxCur should.** 
29fd0 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  be used to compu
29fe0 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
29ff0 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64  te cursor depend
2a000 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64  ing on which ind
2a010 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a  ex is.** used..*
2a020 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
2a030 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
2a040 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2a050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a060 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2a070 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
2a080 61 62 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20  abList,      /* 
2a090 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c  FROM clause: A l
2a0a0 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
2a0b0 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
2a0c0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
2a0d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
2a0e0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2a0f0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2a100 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
2a110 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72   An ORDER BY (or
2a120 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73   GROUP BY) claus
2a130 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
2a140 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c  ExprList *pResul
2a150 74 53 65 74 2c 20 20 20 2f 2a 20 51 75 65 72 79  tSet,   /* Query
2a160 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 52 65   result set.  Re
2a170 71 27 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54  q'd for DISTINCT
2a180 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
2a190 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  lags,         /*
2a1a0 20 54 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   The WHERE_* fla
2a1b0 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
2a1c0 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69  liteInt.h */.  i
2a1d0 6e 74 20 69 41 75 78 41 72 67 20 20 20 20 20 20  nt iAuxArg      
2a1e0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45         /* If WHE
2a1f0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
2a200 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75  is set, index cu
2a210 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20  rsor number.    
2a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a230 20 20 20 20 20 20 2a 2a 20 49 66 20 57 48 45 52        ** If WHER
2a240 45 5f 55 53 45 5f 4c 49 4d 49 54 2c 20 74 68 65  E_USE_LIMIT, the
2a250 6e 20 74 68 65 20 6c 69 6d 69 74 20 61 6d 6f 75  n the limit amou
2a260 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
2a270 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
2a280 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
2a290 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
2a2a0 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
2a2b0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
2a2c0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
2a2d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2a2e0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
2a2f0 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
2a300 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
2a310 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
2a320 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
2a330 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
2a340 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
2a350 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2a360 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
2a370 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
2a380 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
2a390 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
2a3a0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
2a3b0 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
2a3c0 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
2a3d0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
2a3e0 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54  r sWLB;     /* T
2a3f0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69  he WhereLoop bui
2a400 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d  lder */.  WhereM
2a410 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
2a420 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  ;    /* The expr
2a430 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
2a440 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
2a450 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
2a460 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
2a470 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l in pWInfo->a[]
2a480 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2a490 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
2a4a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
2a4b0 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f   single WhereLoo
2a4c0 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
2a4d0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
2a4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2a4f0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71   counter */.  sq
2a500 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
2a510 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2a520 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2a530 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2a560 2f 0a 20 20 75 38 20 62 46 6f 72 64 65 6c 65 74  /.  u8 bFordelet
2a570 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  e = 0;         /
2a580 2a 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45  * OPFLAG_FORDELE
2a590 54 45 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61  TE or zero, as a
2a5a0 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20  ppropriate */.. 
2a5b0 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46   assert( (wctrlF
2a5c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2a5d0 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d  PASS_MULTIROW)==
2a5e0 30 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 28  0 || (.        (
2a5f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2a600 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2a610 45 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20  ED)!=0 .     && 
2a620 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2a630 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2a640 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f  )==0 .  ));..  /
2a650 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20 57 48  * Only one of WH
2a660 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2a670 20 6f 72 20 57 48 45 52 45 5f 55 53 45 5f 4c 49   or WHERE_USE_LI
2a680 4d 49 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  MIT */.  assert(
2a690 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2a6a0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2a6b0 45 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  E)==0.          
2a6c0 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73    || (wctrlFlags
2a6d0 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d   & WHERE_USE_LIM
2a6e0 49 54 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  IT)==0 );..  /* 
2a6f0 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c  Variable initial
2a700 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20  ization */.  db 
2a710 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2a720 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c  memset(&sWLB, 0,
2a730 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a   sizeof(sWLB));.
2a740 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47  .  /* An ORDER/G
2a750 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f  ROUP BY clause o
2a760 66 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74  f more than 63 t
2a770 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f  erms cannot be o
2a780 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65  ptimized */.  te
2a790 73 74 63 61 73 65 28 20 70 4f 72 64 65 72 42 79  stcase( pOrderBy
2a7a0 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45   && pOrderBy->nE
2a7b0 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  xpr==BMS-1 );.  
2a7c0 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
2a7d0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
2a7e0 3d 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20  =BMS ) pOrderBy 
2a7f0 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64  = 0;.  sWLB.pOrd
2a800 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
2a810 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74  ..  /* Disable t
2a820 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69  he DISTINCT opti
2a830 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49  mization if SQLI
2a840 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69  TE_DistinctOpt i
2a850 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73  s set via.  ** s
2a860 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c  qlite3_test_ctrl
2a870 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
2a880 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e  _OPTIMIZATIONS,.
2a890 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..) */.  if( Opt
2a8a0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
2a8b0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73  d(db, SQLITE_Dis
2a8c0 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20  tinctOpt) ){.   
2a8d0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e   wctrlFlags &= ~
2a8e0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
2a8f0 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  NCT;.  }..  /* T
2a900 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  he number of tab
2a910 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
2a920 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
2a930 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
2a940 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20  of.  ** bits in 
2a950 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a  a Bitmask .  */.
2a960 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
2a970 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20  List->nSrc==BMS 
2a980 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  );.  if( pTabLis
2a990 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20  t->nSrc>BMS ){. 
2a9a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2a9b0 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d  sg(pParse, "at m
2a9c0 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e  ost %d tables in
2a9d0 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a   a join", BMS);.
2a9e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2a9f0 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  }..  /* This fun
2aa00 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67  ction normally g
2aa10 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65  enerates a neste
2aa20 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74  d loop for all t
2aa30 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70  ables in .  ** p
2aa40 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66  TabList.  But if
2aa50 20 74 68 65 20 57 48 45 52 45 5f 4f 52 5f 53 55   the WHERE_OR_SU
2aa60 42 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73 20  BCLAUSE flag is 
2aa70 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f  set, then we sho
2aa80 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65  uld.  ** only ge
2aa90 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2aaa0 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
2aab0 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  in pTabList and 
2aac0 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a  assume that.  **
2aad0 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73   any cursors ass
2aae0 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62  ociated with sub
2aaf0 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61  sequent tables a
2ab00 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  re uninitialized
2ab10 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73  ..  */.  nTabLis
2ab20 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20  t = (wctrlFlags 
2ab30 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2ab40 41 55 53 45 29 20 3f 20 31 20 3a 20 70 54 61 62  AUSE) ? 1 : pTab
2ab50 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f  List->nSrc;..  /
2ab60 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2ab70 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68  nitialize the Wh
2ab80 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
2ab90 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  e that will beco
2aba0 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75  me the.  ** retu
2abb0 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67  rn value. A sing
2abc0 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  le allocation is
2abd0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
2abe0 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a  he WhereInfo.  *
2abf0 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f  * struct, the co
2ac00 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49  ntents of WhereI
2ac10 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65  nfo.a[], the Whe
2ac20 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
2ac30 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  re.  ** and the 
2ac40 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72  WhereMaskSet str
2ac50 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68  ucture. Since Wh
2ac60 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69  ereClause contai
2ac70 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a  ns an 8-byte.  *
2ac80 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69  * field (type Bi
2ac90 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62  tmask) it must b
2aca0 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20  e aligned on an 
2acb0 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20  8-byte boundary 
2acc0 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63  on.  ** some arc
2acd0 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63  hitectures. Henc
2ace0 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62  e the ROUND8() b
2acf0 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79  elow..  */.  nBy
2ad00 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38  teWInfo = ROUND8
2ad10 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66  (sizeof(WhereInf
2ad20 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a  o)+(nTabList-1)*
2ad30 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
2ad40 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  l));.  pWInfo = 
2ad50 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2ad60 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 57 49  awNN(db, nByteWI
2ad70 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65  nfo + sizeof(Whe
2ad80 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20  reLoop));.  if( 
2ad90 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2ada0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2adb0 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
2adc0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
2add0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
2ade0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
2adf0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
2ae00 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
2ae10 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d  Info->pTabList =
2ae20 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   pTabList;.  pWI
2ae30 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  nfo->pOrderBy = 
2ae40 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e  pOrderBy;.  pWIn
2ae50 66 6f 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  fo->pWhere = pWh
2ae60 65 72 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ere;.  pWInfo->p
2ae70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73  ResultSet = pRes
2ae80 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f  ultSet;.  pWInfo
2ae90 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30  ->aiCurOnePass[0
2aea0 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75  ] = pWInfo->aiCu
2aeb0 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31  rOnePass[1] = -1
2aec0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ;.  pWInfo->nLev
2aed0 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20  el = nTabList;. 
2aee0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
2aef0 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  = pWInfo->iConti
2af00 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
2af10 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2af20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2af30 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
2af40 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d  ;.  pWInfo->iLim
2af50 69 74 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20  it = iAuxArg;.  
2af60 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
2af70 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
2af80 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
2af90 6d 65 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e  memset(&pWInfo->
2afa0 6e 4f 42 53 61 74 2c 20 30 2c 20 0a 20 20 20 20  nOBSat, 0, .    
2afb0 20 20 20 20 20 6f 66 66 73 65 74 6f 66 28 57 68       offsetof(Wh
2afc0 65 72 65 49 6e 66 6f 2c 73 57 43 29 20 2d 20 6f  ereInfo,sWC) - o
2afd0 66 66 73 65 74 6f 66 28 57 68 65 72 65 49 6e 66  ffsetof(WhereInf
2afe0 6f 2c 6e 4f 42 53 61 74 29 29 3b 0a 20 20 6d 65  o,nOBSat));.  me
2aff0 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 61 5b  mset(&pWInfo->a[
2b000 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 68  0], 0, sizeof(Wh
2b010 65 72 65 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69 73  ereLoop)+nTabLis
2b020 74 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  t*sizeof(WhereLe
2b030 76 65 6c 29 29 3b 0a 20 20 61 73 73 65 72 74 28  vel));.  assert(
2b040 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2b050 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  s==ONEPASS_OFF )
2b060 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65  ;  /* ONEPASS de
2b070 66 61 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f  faults to OFF */
2b080 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
2b090 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
2b0a0 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d  .  sWLB.pWInfo =
2b0b0 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e   pWInfo;.  sWLB.
2b0c0 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
2b0d0 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20  WC;.  sWLB.pNew 
2b0e0 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28  = (WhereLoop*)((
2b0f0 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e  (char*)pWInfo)+n
2b100 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73  ByteWInfo);.  as
2b110 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2b120 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e  _ALIGNMENT(sWLB.
2b130 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65  pNew) );.  where
2b140 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e  LoopInit(sWLB.pN
2b150 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ew);.#ifdef SQLI
2b160 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e  TE_DEBUG.  sWLB.
2b170 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b  pNew->cId = '*';
2b180 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70  .#endif..  /* Sp
2b190 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
2b1a0 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
2b1b0 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
2b1c0 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
2b1d0 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
2b1e0 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
2b1f0 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
2b200 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
2b210 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20  Set(pMaskSet);. 
2b220 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
2b230 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d  useInit(&pWInfo-
2b240 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  >sWC, pWInfo);. 
2b250 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c   sqlite3WhereSpl
2b260 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
2b270 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
2b280 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63  ;.    .  /* Spec
2b290 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f  ial case: No FRO
2b2a0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  M clause.  */.  
2b2b0 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20  if( nTabList==0 
2b2c0 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  ){.    if( pOrde
2b2d0 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  rBy ) pWInfo->nO
2b2e0 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d  BSat = pOrderBy-
2b2f0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >nExpr;.    if( 
2b300 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2b310 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
2b320 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
2b330 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
2b340 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
2b350 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 45  QUE;.    }.    E
2b360 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
2b370 28 70 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41  (pParse, 0, "SCA
2b380 4e 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 22 29  N CONSTANT ROW")
2b390 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b3a0 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
2b3b0 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
2b3c0 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
2b3d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2b3e0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2b3f0 20 54 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f   The N-th term o
2b400 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
2b410 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61 20  e is assigned a 
2b420 62 69 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e  bitmask of 1<<N.
2b430 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2b440 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70  he rule of the p
2b450 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
2b460 20 65 6e 73 75 72 65 73 20 74 68 74 61 20 69 66   ensures thta if
2b470 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
2b480 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 74  k for.    ** a t
2b490 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31  able T, then X-1
2b4a0 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
2b4b0 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61  for all other ta
2b4c0 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
2b4d0 20 6f 66 20 54 2e 0a 20 20 20 20 2a 2a 20 4b 6e   of T..    ** Kn
2b4e0 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73  owing the bitmas
2b4f0 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
2b500 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2b510 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20  a left join is. 
2b520 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e     ** important.
2b530 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
2b540 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
2b550 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73  te that bitmasks
2b560 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
2b570 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e   all pTabList->n
2b580 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20  Src tables in.  
2b590 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
2b5a0 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
2b5b0 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
2b5c0 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
2b5d0 6e 6f 72 6d 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  normally.    ** 
2b5e0 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73  equal to pTabLis
2b5f0 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68  t->nSrc but migh
2b600 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74  t be shortened t
2b610 6f 20 31 20 69 66 20 74 68 65 0a 20 20 20 20 2a  o 1 if the.    *
2b620 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  * WHERE_OR_SUBCL
2b630 41 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74  AUSE flag is set
2b640 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 69 20  ..    */.    ii 
2b650 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  = 0;.    do{.   
2b660 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d     createMask(pM
2b670 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
2b680 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
2b690 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
2b6a0 68 65 72 65 54 61 62 46 75 6e 63 41 72 67 73 28  hereTabFuncArgs(
2b6b0 70 50 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73  pParse, &pTabLis
2b6c0 74 2d 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66  t->a[ii], &pWInf
2b6d0 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 7d 77 68  o->sWC);.    }wh
2b6e0 69 6c 65 28 20 28 2b 2b 69 69 29 3c 70 54 61 62  ile( (++ii)<pTab
2b6f0 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
2b700 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2b710 42 55 47 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  BUG.    {.      
2b720 42 69 74 6d 61 73 6b 20 6d 78 20 3d 20 30 3b 0a  Bitmask mx = 0;.
2b730 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
2b740 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
2b750 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
2b760 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71    Bitmask m = sq
2b770 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
2b780 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2b790 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
2b7a0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  sor);.        as
2b7b0 73 65 72 74 28 20 6d 3e 3d 6d 78 20 29 3b 0a 20  sert( m>=mx );. 
2b7c0 20 20 20 20 20 20 20 6d 78 20 3d 20 6d 3b 0a 20         mx = m;. 
2b7d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 23       }.    }.  #
2b7e0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f  endif.  }.  .  /
2b7f0 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
2b800 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
2b810 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2b820 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a  3WhereExprAnalyz
2b830 65 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  e(pTabList, &pWI
2b840 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28  nfo->sWC);.  if(
2b850 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2b860 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
2b870 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  ginError;..  /* 
2b880 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 57 48  Special case: WH
2b890 45 52 45 20 74 65 72 6d 73 20 74 68 61 74 20 64  ERE terms that d
2b8a0 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  o not refer to a
2b8b0 6e 79 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ny tables in the
2b8c0 20 6a 6f 69 6e 0a 20 20 2a 2a 20 28 63 6f 6e 73   join.  ** (cons
2b8d0 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  tant expressions
2b8e0 29 2e 20 45 76 61 6c 75 61 74 65 20 65 61 63 68  ). Evaluate each
2b8f0 20 73 75 63 68 20 74 65 72 6d 2c 20 61 6e 64 20   such term, and 
2b900 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 74 68  jump over all th
2b910 65 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64  e.  ** generated
2b920 20 63 6f 64 65 20 69 66 20 74 68 65 20 72 65 73   code if the res
2b930 75 6c 74 20 69 73 20 6e 6f 74 20 74 72 75 65 2e  ult is not true.
2b940 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20    .  **.  ** Do 
2b950 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 74  not do this if t
2b960 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  he expression co
2b970 6e 74 61 69 6e 73 20 6e 6f 6e 2d 64 65 74 65 72  ntains non-deter
2b980 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
2b990 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 61 72 65  ns.  ** that are
2b9a0 20 6e 6f 74 20 77 69 74 68 69 6e 20 61 20 73 75   not within a su
2b9b0 62 2d 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69  b-select. This i
2b9c0 73 20 6e 6f 74 20 73 74 72 69 63 74 6c 79 20 72  s not strictly r
2b9d0 65 71 75 69 72 65 64 2c 20 62 75 74 0a 20 20 2a  equired, but.  *
2b9e0 2a 20 70 72 65 73 65 72 76 65 73 20 53 51 4c 69  * preserves SQLi
2b9f0 74 65 27 73 20 6c 65 67 61 63 79 20 62 65 68 61  te's legacy beha
2ba00 76 69 6f 75 72 20 69 6e 20 74 68 65 20 66 6f 6c  viour in the fol
2ba10 6c 6f 77 69 6e 67 20 74 77 6f 20 63 61 73 65 73  lowing two cases
2ba20 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 46 52  :.  **.  **   FR
2ba30 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 72 61 6e  OM ... WHERE ran
2ba40 64 6f 6d 28 29 3e 30 3b 20 20 20 20 20 20 20 20  dom()>0;        
2ba50 20 20 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64 6f     -- eval rando
2ba60 6d 28 29 20 6f 6e 63 65 20 70 65 72 20 72 6f 77  m() once per row
2ba70 0a 20 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e  .  **   FROM ...
2ba80 20 57 48 45 52 45 20 28 53 45 4c 45 43 54 20 72   WHERE (SELECT r
2ba90 61 6e 64 6f 6d 28 29 29 3e 30 3b 20 20 2d 2d 20  andom())>0;  -- 
2baa0 65 76 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e  eval random() on
2bab0 63 65 20 6f 76 65 72 61 6c 6c 0a 20 20 2a 2f 0a  ce overall.  */.
2bac0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73    for(ii=0; ii<s
2bad0 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  WLB.pWC->nTerm; 
2bae0 69 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  ii++){.    Where
2baf0 54 65 72 6d 20 2a 70 54 20 3d 20 26 73 57 4c 42  Term *pT = &sWLB
2bb00 2e 70 57 43 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  .pWC->a[ii];.   
2bb10 20 69 66 28 20 70 54 2d 3e 77 74 46 6c 61 67 73   if( pT->wtFlags
2bb20 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
2bb30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2bb40 69 66 28 20 70 54 2d 3e 70 72 65 72 65 71 41 6c  if( pT->prereqAl
2bb50 6c 3d 3d 30 20 26 26 20 28 6e 54 61 62 4c 69 73  l==0 && (nTabLis
2bb60 74 3d 3d 30 20 7c 7c 20 65 78 70 72 49 73 44 65  t==0 || exprIsDe
2bb70 74 65 72 6d 69 6e 69 73 74 69 63 28 70 54 2d 3e  terministic(pT->
2bb80 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 20  pExpr)) ){.     
2bb90 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
2bba0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 2d 3e  lse(pParse, pT->
2bbb0 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69  pExpr, pWInfo->i
2bbc0 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55  Break, SQLITE_JU
2bbd0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
2bbe0 20 70 54 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20   pT->wtFlags |= 
2bbf0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
2bc00 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74  }.  }..  if( wct
2bc10 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2bc20 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
2bc30 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69  .    if( isDisti
2bc40 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61  nctRedundant(pPa
2bc50 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26  rse, pTabList, &
2bc60 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65  pWInfo->sWC, pRe
2bc70 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20  sultSet) ){.    
2bc80 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43    /* The DISTINC
2bc90 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69  T marking is poi
2bca0 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20  ntless.  Ignore 
2bcb0 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  it. */.      pWI
2bcc0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
2bcd0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2bce0 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73  UNIQUE;.    }els
2bcf0 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d  e if( pOrderBy==
2bd00 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
2bd10 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68  y to ORDER BY th
2bd20 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20  e result set to 
2bd30 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72  make distinct pr
2bd40 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20  ocessing easier 
2bd50 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
2bd60 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  >wctrlFlags |= W
2bd70 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b  HERE_DISTINCTBY;
2bd80 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
2bd90 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c  OrderBy = pResul
2bda0 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tSet;.    }.  }.
2bdb0 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
2bdc0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
2bdd0 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66  jects */.#if def
2bde0 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
2bdf0 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73  ENABLED).  if( s
2be00 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2be10 20 26 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20   & 0xffff ){.   
2be20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2be30 6e 74 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ntf("*** Optimiz
2be40 65 72 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63  er Start *** (wc
2be50 74 72 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c  trlFlags: 0x%x",
2be60 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20  wctrlFlags);.   
2be70 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
2be80 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  & WHERE_USE_LIMI
2be90 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
2bea0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c  e3DebugPrintf(",
2beb0 20 6c 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75   limit: %d", iAu
2bec0 78 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xArg);.    }.   
2bed0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2bee0 6e 74 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a  ntf(")\n");.  }.
2bef0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2bf00 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20  reTrace & 0x100 
2bf10 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c  ){ /* Display al
2bf20 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
2bf30 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2bf40 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
2bf50 6c 61 75 73 65 50 72 69 6e 74 28 73 57 4c 42 2e  lausePrint(sWLB.
2bf60 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pWC);.  }.#endif
2bf70 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  ..  if( nTabList
2bf80 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72  !=1 || whereShor
2bf90 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29  tCut(&sWLB)==0 )
2bfa0 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  {.    rc = where
2bfb0 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42  LoopAddAll(&sWLB
2bfc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2bfd0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2bfe0 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20  rror;.  .#ifdef 
2bff0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2c000 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
2c010 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 20  e3WhereTrace ){ 
2c020 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c     /* Display al
2c030 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  l of the WhereLo
2c040 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
2c050 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
2c060 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
2c070 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
2c080 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20  t char zLabel[] 
2c090 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
2c0a0 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
2c0b0 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20  tuvwyxz".       
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0e0 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49        "ABCDEFGHI
2c0f0 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58  JKLMNOPQRSTUVWYX
2c100 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  Z";.      for(p=
2c110 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
2c120 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  i=0; p; p=p->pNe
2c130 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20  xtLoop, i++){.  
2c140 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
2c150 4c 61 62 65 6c 5b 69 25 28 73 69 7a 65 6f 66 28  Label[i%(sizeof(
2c160 7a 4c 61 62 65 6c 29 2d 31 29 5d 3b 0a 20 20 20  zLabel)-1)];.   
2c170 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
2c180 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29  int(p, sWLB.pWC)
2c190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c1a0 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68  #endif.  .    wh
2c1b0 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
2c1c0 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66  Info, 0);.    if
2c1d0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2c1e0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
2c1f0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69  eginError;.    i
2c200 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
2c210 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68  rBy ){.       wh
2c220 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
2c230 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52  Info, pWInfo->nR
2c240 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20  owOut+1);.      
2c250 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2c260 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
2c270 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
2c280 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
2c290 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
2c2a0 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  0 && (db->flags 
2c2b0 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
2c2c0 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20  Order)!=0 ){.   
2c2d0 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
2c2e0 6b 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d  k = ALLBITS;.  }
2c2f0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2c300 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d  Err || NEVER(db-
2c310 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29  >mallocFailed) )
2c320 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
2c330 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
2c340 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2c350 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2c360 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2c370 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
2c380 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
2c390 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d  - Solution nRow=
2c3a0 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  %d", pWInfo->nRo
2c3b0 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70  wOut);.    if( p
2c3c0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20  WInfo->nOBSat>0 
2c3d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c3e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52  DebugPrintf(" OR
2c3f0 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22  DERBY=%d,0x%llx"
2c400 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  , pWInfo->nOBSat
2c410 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
2c420 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  k);.    }.    sw
2c430 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44  itch( pWInfo->eD
2c440 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2c450 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
2c460 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
2c470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2c480 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
2c490 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a  TINCT=unique");.
2c4a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
2c4c0 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
2c4d0 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
2c4e0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c4f0 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
2c500 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  CT=ordered");.  
2c510 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c520 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
2c530 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2c540 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  NORDERED: {.    
2c550 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c560 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
2c570 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a  CT=unordered");.
2c580 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c5a0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2c5b0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ntf("\n");.    f
2c5c0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e  or(ii=0; ii<pWIn
2c5d0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b  fo->nLevel; ii++
2c5e0 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
2c5f0 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e  opPrint(pWInfo->
2c600 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57  a[ii].pWLoop, sW
2c610 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20  LB.pWC);.    }. 
2c620 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2c630 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20  Attempt to omit 
2c640 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20  tables from the 
2c650 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74  join that do not
2c660 20 61 66 66 65 63 74 20 74 68 65 20 72 65 73 75   affect the resu
2c670 6c 74 2e 0a 20 20 2a 2a 20 46 6f 72 20 61 20 74  lt..  ** For a t
2c680 61 62 6c 65 20 74 6f 20 6e 6f 74 20 61 66 66 65  able to not affe
2c690 63 74 20 74 68 65 20 72 65 73 75 6c 74 2c 20 74  ct the result, t
2c6a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73  he following mus
2c6b0 74 20 62 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  t be true:.  **.
2c6c0 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 71 75    **   1) The qu
2c6d0 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ery must not be 
2c6e0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 20 20  an aggregate..  
2c6f0 2a 2a 20 20 20 32 29 20 54 68 65 20 74 61 62 6c  **   2) The tabl
2c700 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 52 48  e must be the RH
2c710 53 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  S of a LEFT JOIN
2c720 2e 0a 20 20 2a 2a 20 20 20 33 29 20 45 69 74 68  ..  **   3) Eith
2c730 65 72 20 74 68 65 20 71 75 65 72 79 20 6d 75 73  er the query mus
2c740 74 20 62 65 20 44 49 53 54 49 4e 43 54 2c 20 6f  t be DISTINCT, o
2c750 72 20 65 6c 73 65 20 74 68 65 20 4f 4e 20 6f 72  r else the ON or
2c760 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20   USING clause.  
2c770 2a 2a 20 20 20 20 20 20 6d 75 73 74 20 63 6f 6e  **      must con
2c780 74 61 69 6e 20 61 20 63 6f 6e 73 74 72 61 69 6e  tain a constrain
2c790 74 20 74 68 61 74 20 6c 69 6d 69 74 73 20 74 68  t that limits th
2c7a0 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 74 61  e scan of the ta
2c7b0 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 20 20 20  ble to .  **    
2c7c0 20 20 61 74 20 6d 6f 73 74 20 61 20 73 69 6e 67    at most a sing
2c7d0 6c 65 20 72 6f 77 2e 0a 20 20 2a 2a 20 20 20 34  le row..  **   4
2c7e0 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74  ) The table must
2c7f0 20 6e 6f 74 20 62 65 20 72 65 66 65 72 65 6e 63   not be referenc
2c800 65 64 20 62 79 20 61 6e 79 20 70 61 72 74 20 6f  ed by any part o
2c810 66 20 74 68 65 20 71 75 65 72 79 20 61 70 61 72  f the query apar
2c820 74 0a 20 20 2a 2a 20 20 20 20 20 20 66 72 6f 6d  t.  **      from
2c830 20 69 74 73 20 6f 77 6e 20 55 53 49 4e 47 20 6f   its own USING o
2c840 72 20 4f 4e 20 63 6c 61 75 73 65 2e 0a 20 20 2a  r ON clause..  *
2c850 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70  *.  ** For examp
2c860 6c 65 2c 20 67 69 76 65 6e 3a 0a 20 20 2a 2a 0a  le, given:.  **.
2c870 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
2c880 54 41 42 4c 45 20 74 31 28 69 70 6b 20 49 4e 54  TABLE t1(ipk INT
2c890 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2c8a0 2c 20 76 31 29 3b 0a 20 20 2a 2a 20 20 20 20 20  , v1);.  **     
2c8b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
2c8c0 69 70 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ipk INTEGER PRIM
2c8d0 41 52 59 20 4b 45 59 2c 20 76 32 29 3b 0a 20 20  ARY KEY, v2);.  
2c8e0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
2c8f0 42 4c 45 20 74 33 28 69 70 6b 20 49 4e 54 45 47  BLE t3(ipk INTEG
2c900 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
2c910 76 33 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 74  v3);.  **.  ** t
2c920 68 65 6e 20 74 61 62 6c 65 20 74 32 20 63 61 6e  hen table t2 can
2c930 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   be omitted from
2c940 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
2c950 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
2c960 4c 45 43 54 20 76 31 2c 20 76 33 20 46 52 4f 4d  LECT v1, v3 FROM
2c970 20 74 31 20 0a 20 20 2a 2a 20 20 20 20 20 20 20   t1 .  **       
2c980 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 55 53 49  LEFT JOIN t2 USI
2c990 4e 47 20 28 74 31 2e 69 70 6b 3d 74 32 2e 69 70  NG (t1.ipk=t2.ip
2c9a0 6b 29 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45  k).  **       LE
2c9b0 46 54 20 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47  FT JOIN t3 USING
2c9c0 20 28 74 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29   (t1.ipk=t3.ipk)
2c9d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6f 72 20 66 72  .  **.  ** or fr
2c9e0 6f 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  om:.  **.  **   
2c9f0 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
2ca00 54 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31  T v1, v3 FROM t1
2ca10 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46   .  **       LEF
2ca20 54 20 4a 4f 49 4e 20 74 32 0a 20 20 2a 2a 20 20  T JOIN t2.  **  
2ca30 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74       LEFT JOIN t
2ca40 33 20 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d  3 USING (t1.ipk=
2ca50 74 33 2e 69 70 6b 29 0a 20 20 2a 2f 0a 20 20 6e  t3.ipk).  */.  n
2ca60 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
2ca70 61 73 6b 29 30 3b 0a 20 20 69 66 28 20 70 57 49  ask)0;.  if( pWI
2ca80 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20  nfo->nLevel>=2. 
2ca90 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21    && pResultSet!
2caa0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
2cab0 20 2f 2a 20 67 75 61 72 61 6e 74 65 65 73 20 63   /* guarantees c
2cac0 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
2cad0 76 65 20 2a 2f 0a 20 20 20 26 26 20 4f 70 74 69  ve */.   && Opti
2cae0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2caf0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e  db, SQLITE_OmitN
2cb00 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20  oopJoin).  ){.  
2cb10 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 69 74    int i;.    Bit
2cb20 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73  mask tabUsed = s
2cb30 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
2cb40 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
2cb50 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a  t, pResultSet);.
2cb60 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72      if( sWLB.pOr
2cb70 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74  derBy ){.      t
2cb80 61 62 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65  abUsed |= sqlite
2cb90 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
2cba0 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57  age(pMaskSet, sW
2cbb0 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  LB.pOrderBy);.  
2cbc0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 70 57    }.    for(i=pW
2cbd0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
2cbe0 69 3e 3d 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=1; i--){.    
2cbf0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2cc00 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20  rm, *pEnd;.     
2cc10 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2cc20 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
2cc30 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66     pLoop = pWInf
2cc40 6f 2d 3e 61 5b 69 5d 2e 70 57 4c 6f 6f 70 3b 0a  o->a[i].pWLoop;.
2cc50 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
2cc60 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2cc70 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 3b  >a[pLoop->iTab];
2cc80 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 74 65  .      if( (pIte
2cc90 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
2cca0 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 63   JT_LEFT)==0 ) c
2ccb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2ccc0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
2ccd0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2cce0 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20  INCT)==0.       
2ccf0 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
2cd00 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
2cd10 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  W)==0.      ){. 
2cd20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2cd30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2cd40 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c  f( (tabUsed & pL
2cd50 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
2cd60 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2cd70 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
2cd80 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
2cd90 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
2cda0 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
2cdb0 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
2cdc0 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
2cdd0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2cde0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
2cdf0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
2ce00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2ce10 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2ce20 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
2ce30 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
2ce40 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72           || pTer
2ce50 6d 2d 3e 70 45 78 70 72 2d 3e 69 52 69 67 68 74  m->pExpr->iRight
2ce60 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 49 74 65 6d  JoinTable!=pItem
2ce70 2d 3e 69 43 75 72 73 6f 72 0a 20 20 20 20 20 20  ->iCursor.      
2ce80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2ce90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2cea0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2ceb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2cec0 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 63  ( pTerm<pEnd ) c
2ced0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57  ontinue;.      W
2cee0 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
2cef0 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70  , ("-> drop loop
2cf00 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c   %c not used\n",
2cf10 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20   pLoop->cId));. 
2cf20 20 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d       notReady &=
2cf30 20 7e 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   ~pLoop->maskSel
2cf40 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  f;.      for(pTe
2cf50 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20  rm=sWLB.pWC->a; 
2cf60 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72  pTerm<pEnd; pTer
2cf70 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
2cf80 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
2cf90 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
2cfa0 6b 53 65 6c 66 29 21 3d 30 20 29 7b 0a 20 20 20  kSelf)!=0 ){.   
2cfb0 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74         pTerm->wt
2cfc0 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
2cfd0 44 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  DED;.        }. 
2cfe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2cff0 20 69 21 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   i!=pWInfo->nLev
2d000 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  el-1 ){.        
2d010 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 57 49  int nByte = (pWI
2d020 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 2d 69 29  nfo->nLevel-1-i)
2d030 20 2a 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c   * sizeof(WhereL
2d040 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 6d  evel);.        m
2d050 65 6d 6d 6f 76 65 28 26 70 57 49 6e 66 6f 2d 3e  emmove(&pWInfo->
2d060 61 5b 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 61  a[i], &pWInfo->a
2d070 5b 69 2b 31 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  [i+1], nByte);. 
2d080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 49       }.      pWI
2d090 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20  nfo->nLevel--;. 
2d0a0 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b       nTabList--;
2d0b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45  .    }.  }.  WHE
2d0c0 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
2d0d0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
2d0e0 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
2d0f0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
2d100 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b  se->nQueryLoop +
2d110 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  = pWInfo->nRowOu
2d120 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
2d130 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44  caller is an UPD
2d140 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
2d150 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
2d160 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
2d170 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  to use a one-pas
2d180 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74  s algorithm, det
2d190 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69  ermine if this i
2d1a0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
2d1b0 20 2a 2a 0a 20 20 2a 2a 20 41 20 6f 6e 65 2d 70   **.  ** A one-p
2d1c0 61 73 73 20 61 70 70 72 6f 61 63 68 20 63 61 6e  ass approach can
2d1d0 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
2d1e0 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65  caller has reque
2d1f0 73 74 65 64 20 6f 6e 65 0a 20 20 2a 2a 20 61 6e  sted one.  ** an
2d200 64 20 65 69 74 68 65 72 20 28 61 29 20 74 68 65  d either (a) the
2d210 20 73 63 61 6e 20 76 69 73 69 74 73 20 61 74 20   scan visits at 
2d220 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 20 6f 72 20  most one row or 
2d230 28 62 29 20 65 61 63 68 0a 20 20 2a 2a 20 6f 66  (b) each.  ** of
2d240 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2d250 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  re true:.  **.  
2d260 2a 2a 20 20 20 2a 20 74 68 65 20 63 61 6c 6c 65  **   * the calle
2d270 72 20 68 61 73 20 69 6e 64 69 63 61 74 65 64 20  r has indicated 
2d280 74 68 61 74 20 61 20 6f 6e 65 2d 70 61 73 73 20  that a one-pass 
2d290 61 70 70 72 6f 61 63 68 20 63 61 6e 20 62 65 20  approach can be 
2d2a0 75 73 65 64 0a 20 20 2a 2a 20 20 20 20 20 77 69  used.  **     wi
2d2b0 74 68 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  th multiple rows
2d2c0 20 28 62 79 20 73 65 74 74 69 6e 67 20 57 48 45   (by setting WHE
2d2d0 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
2d2e0 52 4f 57 29 2c 20 61 6e 64 0a 20 20 2a 2a 20 20  ROW), and.  **  
2d2f0 20 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20   * the table is 
2d300 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
2d310 62 6c 65 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  ble, and.  **   
2d320 2a 20 65 69 74 68 65 72 20 74 68 65 20 73 63 61  * either the sca
2d330 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 74  n does not use t
2d340 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69  he OR optimizati
2d350 6f 6e 20 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  on or the caller
2d360 0a 20 20 2a 2a 20 20 20 20 20 69 73 20 61 20 44  .  **     is a D
2d370 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 20  ELETE operation 
2d380 28 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45  (WHERE_DUPLICATE
2d390 53 5f 4f 4b 20 69 73 20 6f 6e 6c 79 20 73 70 65  S_OK is only spe
2d3a0 63 69 66 69 65 64 0a 20 20 2a 2a 20 20 20 20 20  cified.  **     
2d3b0 66 6f 72 20 44 45 4c 45 54 45 29 2e 0a 20 20 2a  for DELETE)..  *
2d3c0 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20  *.  ** The last 
2d3d0 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 69 73  qualification is
2d3e0 20 62 65 63 61 75 73 65 20 61 6e 20 55 50 44 41   because an UPDA
2d3f0 54 45 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  TE statement use
2d400 73 0a 20 20 2a 2a 20 57 68 65 72 65 49 6e 66 6f  s.  ** WhereInfo
2d410 2e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  .aiCurOnePass[1]
2d420 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
2d430 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20  ether or not it 
2d440 72 65 61 6c 6c 79 20 63 61 6e 0a 20 20 2a 2a 20  really can.  ** 
2d450 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
2d460 70 70 72 6f 61 63 68 2c 20 61 6e 64 20 74 68 69  pproach, and thi
2d470 73 20 69 73 20 6e 6f 74 20 73 65 74 20 61 63 63  s is not set acc
2d480 75 72 61 74 65 6c 79 20 66 6f 72 20 73 63 61 6e  urately for scan
2d490 73 0a 20 20 2a 2a 20 74 68 61 74 20 75 73 65 20  s.  ** that use 
2d4a0 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74  the OR optimizat
2d4b0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ion..  */.  asse
2d4c0 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
2d4d0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2d4e0 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70  DESIRED)==0 || p
2d4f0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31  WInfo->nLevel==1
2d500 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c   );.  if( (wctrl
2d510 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2d520 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
2d530 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 77 73 46  0 ){.    int wsF
2d540 6c 61 67 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  lags = pWInfo->a
2d550 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
2d560 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e  ags;.    int bOn
2d570 65 72 6f 77 20 3d 20 28 77 73 46 6c 61 67 73 20  erow = (wsFlags 
2d580 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21  & WHERE_ONEROW)!
2d590 3d 30 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e 65  =0;.    if( bOne
2d5a0 72 6f 77 20 7c 7c 20 28 0a 20 20 20 20 20 20 20  row || (.       
2d5b0 20 30 21 3d 28 77 63 74 72 6c 46 6c 61 67 73 20   0!=(wctrlFlags 
2d5c0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2d5d0 4d 55 4c 54 49 52 4f 57 29 0a 20 20 20 20 20 26  MULTIROW).     &
2d5e0 26 20 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20  & 0==(wsFlags & 
2d5f0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2d600 4c 45 29 0a 20 20 20 20 20 26 26 20 28 30 3d 3d  LE).     && (0==
2d610 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
2d620 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
2d630 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2d640 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
2d650 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20  ).    )){.      
2d660 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2d670 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45   = bOnerow ? ONE
2d680 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e  PASS_SINGLE : ON
2d690 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20  EPASS_MULTI;.   
2d6a0 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
2d6b0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  pTabList->a[0].p
2d6c0 54 61 62 29 20 26 26 20 28 77 73 46 6c 61 67 73  Tab) && (wsFlags
2d6d0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2d6e0 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Y) ){.        if
2d6f0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2d700 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c  HERE_ONEPASS_MUL
2d710 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  TIROW ){.       
2d720 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20     bFordelete = 
2d730 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45  OPFLAG_FORDELETE
2d740 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d750 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
2d760 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
2d770 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 7e 57   = (wsFlags & ~W
2d780 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a  HERE_IDX_ONLY);.
2d790 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d7a0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
2d7b0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
2d7c0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
2d7d0 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
2d7e0 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
2d7f0 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
2d800 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
2d810 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
2d820 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  ->a; ii<nTabList
2d830 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  ; ii++, pLevel++
2d840 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
2d850 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
2d860 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
2d870 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
2d880 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
2d890 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
2d8a0 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
2d8b0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2d8c0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
2d8d0 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d  m;..    pTabItem
2d8e0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
2d8f0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
2d900 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49      pTab = pTabI
2d910 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
2d920 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
2d930 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
2d940 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
2d950 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
2d960 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
2d970 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
2d980 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2d990 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53  )!=0 || pTab->pS
2d9a0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f  elect ){.      /
2d9b0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
2d9c0 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65      }else.#ifnde
2d9d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2d9e0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
2d9f0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
2da00 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2da10 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
2da20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2da30 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
2da40 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65  char *)sqlite3Ge
2da50 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
2da60 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75  );.      int iCu
2da70 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
2da80 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  ursor;.      sql
2da90 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2daa0 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
2dab0 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50  , 0, 0, pVTab, P
2dac0 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
2dad0 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
2dae0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
2daf0 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* noop */.    }
2db00 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2db10 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2db20 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2db30 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
2db40 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
2db50 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
2db60 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  LAUSE)==0 ){.   
2db70 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f     int op = OP_O
2db80 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 69  penRead;.      i
2db90 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  f( pWInfo->eOneP
2dba0 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass!=ONEPASS_OFF
2dbb0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
2dbc0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
2dbd0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
2dbe0 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
2dbf0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2dc00 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  or;.      };.   
2dc10 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
2dc20 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
2dc30 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69  Item->iCursor, i
2dc40 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20  Db, pTab, op);. 
2dc50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2dc60 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d  bItem->iCursor==
2dc70 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
2dc80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2dc90 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  e( pWInfo->eOneP
2dca0 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
2dcb0 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
2dcc0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
2dcd0 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d  estcase( pWInfo-
2dce0 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
2dcf0 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e  SS_OFF && pTab->
2dd00 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  nCol==BMS );.   
2dd10 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65     if( pWInfo->e
2dd20 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
2dd30 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43  _OFF && pTab->nC
2dd40 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77  ol<BMS && HasRow
2dd50 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
2dd60 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
2dd70 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
2dd80 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
2dd90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
2dda0 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e  r(; b; b=b>>1, n
2ddb0 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71  ++){}.        sq
2ddc0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2ddd0 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  4(v, -1, SQLITE_
2dde0 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
2ddf0 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
2de00 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
2de10 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
2de20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2de30 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
2de40 49 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 70  INTS.      if( p
2de50 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2de60 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  ndex!=0 ){.     
2de70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2de80 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
2de90 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c 65  _SEEKEQ|bFordele
2dea0 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  te);.      }else
2deb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
2dec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2ded0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 62  dbeChangeP5(v, b
2dee0 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20  Fordelete);.    
2def0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2df00 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
2df10 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20  USED_MASK.      
2df20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2df30 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
2df40 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49 74 65  mnsUsed, pTabIte
2df50 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20 30  m->iCursor, 0, 0
2df60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2df80 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62 49 74  onst u8*)&pTabIt
2df90 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f  em->colUsed, P4_
2dfa0 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20  INT64);.#endif. 
2dfb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2dfc0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
2dfd0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
2dfe0 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
2dff0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
2e000 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
2e010 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e020 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20  INDEXED ){.     
2e030 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c   Index *pIx = pL
2e040 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2e050 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  dex;.      int i
2e060 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
2e070 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e  int op = OP_Open
2e080 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69  Read;.      /* i
2e090 41 75 78 41 72 67 20 69 73 20 61 6c 77 61 79 73  AuxArg is always
2e0a0 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69   set to a positi
2e0b0 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45 50  ve value if ONEP
2e0c0 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ASS is possible 
2e0d0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2e0e0 20 69 41 75 78 41 72 67 21 3d 30 20 7c 7c 20 28   iAuxArg!=0 || (
2e0f0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2e100 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2e110 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 29  SS_DESIRED)==0 )
2e120 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48 61 73  ;.      if( !Has
2e130 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 49  Rowid(pTab) && I
2e140 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
2e150 28 70 49 78 29 0a 20 20 20 20 20 20 20 26 26 20  (pIx).       && 
2e160 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2e170 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2e180 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )!=0.      ){.  
2e190 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
2e1a0 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 6e 20   one term of an 
2e1b0 4f 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR-optimization 
2e1c0 75 73 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52  using the PRIMAR
2e1d0 59 20 4b 45 59 20 6f 66 20 61 0a 20 20 20 20 20  Y KEY of a.     
2e1e0 20 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f     ** WITHOUT RO
2e1f0 57 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e  WID table.  No n
2e200 65 65 64 20 66 6f 72 20 61 20 73 65 70 61 72 61  eed for a separa
2e210 74 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  te index */.    
2e220 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
2e230 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b  pLevel->iTabCur;
2e240 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 30 3b  .        op = 0;
2e250 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2e260 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2e270 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  s!=ONEPASS_OFF )
2e280 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  {.        Index 
2e290 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  *pJ = pTabItem->
2e2a0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
2e2b0 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
2e2c0 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20  = iAuxArg;.     
2e2d0 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c     assert( wctrl
2e2e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2e2f0 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b  EPASS_DESIRED );
2e300 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
2e310 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a  ALWAYS(pJ) && pJ
2e320 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20  !=pIx ){.       
2e330 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a     iIndexCur++;.
2e340 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70            pJ = p
2e350 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  J->pNext;.      
2e360 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d    }.        op =
2e370 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
2e380 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
2e390 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
2e3a0 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
2e3b0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 41 75 78    }else if( iAux
2e3c0 41 72 67 20 26 26 20 28 77 63 74 72 6c 46 6c 61  Arg && (wctrlFla
2e3d0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
2e3e0 42 43 4c 41 55 53 45 29 21 3d 30 20 29 7b 0a 20  BCLAUSE)!=0 ){. 
2e3f0 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2e400 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20   = iAuxArg;.    
2e410 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70      op = OP_Reop
2e420 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c  enIdx;.      }el
2e430 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64  se{.        iInd
2e440 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  exCur = pParse->
2e450 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nTab++;.      }.
2e460 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
2e470 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75  dxCur = iIndexCu
2e480 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
2e490 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
2e4a0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
2e4b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49        assert( iI
2e4c0 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  ndexCur>=0 );.  
2e4d0 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20      if( op ){.  
2e4e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e4f0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
2e500 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74  IndexCur, pIx->t
2e510 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
2e520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
2e530 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
2e540 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20  e, pIx);.       
2e550 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2e560 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
2e570 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20 20 20  STRAINT)!=0.    
2e580 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
2e590 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
2e5a0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
2e5b0 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d  ERE_SKIPSCAN))==
2e5c0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
2e5d0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2e5e0 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  s&WHERE_ORDERBY_
2e5f0 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  MIN)==0.        
2e600 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73   && pWInfo->eDis
2e610 74 69 6e 63 74 21 3d 57 48 45 52 45 5f 44 49 53  tinct!=WHERE_DIS
2e620 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 0a 20 20  TINCT_ORDERED.  
2e630 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2e640 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2e650 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
2e660 5f 53 45 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e  _SEEKEQ); /* Hin
2e670 74 20 74 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20  t to COMDB2 */. 
2e680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e690 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2e6a0 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
2e6b0 65 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  e));.#ifdef SQLI
2e6c0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
2e6d0 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
2e6e0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75     {.          u
2e6f0 36 34 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a  64 colUsed = 0;.
2e700 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
2e710 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  , jj;.          
2e720 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 78  for(ii=0; ii<pIx
2e730 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29  ->nColumn; ii++)
2e740 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  {.            jj
2e750 20 3d 20 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e   = pIx->aiColumn
2e760 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [ii];.          
2e770 20 20 69 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e    if( jj<0 ) con
2e780 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2e790 20 20 20 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a     if( jj>63 ) j
2e7a0 6a 20 3d 20 36 33 3b 0a 20 20 20 20 20 20 20 20  j = 63;.        
2e7b0 20 20 20 20 69 66 28 20 28 70 54 61 62 49 74 65      if( (pTabIte
2e7c0 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  m->colUsed & MAS
2e7d0 4b 42 49 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63  KBIT(jj))==0 ) c
2e7e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2e7f0 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20       colUsed |= 
2e800 28 28 75 36 34 29 31 29 3c 3c 28 69 69 3c 36 33  ((u64)1)<<(ii<63
2e810 20 3f 20 69 69 20 3a 20 36 33 29 3b 0a 20 20 20   ? ii : 63);.   
2e820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e840 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
2e850 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64  olumnsUsed, iInd
2e860 65 78 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20  exCur, 0, 0,.   
2e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 38               (u8
2e890 2a 29 26 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49  *)&colUsed, P4_I
2e8a0 4e 54 36 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  NT64);.        }
2e8b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2e8c0 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
2e8d0 55 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20  USED_MASK */.   
2e8e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2e8f0 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69  f( iDb>=0 ) sqli
2e900 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
2e910 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
2e920 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
2e930 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
2e940 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2e950 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
2e960 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2e970 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2e980 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
2e990 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
2e9a0 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
2e9b0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
2e9c0 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
2e9d0 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
2e9e0 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
2e9f0 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
2ea00 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
2ea10 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  gram..  */.  for
2ea20 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
2ea30 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  st; ii++){.    i
2ea40 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a  nt addrExplain;.
2ea50 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b      int wsFlags;
2ea60 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
2ea70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20  WInfo->a[ii];.  
2ea80 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76    wsFlags = pLev
2ea90 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
2eaa0 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ags;.#ifndef SQL
2eab0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
2eac0 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
2ead0 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
2eae0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2eaf0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
2eb00 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
2eb10 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
2eb20 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66  x(pParse, &pWInf
2eb30 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20  o->sWC,.        
2eb40 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73          &pTabLis
2eb50 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2eb60 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  om], notReady, p
2eb70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66  Level);.      if
2eb80 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2eb90 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
2eba0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
2ebb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72  .#endif.    addr
2ebc0 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
2ebd0 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65  3WhereExplainOne
2ebe0 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50  Scan(.        pP
2ebf0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2ec00 70 4c 65 76 65 6c 2c 20 77 63 74 72 6c 46 6c 61  pLevel, wctrlFla
2ec10 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 4c  gs.    );.    pL
2ec20 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d  evel->addrBody =
2ec30 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2ec40 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2ec50 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69 74  notReady = sqlit
2ec60 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f  e3WhereCodeOneLo
2ec70 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
2ec80 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20  ii, notReady);. 
2ec90 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
2eca0 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
2ecb0 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28  ddrCont;.    if(
2ecc0 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f   (wsFlags&WHERE_
2ecd0 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20  MULTI_OR)==0 && 
2ece0 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
2ecf0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
2ed00 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2ed10 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53  te3WhereAddScanS
2ed20 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73  tatus(v, pTabLis
2ed30 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45  t, pLevel, addrE
2ed40 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  xplain);.    }. 
2ed50 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a   }..  /* Done. *
2ed60 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
2ed70 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
2ed80 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
2ed90 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
2eda0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
2edb0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
2edc0 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
2edd0 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
2ede0 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
2edf0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
2ee00 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2ee10 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
2ee20 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
2ee30 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
2ee40 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
2ee50 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33 57 68  art of sqlite3Wh
2ee60 65 72 65 45 6e 64 28 29 20 77 69 6c 6c 20 72 65  ereEnd() will re
2ee70 77 72 69 74 65 20 6f 70 63 6f 64 65 73 20 74 6f  write opcodes to
2ee80 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 0a 2a   reference the.*
2ee90 2a 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  * index rather t
2eea0 68 61 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62  han the main tab
2eeb0 6c 65 2e 20 20 49 6e 20 53 51 4c 49 54 45 5f 44  le.  In SQLITE_D
2eec0 45 42 55 47 20 6d 6f 64 65 2c 20 77 65 20 77 61  EBUG mode, we wa
2eed0 6e 74 0a 2a 2a 20 74 6f 20 74 72 61 63 65 20 74  nt.** to trace t
2eee0 68 6f 73 65 20 63 68 61 6e 67 65 73 20 69 66 20  hose changes if 
2eef0 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f  PRAGMA vdbe_addo
2ef00 70 74 72 61 63 65 3d 6f 6e 2e 20 20 54 68 69 73  ptrace=on.  This
2ef10 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
2ef20 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65   that..*/.#ifnde
2ef30 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23  f SQLITE_DEBUG.#
2ef40 20 64 65 66 69 6e 65 20 4f 70 63 6f 64 65 52 65   define OpcodeRe
2ef50 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b 2c 50  writeTrace(D,K,P
2ef60 29 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65  ) /* no-op */.#e
2ef70 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4f 70 63  lse.# define Opc
2ef80 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65 28  odeRewriteTrace(
2ef90 44 2c 4b 2c 50 29 20 73 71 6c 69 74 65 33 57 68  D,K,P) sqlite3Wh
2efa0 65 72 65 4f 70 63 6f 64 65 52 65 77 72 69 74 65  ereOpcodeRewrite
2efb0 54 72 61 63 65 28 44 2c 4b 2c 50 29 0a 20 20 73  Trace(D,K,P).  s
2efc0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2efd0 65 33 57 68 65 72 65 4f 70 63 6f 64 65 52 65 77  e3WhereOpcodeRew
2efe0 72 69 74 65 54 72 61 63 65 28 0a 20 20 20 20 73  riteTrace(.    s
2eff0 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 20 20  qlite3 *db,.    
2f000 69 6e 74 20 70 63 2c 0a 20 20 20 20 56 64 62 65  int pc,.    Vdbe
2f010 4f 70 20 2a 70 4f 70 0a 20 20 29 7b 0a 20 20 20  Op *pOp.  ){.   
2f020 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
2f030 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
2f040 6f 70 54 72 61 63 65 29 3d 3d 30 20 29 20 72 65  opTrace)==0 ) re
2f050 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
2f060 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
2f070 70 63 2c 20 70 4f 70 29 3b 0a 20 20 7d 0a 23 65  pc, pOp);.  }.#e
2f080 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
2f090 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  rate the end of 
2f0a0 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
2f0b0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e   See comments on
2f0c0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72   .** sqlite3Wher
2f0d0 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64  eBegin() for add
2f0e0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
2f0f0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2f100 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65  ite3WhereEnd(Whe
2f110 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
2f120 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2f130 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2f140 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  e;.  Vdbe *v = p
2f150 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2f160 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
2f170 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57  vel *pLevel;.  W
2f180 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
2f190 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2f1a0 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
2f1b0 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  TabList;.  sqlit
2f1c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2f1d0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  >db;..  /* Gener
2f1e0 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  ate loop termina
2f1f0 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  tion code..  */.
2f200 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
2f210 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
2f220 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 66 6f  RE-core"));.  fo
2f230 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  r(i=pWInfo->nLev
2f240 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  el-1; i>=0; i--)
2f250 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
2f260 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
2f270 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
2f280 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
2f290 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  pWLoop;.    if( 
2f2a0 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
2f2b0 6f 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  oop ){.#ifndef S
2f2c0 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b  QLITE_DISABLE_SK
2f2d0 49 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43 54  IPAHEAD_DISTINCT
2f2e0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2f2f0 65 65 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 49  eek = 0;.      I
2f300 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
2f310 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69    int n;.      i
2f320 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  f( pWInfo->eDist
2f330 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
2f340 49 4e 43 54 5f 4f 52 44 45 52 45 44 0a 20 20 20  INCT_ORDERED.   
2f350 20 20 20 20 26 26 20 69 3d 3d 70 57 49 6e 66 6f      && i==pWInfo
2f360 2d 3e 6e 4c 65 76 65 6c 2d 31 20 20 2f 2a 20 54  ->nLevel-1  /* T
2f370 69 63 6b 65 74 20 5b 65 66 39 33 31 38 37 35 37  icket [ef9318757
2f380 62 31 35 32 65 33 5d 20 32 30 31 37 2d 31 30 2d  b152e3] 2017-10-
2f390 32 31 20 2a 2f 0a 20 20 20 20 20 20 20 26 26 20  21 */.       && 
2f3a0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2f3b0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2f3c0 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  !=0.       && (p
2f3d0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
2f3e0 74 72 65 65 2e 70 49 6e 64 65 78 29 2d 3e 68 61  tree.pIndex)->ha
2f3f0 73 53 74 61 74 31 0a 20 20 20 20 20 20 20 26 26  sStat1.       &&
2f400 20 28 6e 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   (n = pLoop->u.b
2f410 74 72 65 65 2e 6e 49 64 78 43 6f 6c 29 3e 30 0a  tree.nIdxCol)>0.
2f420 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
2f430 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 5d 3e 3d  aiRowLogEst[n]>=
2f440 33 36 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  36.      ){.    
2f450 20 20 20 20 69 6e 74 20 72 31 20 3d 20 70 50 61      int r1 = pPa
2f460 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
2f470 20 20 20 20 20 69 6e 74 20 6a 2c 20 6f 70 3b 0a       int j, op;.
2f480 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2f490 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<n; j++){.    
2f4a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f4b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
2f4c0 6c 75 6d 6e 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lumn, pLevel->iI
2f4d0 64 78 43 75 72 2c 20 6a 2c 20 72 31 2b 6a 29 3b  dxCur, j, r1+j);
2f4e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f4f0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
2f500 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 20 20 20 20  += n+1;.        
2f510 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  op = pLevel->op=
2f520 3d 4f 50 5f 50 72 65 76 20 3f 20 4f 50 5f 53 65  =OP_Prev ? OP_Se
2f530 65 6b 4c 54 20 3a 20 4f 50 5f 53 65 65 6b 47 54  ekLT : OP_SeekGT
2f540 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 53 65  ;.        addrSe
2f550 65 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ek = sqlite3Vdbe
2f560 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
2f570 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2f580 2c 20 30 2c 20 72 31 2c 20 6e 29 3b 0a 20 20 20  , 0, r1, n);.   
2f590 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2f5a0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65  eIf(v, op==OP_Se
2f5b0 65 6b 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 56  ekLT);.        V
2f5c0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2f5d0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b   op==OP_SeekGT);
2f5e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f5f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2f600 5f 47 6f 74 6f 2c 20 31 2c 20 70 4c 65 76 65 6c  _Goto, 1, pLevel
2f610 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ->p2);.      }.#
2f620 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2f630 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41  DISABLE_SKIPAHEA
2f640 44 5f 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  D_DISTINCT */.  
2f650 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f      /* The commo
2f660 6e 20 63 61 73 65 3a 20 41 64 76 61 6e 63 65 20  n case: Advance 
2f670 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  to the next row 
2f680 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2f690 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2f6a0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2f6b0 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
2f6c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f6d0 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
2f6e0 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
2f6f0 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33  ->p2, pLevel->p3
2f700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f710 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2f720 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
2f730 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
2f740 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
2f750 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
2f760 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29  el->op==OP_Next)
2f770 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2f780 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
2f790 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a  ->op==OP_Prev);.
2f7a0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2f7b0 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
2f7c0 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 23  op==OP_VNext);.#
2f7d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
2f7e0 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f  SABLE_SKIPAHEAD_
2f7f0 44 49 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69  DISTINCT.      i
2f800 66 28 20 61 64 64 72 53 65 65 6b 20 29 20 73 71  f( addrSeek ) sq
2f810 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2f820 65 28 76 2c 20 61 64 64 72 53 65 65 6b 29 3b 0a  e(v, addrSeek);.
2f830 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
2f840 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2f850 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2f860 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43  v, pLevel->addrC
2f870 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ont);.    }.    
2f880 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2f890 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
2f8a0 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  LE && pLevel->u.
2f8b0 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20  in.nIn>0 ){.    
2f8c0 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
2f8d0 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pIn;.      int 
2f8e0 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  j;.      sqlite3
2f8f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2f900 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2f910 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Nxt);.      for(
2f920 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  j=pLevel->u.in.n
2f930 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d  In, pIn=&pLevel-
2f940 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d  >u.in.aInLoop[j-
2f950 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49  1]; j>0; j--, pI
2f960 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71  n--){.        sq
2f970 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2f980 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
2f990 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Top+1);.        
2f9a0 69 66 28 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  if( pIn->eEndLoo
2f9b0 70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  pOp!=OP_Noop ){.
2f9c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
2f9d0 6e 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20  n->nPrefix ){.  
2f9e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2f9f0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2fa00 20 26 20 57 48 45 52 45 5f 49 4e 5f 45 41 52 4c   & WHERE_IN_EARL
2fa10 59 4f 55 54 20 29 3b 0a 20 20 20 20 20 20 20 20  YOUT );.        
2fa20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fa30 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
2fa40 66 4e 6f 48 6f 70 65 2c 20 70 4c 65 76 65 6c 2d  fNoHope, pLevel-
2fa50 3e 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20  >iIdxCur,.      
2fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2fa80 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2fa90 29 2b 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20  )+2,.           
2faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fab0 20 20 20 70 49 6e 2d 3e 69 42 61 73 65 2c 20 70     pIn->iBase, p
2fac0 49 6e 2d 3e 6e 50 72 65 66 69 78 29 3b 0a 20 20  In->nPrefix);.  
2fad0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2fae0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2faf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fb00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fb10 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  p2(v, pIn->eEndL
2fb20 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72  oopOp, pIn->iCur
2fb30 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
2fb40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2fb50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2fb60 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2fb70 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65  rageIf(v, pIn->e
2fb80 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72  EndLoopOp==OP_Pr
2fb90 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ev);.          V
2fba0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2fbb0 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2fbc0 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20  ==OP_Next);.    
2fbd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2fbe0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2fbf0 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
2fc00 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
2fc10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2fc20 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2fc30 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2fc40 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
2fc50 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
2fc60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2fc70 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
2fc80 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20  el->addrSkip);. 
2fc90 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2fca0 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d  ((v, "next skip-
2fcb0 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f  scan on %s", pLo
2fcc0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2fcd0 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
2fce0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2fcf0 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
2fd00 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
2fd10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2fd20 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
2fd30 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20  ->addrSkip-2);. 
2fd40 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
2fd50 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
2fd60 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20  MATCH_BLOBS.    
2fd70 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  if( pLevel->addr
2fd80 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20  LikeRep ){.     
2fd90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fda0 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
2fdb0 70 5a 65 72 6f 2c 20 28 69 6e 74 29 28 70 4c 65  pZero, (int)(pLe
2fdc0 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
2fdd0 72 3e 3e 31 29 2c 0a 20 20 20 20 20 20 20 20 20  r>>1),.         
2fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2fdf0 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
2fe00 65 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ep);.      VdbeC
2fe10 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2fe20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
2fe30 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
2fe40 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
2fe50 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ws = pLoop->wsFl
2fe60 61 67 73 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ags;.      addr 
2fe70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2fe80 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
2fe90 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
2fea0 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  in); VdbeCoverag
2feb0 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e(v);.      asse
2fec0 72 74 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  rt( (ws & WHERE_
2fed0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
2fee0 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
2fef0 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  XED)!=0 );.     
2ff00 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
2ff10 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
2ff20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2ff30 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
2ff40 3d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ==pTabList->a[pL
2ff50 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
2ff60 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20  rsor );.        
2ff70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ff80 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
2ff90 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
2ffa0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ffb0 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
2ffc0 5f 49 4e 44 45 58 45 44 29 20 0a 20 20 20 20 20  _INDEXED) .     
2ffd0 20 20 7c 7c 20 28 28 77 73 20 26 20 57 48 45 52    || ((ws & WHER
2ffe0 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 26 26 20 70  E_MULTI_OR) && p
2fff0 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
30000 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
30010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30020 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
30030 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
30040 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
30050 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
30060 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
30070 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30080 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
30090 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
300a0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
300b0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
300c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
300d0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
300e0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
300f0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
30100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
30110 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
30120 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d  .    }.    VdbeM
30130 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
30140 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70   "End WHERE-loop
30150 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20  %d: %s", i,.    
30160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30170 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
30180 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
30190 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  om].pTab->zName)
301a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
301b0 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
301c0 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
301d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
301e0 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
301f0 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
30200 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30210 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
30220 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
30230 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
30240 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
30250 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
30260 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
30270 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
30280 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
30290 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
302a0 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56 64   k, last;.    Vd
302b0 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49  beOp *pOp;.    I
302c0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
302d0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
302e0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
302f0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
30300 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
30310 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
30320 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
30330 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
30340 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
30350 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
30360 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f  Loop;..    /* Fo
30370 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20  r a co-routine, 
30380 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f  change all OP_Co
30390 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 20  lumn references 
303a0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  to the table of.
303b0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f      ** the co-ro
303c0 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f  utine into OP_Co
303d0 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e  py of result con
303e0 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67 69  tained in a regi
303f0 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f  ster..    ** OP_
30400 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f 50  Rowid becomes OP
30410 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Null..    */.  
30420 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
30430 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
30440 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
30450 65 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  e( pParse->db->m
30460 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
30470 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f       translateCo
30480 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72 73  lumnToCopy(pPars
30490 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  e, pLevel->addrB
304a0 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ody, pLevel->iTa
304b0 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  bCur,.          
304c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304d0 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52    pTabItem->regR
304e0 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  esult, 0);.     
304f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
30500 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
30510 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e   scan uses an in
30520 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63  dex, make VDBE c
30530 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
30540 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
30550 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
30560 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
30570 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77  from the table w
30580 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20  here possible.  
30590 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20  In some cases.  
305a0 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69    ** this optimi
305b0 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20  zation prevents 
305c0 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65  the table from e
305d0 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20  ver being read, 
305e0 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a  which can.    **
305f0 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69   yield a signifi
30600 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  cant performance
30610 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a   boost..    ** .
30620 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
30630 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
30640 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
30650 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
30660 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
30670 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
30680 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
30690 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
306a0 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
306b0 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
306c0 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
306d0 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
306e0 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
306f0 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
30700 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
30710 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
30720 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
30730 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
30740 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
30750 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
30760 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
30770 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
30780 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
30790 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
307a0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
307b0 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ndex;.    }else 
307c0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
307d0 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
307e0 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64  _OR ){.      pId
307f0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43  x = pLevel->u.pC
30800 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  ovidx;.    }.   
30810 20 69 66 28 20 70 49 64 78 0a 20 20 20 20 20 26   if( pIdx.     &
30820 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  & (pWInfo->eOneP
30830 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
30840 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
30850 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20 20  dx->pTable)).   
30860 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63    && !db->malloc
30870 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20  Failed.    ){.  
30880 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
30890 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
308a0 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20  r(v);.      k = 
308b0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
308c0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
308d0 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
308e0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
308f0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
30900 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  e ){.        pri
30910 6e 74 66 28 22 54 52 41 4e 53 4c 41 54 45 20 6f  ntf("TRANSLATE o
30920 70 63 6f 64 65 73 20 69 6e 20 72 61 6e 67 65 20  pcodes in range 
30930 25 64 2e 2e 25 64 5c 6e 22 2c 20 6b 2c 20 6c 61  %d..%d\n", k, la
30940 73 74 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 23  st-1);.      }.#
30950 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4f 70 20  endif.      pOp 
30960 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
30970 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20  Op(v, k);.      
30980 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  for(; k<last; k+
30990 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
309a0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
309b0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
309c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
309d0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
309e0 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 0a 23  ode==OP_Column.#
309f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
30a00 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
30a10 55 4e 43 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UNC.         || 
30a20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
30a30 4f 66 66 73 65 74 0a 23 65 6e 64 69 66 0a 20 20  Offset.#endif.  
30a40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30a50 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e     int x = pOp->
30a60 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  p2;.          as
30a70 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62  sert( pIdx->pTab
30a80 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
30a90 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
30aa0 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
30ab0 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
30ac0 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
30ad0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
30ae0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
30af0 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
30b00 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[x];.          
30b10 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29    assert( x>=0 )
30b20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30b30 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69          x = sqli
30b40 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
30b50 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20 20  (pIdx, x);.     
30b60 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b       if( x>=0 ){
30b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
30b80 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20 20  ->p2 = x;.      
30b90 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
30ba0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
30bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 63  .            Opc
30bc0 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65 28  odeRewriteTrace(
30bd0 64 62 2c 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20  db, k, pOp);.   
30be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30bf0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
30c00 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
30c10 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
30c20 7c 7c 20 78 3e 3d 30 20 0a 20 20 20 20 20 20 20  || x>=0 .       
30c30 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f         || pWInfo
30c40 2d 3e 65 4f 6e 65 50 61 73 73 20 29 3b 0a 20 20  ->eOnePass );.  
30c50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
30c60 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
30c70 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
30c80 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
30c90 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
30ca0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
30cb0 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69  ode = OP_IdxRowi
30cc0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 70 63  d;.          Opc
30cd0 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65 28  odeRewriteTrace(
30ce0 64 62 2c 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20  db, k, pOp);.   
30cf0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
30d00 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
30d10 66 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  fNullRow ){.    
30d20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
30d30 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
30d40 0a 20 20 20 20 20 20 20 20 20 20 4f 70 63 6f 64  .          Opcod
30d50 65 52 65 77 72 69 74 65 54 72 61 63 65 28 64 62  eRewriteTrace(db
30d60 2c 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  , k, pOp);.     
30d70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
30d80 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
30d90 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66  .      if( db->f
30da0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
30db0 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 20 70  beAddopTrace ) p
30dc0 72 69 6e 74 66 28 22 54 52 41 4e 53 4c 41 54 45  rintf("TRANSLATE
30dd0 20 63 6f 6d 70 6c 65 74 65 5c 6e 22 29 3b 0a 23   complete\n");.#
30de0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
30df0 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61  .  /* Final clea
30e00 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73  nup.  */.  pPars
30e10 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
30e20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
30e30 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65  eryLoop;.  where
30e40 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
30e50 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  nfo);.  return;.
30e60 7d 0a                                            }.