/ Hex Artifact Content
Login

Artifact 2d313b446758317b60626763d0e1285e04b04c061ce94945dcfffad9525badc1:


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 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
08e0: 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20  f the innermost 
08f0: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57 48 45 52  loop of the WHER
0900: 45 20 63 6c 61 75 73 65 20 69 6d 70 6c 65 6d 65  E clause impleme
0910: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  ntation.** retur
0920: 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44 45 52  ns rows in ORDER
0930: 20 42 59 20 6f 72 64 65 72 20 66 6f 72 20 63 6f   BY order for co
0940: 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66 20 74 68  mplete run of th
0950: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2a  e inner loop..**
0960: 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75 6c 74 69  .** Across multi
0970: 70 6c 65 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ple iterations o
0980: 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2c 20 74  f outer loops, t
0990: 68 65 20 6f 75 74 70 75 74 20 72 6f 77 73 20 6e  he output rows n
09a0: 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 73 6f  eed not be.** so
09b0: 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e 67 20 61  rted.  As long a
09c0: 73 20 72 6f 77 73 20 61 72 65 20 73 6f 72 74 65  s rows are sorte
09d0: 64 20 66 6f 72 20 6a 75 73 74 20 74 68 65 20 69  d for just the i
09e0: 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70 2c 20 74  nnermost loop, t
09f0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 63  his.** routine c
0a00: 61 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a  an return TRUE..
0a10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
0a20: 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ereOrderedInnerL
0a30: 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  oop(WhereInfo *p
0a40: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
0a50: 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65   pWInfo->bOrdere
0a60: 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d 0a 0a 2f  dInnerLoop;.}../
0a70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0a80: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
0a90: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
0aa0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
0ab0: 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61  tinue.** immedia
0ac0: 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65  tely with the ne
0ad0: 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52  xt row of a WHER
0ae0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  E clause..*/.int
0af0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
0b00: 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65  tinueLabel(Where
0b10: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0b20: 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
0b30: 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b  >iContinue!=0 );
0b40: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
0b50: 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  ->iContinue;.}..
0b60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0b70: 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72   VDBE address or
0b80: 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
0b90: 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  o in order to br
0ba0: 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20  eak.** out of a 
0bb0: 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69  WHERE loop..*/.i
0bc0: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  nt sqlite3WhereB
0bd0: 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49  reakLabel(WhereI
0be0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
0bf0: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0c00: 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Break;.}../*.** 
0c10: 52 65 74 75 72 6e 20 4f 4e 45 50 41 53 53 5f 4f  Return ONEPASS_O
0c20: 46 46 20 28 30 29 20 69 66 20 61 6e 20 55 50 44  FF (0) if an UPD
0c30: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
0c40: 61 74 65 6d 65 6e 74 20 69 73 20 75 6e 61 62 6c  atement is unabl
0c50: 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61 74 65 20  e to.** operate 
0c60: 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20  directly on the 
0c70: 72 6f 77 69 73 20 72 65 74 75 72 6e 65 64 20 62  rowis returned b
0c80: 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  y a WHERE clause
0c90: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4f 4e 45  .  Return.** ONE
0ca0: 50 41 53 53 5f 53 49 4e 47 4c 45 20 28 31 29 20  PASS_SINGLE (1) 
0cb0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
0cc0: 20 63 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 64   can operation d
0cd0: 69 72 65 63 74 6c 79 20 62 65 63 61 75 73 65 20  irectly because 
0ce0: 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  only.** a single
0cf0: 20 72 6f 77 20 69 73 20 74 6f 20 62 65 20 63 68   row is to be ch
0d00: 61 6e 67 65 64 2e 20 20 52 65 74 75 72 6e 20 4f  anged.  Return O
0d10: 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 28 32 29  NEPASS_MULTI (2)
0d20: 20 69 66 20 74 68 65 20 6f 6e 65 2d 70 61 73 73   if the one-pass
0d30: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
0d40: 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e 20   can be used on 
0d50: 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a 2a 2a 20  multiple .**.** 
0d60: 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f  If the ONEPASS o
0d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
0d80: 73 65 64 20 28 69 66 20 74 68 69 73 20 72 6f 75  sed (if this rou
0d90: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75  tine returns tru
0da0: 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20  e).** then also 
0db0: 77 72 69 74 65 20 74 68 65 20 69 6e 64 69 63 65  write the indice
0dc0: 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72  s of open cursor
0dd0: 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53  s used by ONEPAS
0de0: 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b  S.** into aiCur[
0df0: 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e  0] and aiCur[1].
0e00: 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20    iaCur[0] gets 
0e10: 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  the cursor of th
0e20: 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20  e data.** table 
0e30: 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74  and iaCur[1] get
0e40: 73 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65  s the cursor use
0e50: 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72  d by an auxiliar
0e60: 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68  y index..** Eith
0e70: 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  er value may be 
0e80: 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  -1, indicating t
0e90: 68 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  hat cursor is no
0ea0: 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63  t used..** Any c
0eb0: 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20  ursors returned 
0ec0: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f  will have been o
0ed0: 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
0ee0: 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30  g..**.** aiCur[0
0ef0: 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62  ] and aiCur[1] b
0f00: 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20 74 68  oth get -1 if th
0f10: 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c  e where-clause l
0f20: 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c  ogic is.** unabl
0f30: 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45  e to use the ONE
0f40: 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f  PASS optimizatio
0f50: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
0f60: 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28  3WhereOkOnePass(
0f70: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0f80: 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a  o, int *aiCur){.
0f90: 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20    memcpy(aiCur, 
0fa0: 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
0fb0: 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Pass, sizeof(int
0fc0: 29 2a 32 29 3b 0a 23 69 66 64 65 66 20 57 48 45  )*2);.#ifdef WHE
0fd0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
0fe0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
0ff0: 72 65 54 72 61 63 65 20 26 26 20 70 57 49 6e 66  reTrace && pWInf
1000: 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
1010: 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
1020: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1030: 74 66 28 22 25 73 20 63 75 72 73 6f 72 73 3a 20  tf("%s cursors: 
1040: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
1050: 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50     pWInfo->eOneP
1060: 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49 4e  ass==ONEPASS_SIN
1070: 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53 53 5f 53  GLE ? "ONEPASS_S
1080: 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45 50 41 53  INGLE" : "ONEPAS
1090: 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20 20 20 20  S_MULTI",.      
10a0: 20 20 20 61 69 43 75 72 5b 30 5d 2c 20 61 69 43     aiCur[0], aiC
10b0: 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64  ur[1]);.  }.#end
10c0: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  if.  return pWIn
10d0: 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b 0a 7d 0a  fo->eOnePass;.}.
10e0: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
10f0: 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72 63 20  content of pSrc 
1100: 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a 73 74  into pDest.*/.st
1110: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f  atic void whereO
1120: 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53 65 74  rMove(WhereOrSet
1130: 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65 4f 72   *pDest, WhereOr
1140: 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20 70 44  Set *pSrc){.  pD
1150: 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e  est->n = pSrc->n
1160: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65 73 74  ;.  memcpy(pDest
1170: 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20 70 44  ->a, pSrc->a, pD
1180: 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28 70 44  est->n*sizeof(pD
1190: 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a  est->a[0]));.}..
11a0: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69 6e 73  /*.** Try to ins
11b0: 65 72 74 20 61 20 6e 65 77 20 70 72 65 72 65 71  ert a new prereq
11c0: 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e 74 72  uisite/cost entr
11d0: 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  y into the Where
11e0: 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a  OrSet pSet..**.*
11f0: 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72 79 20  * The new entry 
1200: 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
1210: 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  an existing entr
1220: 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  y, or it might b
1230: 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c 20 6f  e.** appended, o
1240: 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 69  r it might be di
1250: 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77 68 61  scarded.  Do wha
1260: 74 65 76 65 72 20 69 73 20 74 68 65 20 72 69 67  tever is the rig
1270: 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f 20 74  ht thing.** so t
1280: 68 61 74 20 70 53 65 74 20 6b 65 65 70 73 20 74  hat pSet keeps t
1290: 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62 65 73  he N_OR_COST bes
12a0: 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e 20 73  t entries seen s
12b0: 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  o far..*/.static
12c0: 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e 73 65   int whereOrInse
12d0: 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53 65 74  rt(.  WhereOrSet
12e0: 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f 2a 20   *pSet,      /* 
12f0: 54 68 65 20 57 68 65 72 65 4f 72 53 65 74 20 74  The WhereOrSet t
1300: 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a  o be updated */.
1310: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
1320: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72  ,        /* Prer
1330: 65 71 75 69 73 69 74 65 73 20 6f 66 20 74 68 65  equisites of the
1340: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
1350: 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20 20 20  LogEst rRun,    
1360: 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d 63 6f         /* Run-co
1370: 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e  st of the new en
1380: 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  try */.  LogEst 
1390: 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
13a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
13b0: 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e 65 77  puts for the new
13c0: 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20 20 75   entry */.){.  u
13d0: 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f 72 43  16 i;.  WhereOrC
13e0: 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  ost *p;.  for(i=
13f0: 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d  pSet->n, p=pSet-
1400: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b  >a; i>0; i--, p+
1410: 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52 75 6e  +){.    if( rRun
1420: 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28 70 72  <=p->rRun && (pr
1430: 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72 65 71  ereq & p->prereq
1440: 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20 20 20  )==prereq ){.   
1450: 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f 72 49     goto whereOrI
1460: 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20 20 20  nsert_done;.    
1470: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75  }.    if( p->rRu
1480: 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d 3e 70  n<=rRun && (p->p
1490: 72 65 72 65 71 20 26 20 70 72 65 72 65 71 29 3d  rereq & prereq)=
14a0: 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20 20  =p->prereq ){.  
14b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14c0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53    }.  }.  if( pS
14d0: 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20  et->n<N_OR_COST 
14e0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53 65 74  ){.    p = &pSet
14f0: 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a  ->a[pSet->n++];.
1500: 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f      p->nOut = nO
1510: 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ut;.  }else{.   
1520: 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a 20 20   p = pSet->a;.  
1530: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 53 65    for(i=1; i<pSe
1540: 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t->n; i++){.    
1550: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e 70 53    if( p->rRun>pS
1560: 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20 29 20  et->a[i].rRun ) 
1570: 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20 69 3b  p = pSet->a + i;
1580: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1590: 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29 20 72  ->rRun<=rRun ) r
15a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77 68 65  eturn 0;.  }.whe
15b0: 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3a  reOrInsert_done:
15c0: 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d 20 70  .  p->prereq = p
15d0: 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52 75 6e  rereq;.  p->rRun
15e0: 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28 20 70   = rRun;.  if( p
15f0: 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20 70 2d  ->nOut>nOut ) p-
1600: 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20  >nOut = nOut;.  
1610: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
1620: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
1630: 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69  tmask for the gi
1640: 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ven cursor numbe
1650: 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a  r.  Return 0 if.
1660: 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f  ** iCursor is no
1670: 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f  t in the set..*/
1680: 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74 65 33  .Bitmask sqlite3
1690: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 57 68 65  WhereGetMask(Whe
16a0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
16b0: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
16c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
16d0: 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e  sert( pMaskSet->
16e0: 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 42  n<=(int)sizeof(B
16f0: 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66  itmask)*8 );.  f
1700: 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53  or(i=0; i<pMaskS
1710: 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  et->n; i++){.   
1720: 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69   if( pMaskSet->i
1730: 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b  x[i]==iCursor ){
1740: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4d 41  .      return MA
1750: 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
1760: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1770: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1780: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
1790: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
17a0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
17b0: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
17c0: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
17d0: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
17e0: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
17f0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1800: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
1810: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
1820: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
1830: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
1840: 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ine.  So we know
1850: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
1860: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
1870: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
1880: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
1890: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
18a0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
18b0: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
18c0: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
18d0: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
18e0: 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65  rraySize(pMaskSe
18f0: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
1900: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
1910: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
1920: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  r;.}../*.** Adva
1930: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
1940: 57 68 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d  WhereTerm that m
1950: 61 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67  atches according
1960: 20 74 6f 20 74 68 65 20 63 72 69 74 65 72 69 61   to the criteria
1970: 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20  .** established 
1980: 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f  when the pScan o
1990: 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69 61  bject was initia
19a0: 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65 53 63  lized by whereSc
19b0: 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74  anInit()..** Ret
19c0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
19d0: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61  e are no more ma
19e0: 74 63 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d  tching WhereTerm
19f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  s..*/.static Whe
1a00: 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61  reTerm *whereSca
1a10: 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e 20  nNext(WhereScan 
1a20: 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69  *pScan){.  int i
1a30: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1a40: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e  /* The cursor on
1a50: 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
1a60: 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36 20 69 43  term */.  i16 iC
1a70: 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f  olumn;         /
1a80: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20  * The column on 
1a90: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74  the LHS of the t
1aa0: 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b  erm.  -1 for IPK
1ab0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20   */.  Expr *pX; 
1ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1ad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e   expression bein
1ae0: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68  g tested */.  Wh
1af0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
1b00: 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20     /* Shorthand 
1b10: 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a  for pScan->pWC *
1b20: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
1b30: 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20  Term;    /* The 
1b40: 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65  term being teste
1b50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70  d */.  int k = p
1b60: 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57  Scan->k;    /* W
1b70: 68 65 72 65 20 74 6f 20 73 74 61 72 74 20 73 63  here to start sc
1b80: 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  anning */..  ass
1b90: 65 72 74 28 20 70 53 63 61 6e 2d 3e 69 45 71 75  ert( pScan->iEqu
1ba0: 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69  iv<=pScan->nEqui
1bb0: 76 20 29 3b 0a 20 20 70 57 43 20 3d 20 70 53 63  v );.  pWC = pSc
1bc0: 61 6e 2d 3e 70 57 43 3b 0a 20 20 77 68 69 6c 65  an->pWC;.  while
1bd0: 28 31 29 7b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  (1){.    iColumn
1be0: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75   = pScan->aiColu
1bf0: 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  mn[pScan->iEquiv
1c00: 2d 31 5d 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  -1];.    iCur = 
1c10: 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70 53 63  pScan->aiCur[pSc
1c20: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
1c30: 20 20 20 61 73 73 65 72 74 28 20 70 57 43 21 3d     assert( pWC!=
1c40: 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  0 );.    do{.   
1c50: 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
1c60: 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54  ->a+k; k<pWC->nT
1c70: 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b  erm; k++, pTerm+
1c80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1c90: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
1ca0: 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20  r==iCur.        
1cb0: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66   && pTerm->u.lef
1cc0: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
1cd0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 69 43  .         && (iC
1ce0: 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50 52 0a 20  olumn!=XN_EXPR. 
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
1d00: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1d10: 65 53 6b 69 70 28 70 54 65 72 6d 2d 3e 70 45 78  eSkip(pTerm->pEx
1d20: 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20  pr->pLeft,.     
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70    pScan->pIdxExp
1d60: 72 2c 69 43 75 72 29 3d 3d 30 29 0a 20 20 20 20  r,iCur)==0).    
1d70: 20 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e       && (pScan->
1d80: 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20 21 45 78  iEquiv<=1 || !Ex
1d90: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
1da0: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
1db0: 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
1dc0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
1dd0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1de0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29  ator & WO_EQUIV)
1df0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
1e00: 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c  & pScan->nEquiv<
1e10: 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d  ArraySize(pScan-
1e20: 3e 61 69 43 75 72 29 0a 20 20 20 20 20 20 20 20  >aiCur).        
1e30: 20 20 20 26 26 20 28 70 58 20 3d 20 73 71 6c 69     && (pX = sqli
1e40: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1e50: 74 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  te(pTerm->pExpr-
1e60: 3e 70 52 69 67 68 74 29 29 2d 3e 6f 70 3d 3d 54  >pRight))->op==T
1e70: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1e80: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1e90: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
1ea0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1eb0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a  pScan->nEquiv; j
1ec0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1ed0: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 69     if( pScan->ai
1ee0: 43 75 72 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62  Cur[j]==pX->iTab
1ef0: 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  le.             
1f00: 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 69 43 6f    && pScan->aiCo
1f10: 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58 2d 3e 69 43 6f  lumn[j]==pX->iCo
1f20: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
1f30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f60: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
1f70: 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  ==pScan->nEquiv 
1f80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f90: 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d   pScan->aiCur[j]
1fa0: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
1fc0: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  an->aiColumn[j] 
1fd0: 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  = pX->iColumn;. 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
1ff0: 61 6e 2d 3e 6e 45 71 75 69 76 2b 2b 3b 0a 20 20  an->nEquiv++;.  
2000: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2020: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2030: 70 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d  perator & pScan-
2040: 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20  >opMask)!=0 ){. 
2050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
2060: 72 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74  rify the affinit
2070: 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  y and collating 
2080: 73 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a  sequence match *
2090: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
20a0: 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  ( pScan->zCollNa
20b0: 6d 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f  me && (pTerm->eO
20c0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
20d0: 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
20e0: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
20f0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
2100: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
2110: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e  arse = pWC->pWIn
2120: 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  fo->pParse;.    
2130: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70            pX = p
2140: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2150: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2160: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
2170: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e  nityOk(pX, pScan
2180: 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20  ->idxaff) ){.   
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
21a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
21b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21c0: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
21d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
21e0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
21f0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
2200: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
2210: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70      pX->pLeft, p
2250: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
2260: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2270: 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
2280: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
2290: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
22a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22b0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
22c0: 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43  zName, pScan->zC
22d0: 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ollName) ){.    
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
22f0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2310: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2320: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2330: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
2340: 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20  O_IS))!=0.      
2350: 20 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20         && (pX = 
2360: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
2370: 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  ight)->op==TK_CO
2380: 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20  LUMN.           
2390: 20 20 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d    && pX->iTable=
23a0: 3d 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d  =pScan->aiCur[0]
23b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
23c0: 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53   pX->iColumn==pS
23d0: 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  can->aiColumn[0]
23e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2400: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
2410: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
2420: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2430: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2440: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2450: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43        pScan->pWC
2460: 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
2470: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
2480: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
2490: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
24a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24c0: 20 20 70 57 43 20 3d 20 70 57 43 2d 3e 70 4f 75    pWC = pWC->pOu
24d0: 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30  ter;.      k = 0
24e0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 57  ;.    }while( pW
24f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  C!=0 );.    if( 
2500: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3e 3d 70  pScan->iEquiv>=p
2510: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 20 62  Scan->nEquiv ) b
2520: 72 65 61 6b 3b 0a 20 20 20 20 70 57 43 20 3d 20  reak;.    pWC = 
2530: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
2540: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
2550: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a  Scan->iEquiv++;.
2560: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2570: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2580: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
2590: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
25a0: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
25b0: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
25c0: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
25d0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
25e0: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
25f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2600: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2610: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2620: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2630: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
2640: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
2650: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2660: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
2670: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
2680: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
2690: 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30 20 74   Or if pIdx!=0 t
26a0: 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  hen X is column 
26b0: 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78  iColumn of index
26c0: 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a 2a 20   pIdx.  pIdx.** 
26d0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
26e0: 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 61  he indexes of ta
26f0: 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20  ble iCur..**.** 
2700: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
2710: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2720: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2730: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
2740: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
2750: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
2760: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
2770: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
2780: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
2790: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27a0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
27b0: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
27c0: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
27d0: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
27e0: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
27f0: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
2800: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
2810: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2820: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2830: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
2840: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
2850: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
2860: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
2870: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
2880: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
2890: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
28a0: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
28b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
28c0: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
28d0: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
28e0: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
28f0: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
2900: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
2910: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2920: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2930: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2940: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
2950: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
2960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2970: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
2980: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
2990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29a0: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
29b0: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
29c0: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
29d0: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
29e0: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
29f0: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2a10: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2a20: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
2a30: 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72  .){.  pScan->pOr
2a40: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
2a50: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
2a60: 20 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70    pScan->pIdxExp
2a70: 72 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  r = 0;.  pScan->
2a80: 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20 70 53  idxaff = 0;.  pS
2a90: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
2aa0: 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78 20 29   0;.  if( pIdx )
2ab0: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 69 43  {.    int j = iC
2ac0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43 6f 6c 75  olumn;.    iColu
2ad0: 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  mn = pIdx->aiCol
2ae0: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  umn[j];.    if( 
2af0: 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52  iColumn==XN_EXPR
2b00: 20 29 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d   ){.      pScan-
2b10: 3e 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78  >pIdxExpr = pIdx
2b20: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
2b30: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 53  .pExpr;.      pS
2b40: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
2b50: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
2b60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2b70: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
2b80: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a  Table->iPKey ){.
2b90: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
2ba0: 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 7d 65  XN_ROWID;.    }e
2bb0: 6c 73 65 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e  lse if( iColumn>
2bc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 63 61  =0 ){.      pSca
2bd0: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78  n->idxaff = pIdx
2be0: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
2bf0: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
2c00: 3b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 7a  ;.      pScan->z
2c10: 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d  CollName = pIdx-
2c20: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  >azColl[j];.    
2c30: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43  }.  }else if( iC
2c40: 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29  olumn==XN_EXPR )
2c50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2c60: 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d    }.  pScan->opM
2c70: 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20  ask = opMask;.  
2c80: 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20  pScan->k = 0;.  
2c90: 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20  pScan->aiCur[0] 
2ca0: 3d 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d  = iCur;.  pScan-
2cb0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69  >aiColumn[0] = i
2cc0: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d  Column;.  pScan-
2cd0: 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70  >nEquiv = 1;.  p
2ce0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31  Scan->iEquiv = 1
2cf0: 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65  ;.  return where
2d00: 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b  ScanNext(pScan);
2d10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
2d20: 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74   for a term in t
2d30: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2d40: 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66  that is of the f
2d50: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
2d60: 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  r>".** where X i
2d70: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
2d80: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20   the iColumn of 
2d90: 74 61 62 6c 65 20 69 43 75 72 20 6f 72 20 6f 66  table iCur or of
2da0: 20 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a 20 69   index pIdx.** i
2db0: 66 20 70 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f  f pIdx!=0 and <o
2dc0: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  p> is one of the
2dd0: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
2de0: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
2df0: 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70 61 72  by.** the op par
2e00: 61 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20  ameter.  Return 
2e10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2e20: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
2e30: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2e40: 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20  *.** If pIdx!=0 
2e50: 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20  then it must be 
2e60: 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
2e70: 65 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  es of table iCur
2e80: 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  .  .** Search fo
2e90: 72 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67  r terms matching
2ea0: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2eb0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a  column of pIdx.*
2ec0: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68  * rather than th
2ed0: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
2ee0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
2ef0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  r..**.** The ter
2f00: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
2f10: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
2f20: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
2f30: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
2f40: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
2f50: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
2f60: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
2f70: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
2f80: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
2f90: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
2fa0: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
2fb0: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
2fc0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
2fd0: 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c  ** aiCur[]/iaCol
2fe0: 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c  umn[] arrays hol
2ff0: 64 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  d X and all its 
3000: 65 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65  equivalents. The
3010: 72 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f  re are 11.** slo
3020: 74 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69  ts in aiCur[]/ai
3030: 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74  Column[] so that
3040: 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f   means we can lo
3050: 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70  ok for X plus up
3060: 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20   to 10.** other 
3070: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
3080: 73 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72  s.  Hence a sear
3090: 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65  ch for X will re
30a0: 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58  turn <expr> if X
30b0: 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32  =A1.** and A1=A2
30c0: 20 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e   and A2=A3 and .
30d0: 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e  .. and A9=A10 an
30e0: 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a  d A10=<expr>..**
30f0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
3100: 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
3110: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3120: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
3130: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
3140: 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20  ** then try for 
3150: 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20  the one with no 
3160: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20  dependencies on 
3170: 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65  <expr> - in othe
3180: 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a  r words where.**
3190: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e   <expr> is a con
31a0: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
31b0: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
31c0: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72  Only return entr
31d0: 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  ies of.** the fo
31e0: 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68  rm "X <op> Y" wh
31f0: 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d  ere Y is a colum
3200: 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62  n in another tab
3210: 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f  le if no terms o
3220: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58  f.** the form "X
3230: 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70   <op> <const-exp
3240: 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20  r>" exist.   If 
3250: 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20  no terms with a 
3260: 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20  constant RHS.** 
3270: 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65  exist, try to re
3280: 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74  turn a term that
3290: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f   does not use WO
32a0: 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65  _EQUIV..*/.Where
32b0: 54 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65  Term *sqlite3Whe
32c0: 72 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68  reFindTerm(.  Wh
32d0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
32e0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
32f0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
3300: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
3310: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
3320: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
3330: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
3340: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
3350: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
3360: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
3370: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
3380: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
3390: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
33a0: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
33b0: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
33c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
33d0: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
33e0: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
33f0: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
3400: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
3410: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
3420: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
3430: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
3440: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
3450: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
3460: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
3470: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
3480: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
3490: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
34a0: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
34b0: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
34c0: 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57  .  op &= WO_EQ|W
34d0: 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70  O_IS;.  while( p
34e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
34f0: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
3500: 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
3510: 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65      if( p->prere
3520: 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d  qRight==0 && (p-
3530: 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d  >eOperator&op)!=
3540: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  0 ){.        tes
3550: 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61  tcase( p->eOpera
3560: 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
3570: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b         return p;
3580: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3590: 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20  f( pResult==0 ) 
35a0: 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20  pResult = p;.   
35b0: 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65   }.    p = where
35c0: 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b  ScanNext(&scan);
35d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
35e0: 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  esult;.}../*.** 
35f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
3600: 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72  arches pList for
3610: 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d   an entry that m
3620: 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d  atches the iCol-
3630: 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  th column.** of 
3640: 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
3650: 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70  * If such an exp
3660: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
3670: 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70  , its index in p
3680: 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74  List->a[] is ret
3690: 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20  urned. If.** no 
36a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
36b0: 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  und, -1 is retur
36c0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
36d0: 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28  nt findIndexCol(
36e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
36f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3700: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
3710: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
3720: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
3730: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
3740: 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73  ession list to s
3750: 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69  earch */.  int i
3760: 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  Base,           
3770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
3780: 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61  rsor for table a
3790: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
37a0: 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
37b0: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
37c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
37d0: 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d  x to match colum
37e0: 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43  n of */.  int iC
37f0: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ol              
3800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
3810: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20  umn of index to 
3820: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
3830: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
3840: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
3850: 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a  >azColl[iCol];..
3860: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
3870: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
3880: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
3890: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
38a0: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
38b0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
38c0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
38d0: 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43  MN.     && p->iC
38e0: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
38f0: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20  olumn[iCol].    
3900: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
3910: 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  Base.    ){.    
3920: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
3930: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
3940: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
3950: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3960: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  r);.      if( 0=
3970: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
3980: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
3990: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
39a0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20  return i;.      
39b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
39c0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
39d0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
39e0: 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
39f0: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
3a00: 64 78 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 0a 2a  dx is NOT NULL.*
3a10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
3a20: 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
3a30: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
3a40: 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6a 3b   iCol){.  int j;
3a50: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
3a60: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3a70: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
3a80: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  pIdx->nColumn );
3a90: 0a 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43  .  j = pIdx->aiC
3aa0: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a 20 20 69  olumn[iCol];.  i
3ab0: 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 72  f( j>=0 ){.    r
3ac0: 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54 61 62  eturn pIdx->pTab
3ad0: 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  le->aCol[j].notN
3ae0: 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ull;.  }else if(
3af0: 20 6a 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20   j==(-1) ){.    
3b00: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
3b10: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  e{.    assert( j
3b20: 3d 3d 28 2d 32 29 20 29 3b 0a 20 20 20 20 72 65  ==(-2) );.    re
3b30: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 41 73 73 75  turn 0;  /* Assu
3b40: 6d 65 20 61 6e 20 69 6e 64 65 78 65 64 20 65 78  me an indexed ex
3b50: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 61 6c 77  pression can alw
3b60: 61 79 73 20 79 69 65 6c 64 20 61 20 4e 55 4c 4c  ays yield a NULL
3b70: 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   */..  }.}../*.*
3b80: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
3b90: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   the DISTINCT ex
3ba0: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61  pression-list pa
3bb0: 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
3bc0: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
3bd0: 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a   redundant..**.*
3be0: 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73  * A DISTINCT lis
3bf0: 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69  t is redundant i
3c00: 66 20 61 6e 79 20 73 75 62 73 65 74 20 6f 66 20  f any subset of 
3c10: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
3c20: 68 65 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 6c  he.** DISTINCT l
3c30: 69 73 74 20 61 72 65 20 63 6f 6c 6c 65 63 74 69  ist are collecti
3c40: 76 65 6c 79 20 75 6e 69 71 75 65 20 61 6e 64 20  vely unique and 
3c50: 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 6e 6f 6e  individually non
3c60: 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
3c70: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
3c80: 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
3c90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3ca0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3cb0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
3cc0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
3cd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
3ce0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
3cf0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3d00: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
3d10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
3d20: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
3d30: 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
3d40: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
3d50: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
3d60: 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
3d70: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
3d80: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
3d90: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
3db0: 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
3dc0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
3dd0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
3de0: 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
3df0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3e00: 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
3e10: 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
3e20: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
3e30: 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
3e40: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
3e50: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
3e60: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
3e70: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
3e80: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
3e90: 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
3ea0: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
3eb0: 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
3ec0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
3ed0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
3ee0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
3ef0: 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
3f00: 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
3f10: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
3f20: 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
3f30: 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
3f40: 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
3f50: 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
3f60: 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
3f70: 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
3f80: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
3f90: 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
3fa0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
3fb0: 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
3fc0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
3fd0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
3fe0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
3ff0: 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
4000: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
4010: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
4020: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
4030: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
4040: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
4050: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
4060: 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
4070: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
4080: 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
4090: 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
40a0: 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
40b0: 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
40c0: 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
40d0: 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
40e0: 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
40f0: 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
4100: 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
4110: 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
4120: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
4130: 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
4140: 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
4150: 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
4160: 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
4170: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
4180: 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
4190: 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
41a0: 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
41b0: 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
41c0: 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
41d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
41e0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
41f0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
4200: 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
4210: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
4220: 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
4230: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
4240: 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
4250: 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
4260: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
4270: 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
4280: 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
4290: 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
42a0: 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
42b0: 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
42c0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
42d0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
42e0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
42f0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
4300: 29 7b 0a 20 20 20 20 69 66 28 20 21 49 73 55 6e  ){.    if( !IsUn
4310: 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
4320: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4330: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
4340: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
4350: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
4360: 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
4370: 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 2c  m(pWC, iBase, i,
4380: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
4390: 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
43a0: 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 49 6e        if( findIn
43b0: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
43c0: 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
43d0: 20 70 49 64 78 2c 20 69 29 3c 30 20 29 20 62 72   pIdx, i)<0 ) br
43e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
43f0: 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e   indexColumnNotN
4400: 75 6c 6c 28 70 49 64 78 2c 20 69 29 3d 3d 30 20  ull(pIdx, i)==0 
4410: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
4420: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
4430: 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
4440: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
4450: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
4460: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
4470: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
4480: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
4490: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
44a0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
44b0: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  0;.}.../*.** Est
44c0: 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
44d0: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
44e0: 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
44f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
4500: 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74  st estLog(LogEst
4510: 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c   N){.  return N<
4520: 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  =10 ? 0 : sqlite
4530: 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b  3LogEst(N) - 33;
4540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
4550: 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  t OP_Column opco
4560: 64 65 73 20 74 6f 20 4f 50 5f 43 6f 70 79 20 69  des to OP_Copy i
4570: 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e  n previously gen
4580: 65 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a  erated code..**.
4590: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
45a0: 72 75 6e 73 20 6f 76 65 72 20 67 65 6e 65 72 61  runs over genera
45b0: 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 61 6e  ted VDBE code an
45c0: 64 20 74 72 61 6e 73 6c 61 74 65 73 20 4f 50 5f  d translates OP_
45d0: 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65  Column.** opcode
45e0: 73 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 77  s into OP_Copy w
45f0: 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73  hen the table is
4600: 20 62 65 69 6e 67 20 61 63 63 65 73 73 65 64 20   being accessed 
4610: 76 69 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 0a  via co-routine .
4620: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69  ** instead of vi
4630: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e 0a  a table lookup..
4640: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 49 6e  **.** If the bIn
4650: 63 72 52 6f 77 69 64 20 70 61 72 61 6d 65 74 65  crRowid paramete
4660: 72 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6e 79  r is 0, then any
4670: 20 4f 50 5f 52 6f 77 69 64 20 69 6e 73 74 72 75   OP_Rowid instru
4680: 63 74 69 6f 6e 73 20 6f 6e 0a 2a 2a 20 63 75 72  ctions on.** cur
4690: 73 6f 72 20 69 54 61 62 43 75 72 20 61 72 65 20  sor iTabCur are 
46a0: 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
46b0: 20 4f 50 5f 4e 75 6c 6c 2e 20 4f 72 2c 20 69 66   OP_Null. Or, if
46c0: 20 62 49 6e 63 72 52 6f 77 69 64 20 69 73 20 6e   bIncrRowid is n
46d0: 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e  on-zero,.** then
46e0: 20 65 61 63 68 20 4f 50 5f 52 6f 77 69 64 20 69   each OP_Rowid i
46f0: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
4700: 74 6f 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  to an instructio
4710: 6e 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  n to increment t
4720: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72  he.** value stor
4730: 65 64 20 69 6e 20 69 74 73 20 6f 75 74 70 75 74  ed in its output
4740: 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 73 74   register..*/.st
4750: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c  atic void transl
4760: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
4770: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4780: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4790: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
47a0: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
47b0: 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20     /* Translate 
47c0: 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64 65  from this opcode
47d0: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   to the end */. 
47e0: 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
47f0: 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d       /* OP_Colum
4800: 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65 72  n/OP_Rowid refer
4810: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
4820: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
4830: 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a 20  gister,      /* 
4840: 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  The first column
4850: 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67 69   is in this regi
4860: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49  ster */.  int bI
4870: 6e 63 72 52 6f 77 69 64 20 20 20 20 20 20 2f 2a  ncrRowid      /*
4880: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72   If non-zero, tr
4890: 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f 77 69 64  ansform OP_rowid
48a0: 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d 28 31 29   to OP_AddImm(1)
48b0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
48c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
48d0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  ;.  VdbeOp *pOp 
48e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
48f0: 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20  Op(v, iStart);. 
4900: 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69   int iEnd = sqli
4910: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4920: 64 72 28 76 29 3b 0a 20 20 69 66 28 20 70 50 61  dr(v);.  if( pPa
4930: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
4940: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
4950: 20 20 66 6f 72 28 3b 20 69 53 74 61 72 74 3c 69    for(; iStart<i
4960: 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b 2c 20 70  End; iStart++, p
4970: 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  Op++){.    if( p
4980: 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43 75 72 20  Op->p1!=iTabCur 
4990: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
49a0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
49b0: 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
49c0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
49d0: 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20 20 20  = OP_Copy;.     
49e0: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e   pOp->p1 = pOp->
49f0: 70 32 20 2b 20 69 52 65 67 69 73 74 65 72 3b 0a  p2 + iRegister;.
4a00: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
4a10: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pOp->p3;.      p
4a20: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20  Op->p3 = 0;.    
4a30: 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
4a40: 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
4a50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e  ){.      if( bIn
4a60: 63 72 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  crRowid ){.     
4a70: 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
4a80: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
4a90: 20 69 6e 20 74 68 65 20 50 32 20 6f 70 65 72 61   in the P2 opera
4aa0: 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f 52 6f 77  nd of the OP_Row
4ab0: 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  id. */.        p
4ac0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
4ad0: 41 64 64 49 6d 6d 3b 0a 20 20 20 20 20 20 20 20  AddImm;.        
4ae0: 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70  pOp->p1 = pOp->p
4af0: 32 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  2;.        pOp->
4b00: 70 32 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  p2 = 1;.      }e
4b10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  lse{.        pOp
4b20: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75  ->opcode = OP_Nu
4b30: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  ll;.        pOp-
4b40: 3e 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >p1 = 0;.       
4b50: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
4b60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75  }../*.** Two rou
4b80: 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69  tines for printi
4b90: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
4ba0: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  f an sqlite3_ind
4bb0: 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ex_info.** struc
4bc0: 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20  ture.  Used for 
4bd0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
4be0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20  gging only.  If 
4bf0: 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54  neither.** SQLIT
4c00: 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45  E_TEST or SQLITE
4c10: 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e  _DEBUG are defin
4c20: 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72  ed, then these r
4c30: 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e  outines.** are n
4c40: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  o-ops..*/.#if !d
4c50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4c60: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
4c70: 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52   && defined(WHER
4c80: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
4c90: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
4ca0: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
4cb0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
4cc0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
4cd0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
4ce0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
4cf0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4d00: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
4d10: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
4d20: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
4d30: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
4d40: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
4d50: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
4d60: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
4d70: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
4d80: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
4d90: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4da0: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
4db0: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
4dc0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
4dd0: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
4de0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
4df0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
4e00: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
4e10: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
4e20: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4e30: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
4e40: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
4e50: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
4e60: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
4e70: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
4e80: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
4e90: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
4ea0: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
4eb0: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
4ec0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
4ed0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
4ee0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
4ef0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
4f00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4f10: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
4f20: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
4f30: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
4f40: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
4f50: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
4f60: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
4f70: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
4f80: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
4f90: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
4fa0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
4fb0: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
4fc0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4fd0: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
4fe0: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
4ff0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5000: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
5010: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
5020: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5030: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
5040: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
5050: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
5060: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
5070: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
5080: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
5090: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
50a0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t);.  sqlite3Deb
50b0: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
50c0: 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e  matedRows=%lld\n
50d0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52  ", p->estimatedR
50e0: 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ows);.}.#else.#d
50f0: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
5100: 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
5110: 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
5120: 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23  UTS(A).#endif..#
5130: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5140: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
5150: 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  EX./*.** Return 
5160: 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52  TRUE if the WHER
5170: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54  E clause term pT
5180: 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d  erm is of a form
5190: 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75   where it.** cou
51a0: 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ld be used with 
51b0: 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65  an index to acce
51c0: 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e  ss pSrc, assumin
51d0: 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  g an appropriate
51e0: 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65  .** index existe
51f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5200: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
5210: 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ex(.  WhereTerm 
5220: 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *pTerm,         
5230: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
5240: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65  ause term to che
5250: 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ck */.  struct S
5260: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
5270: 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  c,     /* Table 
5280: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
5290: 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74   access */.  Bit
52a0: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
52c0: 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c  ables in outer l
52d0: 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  oops of the join
52e0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66   */.){.  char af
52f0: 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  f;.  if( pTerm->
5300: 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63  leftCursor!=pSrc
5310: 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75  ->iCursor ) retu
5320: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
5330: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
5340: 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d  (WO_EQ|WO_IS))==
5350: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
5360: 69 66 28 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f  if( (pSrc->fg.jo
5370: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
5380: 29 20 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  ) .   && !ExprHa
5390: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
53a0: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
53b0: 6f 69 6e 29 0a 20 20 20 26 26 20 28 70 54 65 72  oin).   && (pTer
53c0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
53d0: 4f 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 2f  O_IS).  ){.    /
53e0: 2a 20 43 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20  * Cannot use an 
53f0: 49 53 20 74 65 72 6d 20 66 72 6f 6d 20 74 68 65  IS term from the
5400: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 73   WHERE clause as
5410: 20 61 6e 20 69 6e 64 65 78 20 64 72 69 76 65 72   an index driver
5420: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 68 65 20   for.    ** the 
5430: 52 48 53 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  RHS of a LEFT JO
5440: 49 4e 2e 20 53 75 63 68 20 61 20 74 65 72 6d 20  IN. Such a term 
5450: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
5460: 20 69 66 20 69 74 20 69 73 20 66 72 6f 6d 0a 20   if it is from. 
5470: 20 20 20 2a 2a 20 74 68 65 20 4f 4e 20 63 6c 61     ** the ON cla
5480: 75 73 65 2e 20 20 2a 2f 0a 20 20 20 20 72 65 74  use.  */.    ret
5490: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
54a0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
54b0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
54c0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
54d0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
54e0: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
54f0: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
5500: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
5510: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
5520: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
5530: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
5540: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
5550: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
5560: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
5570: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
5580: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
5590: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
55a0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
55b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
55c0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
55d0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
55e0: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
55f0: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
5600: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
5610: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
5620: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
5630: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
5640: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
5650: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
5660: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
5670: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
5680: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
5690: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
56a0: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
56b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
56d0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
56e0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
56f0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
5700: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5710: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
5720: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5730: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
5740: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
5750: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
5760: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
5770: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
5780: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
5790: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
57a0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
57b0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
57c0: 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
57d0: 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
57e0: 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
57f0: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5810: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
5820: 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
5830: 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
5840: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5850: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
5860: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
5870: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
5880: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
5890: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
58a0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
58b0: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65  C->a[] */.  Inde
58c0: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
58d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
58e0: 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
58f0: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
5900: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
5930: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
5940: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
5950: 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
5960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5970: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
5980: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
5990: 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
59a0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
59b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
59c0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
59d0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
59e0: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
59f0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
5a00: 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
5a10: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
5a20: 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
5a30: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
5a40: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
5a50: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
5a60: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
5a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
5a80: 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
5a90: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ab0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
5ac0: 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ae0: 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
5af0: 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
5b00: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
5b10: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
5b20: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
5b30: 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
5b40: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
5b50: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
5b60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
5b70: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
5b80: 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20  char *zNotUsed; 
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
5ba0: 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68  xtra space on th
5bb0: 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f  e end of pIdx */
5bc0: 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
5bd0: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
5be0: 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
5bf0: 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
5c00: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
5c10: 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
5c20: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
5c30: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
5c40: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73  olumns */.  u8 s
5c50: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20  entWarning = 0; 
5c60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5c70: 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61  if a warnning ha
5c80: 73 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f  s been issued */
5c90: 0a 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61  .  Expr *pPartia
5ca0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
5cb0: 2a 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20  * Partial Index 
5cc0: 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  Expression */.  
5cd0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  int iContinue = 
5ce0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  0;          /* J
5cf0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5d00: 20 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a   excluded rows *
5d10: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5d20: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
5d30: 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
5d40: 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e  se term being in
5d50: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  dexed */.  int a
5d60: 64 64 72 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20  ddrCounter = 0; 
5d70: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5d80: 73 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20  s where integer 
5d90: 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69  counter is initi
5da0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
5db0: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
5dc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
5dd0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68   of registers wh
5de0: 65 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73  ere record is as
5df0: 73 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a  sembled */..  /*
5e00: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5e10: 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
5e20: 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
5e30: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
5e40: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
5e50: 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
5e60: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
5e70: 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
5e80: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
5e90: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5ea0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
5eb0: 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
5ec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
5ed0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
5ee0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
5ef0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
5f00: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
5f10: 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65  hat will be adde
5f20: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20  d to the index. 
5f30: 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20   ** and used to 
5f40: 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75  match WHERE clau
5f50: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
5f60: 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b  /.  nKeyCol = 0;
5f70: 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
5f80: 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64  ->pTab;.  pWCEnd
5f90: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
5fa0: 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20  nTerm];.  pLoop 
5fb0: 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
5fc0: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
5fd0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
5fe0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
5ff0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
6000: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
6010: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
6020: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
6030: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
6040: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20   EP_FromJoin)   
6050: 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79   /* prereq alway
6060: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  s non-zero */.  
6070: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
6080: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
6090: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
60a0: 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72    /*   for the r
60b0: 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20  ight-hand   */. 
60c0: 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70          || pLoop
60d0: 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20  ->prereq!=0 );  
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66     /*   table of
6100: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
6110: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70      if( pLoop->p
6120: 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26  rereq==0.     &&
6130: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
6140: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
6150: 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  ==0.     && !Exp
6160: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
6170: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
6180: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
6190: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
61a0: 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d  ant(pExpr, pSrc-
61b0: 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >iCursor) ){.   
61c0: 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71     pPartial = sq
61d0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
61e0: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
61f0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
6220: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
6230: 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  xpr, 0));.    }.
6240: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
6250: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
6260: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
6270: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
6280: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
6290: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
62a0: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
62b0: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
62c0: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
62d0: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
62e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
62f0: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
6300: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
6310: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
6320: 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
6330: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6340: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
6350: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
6360: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
6370: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
6380: 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
6390: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
63a0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
63b0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
63c0: 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
63d0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
63e0: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
63f0: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
6400: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
6410: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
6420: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
6430: 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20   nKeyCol+1) ){. 
6440: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
6450: 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65  d_auto_index_cre
6460: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ate;.        }. 
6470: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
6480: 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20  Term[nKeyCol++] 
6490: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
64a0: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
64b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
64c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
64d0: 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c  KeyCol>0 );.  pL
64e0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
64f0: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
6500: 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c   = nKeyCol;.  pL
6510: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
6520: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
6530: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
6540: 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6560: 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
6570: 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
6580: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
6590: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
65a0: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
65b0: 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
65c0: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
65d0: 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
65e0: 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
65f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
6600: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
6610: 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
6620: 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
6630: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
6640: 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
6650: 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
6660: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
6670: 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
6680: 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
6690: 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
66a0: 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
66b0: 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
66c0: 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
66d0: 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
66e0: 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
66f0: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
6700: 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
6710: 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
6720: 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
6730: 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
6740: 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
6750: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
6760: 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
6770: 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
6780: 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31  tCol = MIN(BMS-1
6790: 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a  ,pTable->nCol);.
67a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
67b0: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
67c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
67d0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
67e0: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
67f0: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
6800: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
6810: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
6820: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
6830: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
6840: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
6850: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
6860: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
6870: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
6880: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  ;.  }..  /* Cons
6890: 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
68a0: 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69  object to descri
68b0: 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  be this index */
68c0: 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65  .  pIdx = sqlite
68d0: 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62  3AllocateIndexOb
68e0: 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c  ject(pParse->db,
68f0: 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26   nKeyCol+1, 0, &
6900: 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
6910: 20 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20   pIdx==0 ) goto 
6920: 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63  end_auto_index_c
6930: 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  reate;.  pLoop->
6940: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
6950: 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a   pIdx;.  pIdx->z
6960: 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
6970: 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  ex";.  pIdx->pTa
6980: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
6990: 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
69a0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
69b0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
69c0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
69d0: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
69e0: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
69f0: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
6a00: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
6a10: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
6a20: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
6a30: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
6a40: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
6a50: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
6a60: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
6a70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
6a80: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
6a90: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
6aa0: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
6ab0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
6ac0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
6ad0: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
6ae0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
6af0: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
6b00: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
6b10: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
6b20: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
6b30: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
6b40: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
6b50: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
6b60: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
6b70: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
6b80: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
6b90: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43  ->azColl[n] = pC
6ba0: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
6bb0: 6d 65 20 3a 20 73 71 6c 69 74 65 33 53 74 72 42  me : sqlite3StrB
6bc0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6e  INARY;.        n
6bd0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
6be0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6bf0: 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75  (u32)n==pLoop->u
6c00: 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20  .btree.nEq );.. 
6c10: 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e   /* Add addition
6c20: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
6c30: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75  d to make the au
6c40: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e  tomatic index in
6c50: 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69  to.  ** a coveri
6c60: 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f  ng index */.  fo
6c70: 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
6c80: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
6c90: 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
6ca0: 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20  KBIT(i) ){.     
6cb0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6cc0: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
6cd0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6ce0: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
6cf0: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
6d00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
6d10: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
6d20: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
6d30: 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
6d40: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
6d50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
6d60: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6d70: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
6d80: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74  zColl[n] = sqlit
6d90: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
6da0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
6db0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e  }.  assert( n==n
6dc0: 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78  KeyCol );.  pIdx
6dd0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6de0: 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 70 49 64 78  XN_ROWID;.  pIdx
6df0: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71  ->azColl[n] = sq
6e00: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
6e10: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
6e20: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
6e30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c   */.  assert( pL
6e40: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
6e50: 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49   );.  pLevel->iI
6e60: 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
6e70: 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
6e80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6e90: 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c  P_OpenAutoindex,
6ea0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
6eb0: 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20  , nKeyCol+1);.  
6ec0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
6ed0: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
6ee0: 70 49 64 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d  pIdx);.  VdbeCom
6ef0: 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73  ment((v, "for %s
6f00: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
6f10: 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74  ));..  /* Fill t
6f20: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
6f30: 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20  ex with content 
6f40: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
6f50: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
6f60: 29 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  );.  pTabItem = 
6f70: 26 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54  &pWC->pWInfo->pT
6f80: 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
6f90: 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 66 28 20  ->iFrom];.  if( 
6fa0: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
6fb0: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6fc0: 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20   int regYield = 
6fd0: 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74  pTabItem->regRet
6fe0: 75 72 6e 3b 0a 20 20 20 20 61 64 64 72 43 6f 75  urn;.    addrCou
6ff0: 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64  nter = sqlite3Vd
7000: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7010: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
7020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7030: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
7040: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
7050: 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d  ld, 0, pTabItem-
7060: 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
7070: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 20 73 71     addrTop =  sq
7080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
7090: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
70a0: 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65  Yield);.    Vdbe
70b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
70c0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
70d0: 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 25 73   "next row of %s
70e0: 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  ", pTabItem->pTa
70f0: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65  b->zName));.  }e
7100: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70  lse{.    addrTop
7110: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7120: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
7130: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
7140: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
7150: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
7160: 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20  pPartial ){.    
7170: 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  iContinue = sqli
7180: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
7190: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
71a0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
71b0: 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43  se, pPartial, iC
71c0: 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f  ontinue, SQLITE_
71d0: 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
71e0: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
71f0: 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c  |= WHERE_PARTIAL
7200: 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65  IDX;.  }.  regRe
7210: 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
7220: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7230: 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73 71  ;.  regBase = sq
7240: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
7250: 65 78 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61  exKey(.      pPa
7260: 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
7270: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
7280: 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ecord, 0, 0, 0, 
7290: 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  0.  );.  sqlite3
72a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
72b0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76  _IdxInsert, pLev
72c0: 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67  el->iIdxCur, reg
72d0: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
72e0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
72f0: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
7300: 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70  RESULT);.  if( p
7310: 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65  Partial ) sqlite
7320: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
7330: 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
7340: 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d  .  if( pTabItem-
7350: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
7360: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
7370: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
7380: 64 64 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42  ddrCounter, regB
7390: 61 73 65 2b 6e 29 3b 0a 20 20 20 20 74 65 73 74  ase+n);.    test
73a0: 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 62  case( pParse->db
73b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
73c0: 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43  ;.    translateC
73d0: 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72  olumnToCopy(pPar
73e0: 73 65 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65  se, addrTop, pLe
73f0: 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20  vel->iTabCur,.  
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65 6d          pTabItem
7420: 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b  ->regResult, 1);
7430: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7440: 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
7450: 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e  ;.    pTabItem->
7460: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
7470: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
7480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7490: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
74a0: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
74b0: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
74c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
74d0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
74e0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
74f0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
7500: 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
7510: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
7520: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
7530: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7540: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
7550: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
7560: 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
7570: 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  arse);.  .  /* J
7580: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
7590: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
75a0: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
75b0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
75c0: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
75d0: 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  ..end_auto_index
75e0: 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74  _create:.  sqlit
75f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7600: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
7610: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
7620: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7630: 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
7640: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7650: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7660: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
7670: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
7680: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7690: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
76a0: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
76b0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
76c0: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
76d0: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
76e0: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
76f0: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
7700: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
7710: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
7720: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
7730: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
7740: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7750: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
7760: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
7770: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
7780: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
7790: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
77a0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
77b0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  pWC,            
77c0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
77d0: 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 6e 61  clause being ana
77e0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  lyzed */.  Bitma
77f0: 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20  sk mUnusable,   
7800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67             /* Ig
7810: 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68 20  nore terms with 
7820: 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a 2f  these prereqs */
7830: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
7840: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
7850: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
7860: 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
7870: 69 73 20 74 68 65 20 76 74 61 62 20 2a 2f 0a 20  is the vtab */. 
7880: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
7890: 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  rBy,            
78a0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
78b0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
78c0: 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20 20 20 20 20   *pmNoOmit      
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
78e0: 4d 61 73 6b 20 6f 66 20 74 65 72 6d 73 20 6e 6f  Mask of terms no
78f0: 74 20 74 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b 0a  t to omit */.){.
7900: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
7910: 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
7920: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7930: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
7940: 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
7950: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
7960: 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
7970: 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
7980: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7990: 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
79a0: 67 65 3b 0a 20 20 73 74 72 75 63 74 20 48 69 64  ge;.  struct Hid
79b0: 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20 2a 70 48  denIndexInfo *pH
79c0: 69 64 64 65 6e 3b 0a 20 20 57 68 65 72 65 54 65  idden;.  WhereTe
79d0: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
79e0: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
79f0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7a00: 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 75 31 36  *pIdxInfo;.  u16
7a10: 20 6d 4e 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a 20   mNoOmit = 0;.. 
7a20: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
7a30: 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
7a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
7a50: 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
7a60: 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ing.  ** to this
7a70: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
7a80: 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d  /.  for(i=nTerm=
7a90: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
7aa0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
7ab0: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
7ac0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
7ad0: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
7ae0: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
7af0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
7b00: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
7b10: 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f  & mUnusable ) co
7b20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
7b30: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
7b40: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
7b50: 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
7b60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7b70: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7b80: 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
7b90: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7ba0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7bb0: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
7bc0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7bd0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
7be0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7bf0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7c00: 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20  or & WO_ALL );. 
7c10: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
7c20: 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f  Operator & ~(WO_
7c30: 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e  EQUIV))==0 ) con
7c40: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
7c50: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7c60: 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
7c70: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
7c80: 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  t( pTerm->u.left
7c90: 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a  Column>=(-1) );.
7ca0: 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
7cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
7cc0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
7cd0: 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
7ce0: 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
7cf0: 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
7d00: 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
7d10: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
7d20: 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
7d30: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
7d40: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7d50: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
7d60: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
7d70: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
7d80: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f  {.    int n = pO
7d90: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
7da0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
7db0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
7dc0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
7dd0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
7de0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
7df0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
7e00: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
7e10: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
7e20: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
7e30: 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20     if( i==n){.  
7e40: 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e      nOrderBy = n
7e50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7e60: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
7e70: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
7e80: 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
7e90: 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
7ea0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7eb0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
7ec0: 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
7ef0: 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
7f00: 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
7f10: 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
7f40: 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
7f50: 72 42 79 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48  rBy + sizeof(*pH
7f60: 69 64 64 65 6e 29 20 29 3b 0a 20 20 69 66 28 20  idden) );.  if( 
7f70: 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
7f80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7f90: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
7fa0: 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
7fb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
7fc0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
7fd0: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
7fe0: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
7ff0: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
8000: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d   contains.  ** m
8010: 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  any fields that 
8020: 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f  are declared "co
8030: 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20  nst" to prevent 
8040: 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a  xBestIndex from.
8050: 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68    ** changing th
8060: 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  em.  We have to 
8070: 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61  do some funky ca
8080: 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74  sting in order t
8090: 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  o.  ** initializ
80a0: 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  e those fields..
80b0: 20 20 2a 2f 0a 20 20 70 48 69 64 64 65 6e 20 3d    */.  pHidden =
80c0: 20 28 73 74 72 75 63 74 20 48 69 64 64 65 6e 49   (struct HiddenI
80d0: 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49 64 78 49  ndexInfo*)&pIdxI
80e0: 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 43 6f  nfo[1];.  pIdxCo
80f0: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
8100: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
8110: 72 61 69 6e 74 2a 29 26 70 48 69 64 64 65 6e 5b  raint*)&pHidden[
8120: 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
8130: 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
8140: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
8150: 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
8160: 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
8170: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
8180: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
8190: 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
81a0: 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
81b0: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
81c0: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
81d0: 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
81e0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
81f0: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
8200: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
8210: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
8220: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
8230: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
8240: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
8250: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
8260: 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
8270: 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
8280: 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
8290: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
82a0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
82b0: 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
82c0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
82d0: 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
8320: 73 61 67 65 3b 0a 0a 20 20 70 48 69 64 64 65 6e  sage;..  pHidden
8330: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70  ->pWC = pWC;.  p
8340: 48 69 64 64 65 6e 2d 3e 70 50 61 72 73 65 20 3d  Hidden->pParse =
8350: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
8360: 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
8370: 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
8380: 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
8390: 0a 20 20 20 20 75 31 36 20 6f 70 3b 0a 20 20 20  .    u16 op;.   
83a0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
83b0: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
83c0: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
83d0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
83e0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
83f0: 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e   mUnusable ) con
8400: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
8410: 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
8420: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8430: 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b   & ~WO_EQUIV) );
8440: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8450: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8460: 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  & WO_IN );.    t
8470: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
8480: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
8490: 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
84a0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
84b0: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
84c0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
84d0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
84e0: 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20  r & WO_ALL );.  
84f0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
8500: 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45  perator & ~(WO_E
8510: 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74  QUIV))==0 ) cont
8520: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
8530: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8540: 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74  ERM_VNULL ) cont
8550: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
8560: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
8570: 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20  olumn>=(-1) );. 
8580: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
8590: 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
85a0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
85b0: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
85c0: 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
85d0: 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65     op = pTerm->e
85e0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
85f0: 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  L;.    if( op==W
8600: 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45  O_IN ) op = WO_E
8610: 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  Q;.    if( op==W
8620: 4f 5f 41 55 58 20 29 7b 0a 20 20 20 20 20 20 70  O_AUX ){.      p
8630: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
8640: 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f 70 3b  pTerm->eMatchOp;
8650: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
8660: 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  p & (WO_ISNULL|W
8670: 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69  O_IS) ){.      i
8680: 66 28 20 6f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c  f( op==WO_ISNULL
8690: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
86a0: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c  Cons[j].op = SQL
86b0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
86c0: 41 49 4e 54 5f 49 53 4e 55 4c 4c 3b 0a 20 20 20  AINT_ISNULL;.   
86d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
86e0: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
86f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   = SQLITE_INDEX_
8700: 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 3b 0a 20  CONSTRAINT_IS;. 
8710: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8720: 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  {.      pIdxCons
8730: 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 6f 70 3b  [j].op = (u8)op;
8740: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69  .      /* The di
8750: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
8760: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
8770: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
8780: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
8790: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
87a0: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
87b0: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
87c0: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
87d0: 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 66    The.      ** f
87e0: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
87f0: 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
8800: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  t. */.      asse
8810: 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
8820: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8830: 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 61  NT_EQ );.      a
8840: 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51  ssert( WO_LT==SQ
8850: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8860: 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20  RAINT_LT );.    
8870: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d    assert( WO_LE=
8880: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
8890: 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20  NSTRAINT_LE );. 
88a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
88b0: 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GT==SQLITE_INDEX
88c0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29  _CONSTRAINT_GT )
88d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
88e0: 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
88f0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
8900: 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
8910: 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
8920: 74 6f 72 26 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51  tor&(WO_IN|WO_EQ
8930: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
8940: 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 41 55 58 29  GT|WO_GE|WO_AUX)
8950: 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f   );..      if( o
8960: 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  p & (WO_LT|WO_LE
8970: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 0a 20 20  |WO_GT|WO_GE).  
8980: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
8990: 78 70 72 49 73 56 65 63 74 6f 72 28 70 54 65 72  xprIsVector(pTer
89a0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
89b0: 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
89c0: 20 20 20 20 69 66 28 20 69 3c 31 36 20 29 20 6d      if( i<16 ) m
89d0: 4e 6f 4f 6d 69 74 20 7c 3d 20 28 31 20 3c 3c 20  NoOmit |= (1 << 
89e0: 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
89f0: 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20 70 49 64 78  op==WO_LT ) pIdx
8a00: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f  Cons[j].op = WO_
8a10: 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  LE;.        if( 
8a20: 6f 70 3d 3d 57 4f 5f 47 54 20 29 20 70 49 64 78  op==WO_GT ) pIdx
8a30: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f  Cons[j].op = WO_
8a40: 47 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  GE;.      }.    
8a50: 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  }..    j++;.  }.
8a60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
8a70: 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
8a80: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
8a90: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
8aa0: 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  xpr;.    pIdxOrd
8ab0: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20  erBy[i].iColumn 
8ac0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
8ad0: 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
8ae0: 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64  y[i].desc = pOrd
8af0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
8b00: 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6d  rder;.  }..  *pm
8b10: 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69 74  NoOmit = mNoOmit
8b20: 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ;.  return pIdxI
8b30: 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
8b40: 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
8b50: 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
8b60: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
8b70: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
8b80: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
8b90: 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
8ba0: 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
8bb0: 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
8bc0: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
8bd0: 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
8be0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
8bf0: 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
8c00: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a  3_index_info obj
8c10: 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65  ect that.** come
8c20: 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64 20  s in as the 3rd 
8c30: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
8c40: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
8c50: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
8c60: 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
8c70: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
8c80: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
8c90: 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
8ca0: 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
8cb0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
8cc0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
8cd0: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
8ce0: 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
8cf0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
8d00: 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
8d10: 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
8d20: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
8d30: 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
8d40: 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
8d50: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
8d60: 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
8d70: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
8d80: 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
8d90: 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
8da0: 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
8db0: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
8dc0: 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
8dd0: 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
8de0: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
8df0: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
8e00: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
8e10: 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
8e20: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
8e30: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
8e40: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
8e50: 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
8e60: 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44   rc;..  TRACE_ID
8e70: 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
8e80: 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
8e90: 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
8ea0: 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
8eb0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
8ec0: 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
8ed0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
8ee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
8ef0: 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  EM ){.      sqli
8f00: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 50 61 72  te3OomFault(pPar
8f10: 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 65 6c  se->db);.    }el
8f20: 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a  se if( !pVtab->z
8f30: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
8f40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8f50: 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71  pParse, "%s", sq
8f60: 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29  lite3ErrStr(rc))
8f70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8f80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8f90: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
8fa0: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
8fb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
8fc0: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
8fd0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
8fe0: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
8ff0: 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 54 68  ;..#if 0.  /* Th
9000: 69 73 20 65 72 72 6f 72 20 69 73 20 6e 6f 77 20  is error is now 
9010: 63 61 75 67 68 74 20 62 79 20 74 68 65 20 63 61  caught by the ca
9020: 6c 6c 65 72 2e 0a 20 20 2a 2a 20 53 65 61 72 63  ller..  ** Searc
9030: 68 20 66 6f 72 20 22 78 42 65 73 74 49 6e 64 65  h for "xBestInde
9040: 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 20 62  x malfunction" b
9050: 65 6c 6f 77 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  elow */.  for(i=
9060: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
9070: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
9080: 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69  f( !p->aConstrai
9090: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
90a0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
90b0: 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
90c0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
90d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
90e0: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
90f0: 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
9100: 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
9110: 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
9120: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
9130: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
9140: 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
9150: 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20  >nErr;.}.#endif 
9160: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
9170: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
9180: 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66  ABLE) */..#ifdef
9190: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
91a0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
91b0: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
91c0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70   location of a p
91d0: 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d  articular key am
91e0: 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20  ong all keys in 
91f0: 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74  an.** index.  St
9200: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
9210: 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c  in aStat as foll
9220: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53  ows:.**.**    aS
9230: 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e  tat[0]      Est.
9240: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
9250: 6c 65 73 73 20 74 68 61 6e 20 70 52 65 63 0a 2a  less than pRec.*
9260: 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20  *    aStat[1]   
9270: 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
9280: 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20  f rows equal to 
9290: 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  pRec.**.** Retur
92a0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
92b0: 68 65 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  he sample that i
92c0: 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73  s the smallest s
92d0: 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73  ample that.** is
92e0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
92f0: 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 2e 20   equal to pRec. 
9300: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 69  Note that this i
9310: 6e 64 65 78 20 69 73 20 6e 6f 74 20 61 6e 20 69  ndex is not an i
9320: 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ndex.** into the
9330: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
9340: 20 2d 20 69 74 20 69 73 20 61 6e 20 69 6e 64 65   - it is an inde
9350: 78 20 69 6e 74 6f 20 61 20 76 69 72 74 75 61 6c  x into a virtual
9360: 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a   set of samples.
9370: 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ** based on the 
9380: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 53 61 6d  contents of aSam
9390: 70 6c 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75  ple[] and the nu
93a0: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
93b0: 6e 20 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65  n record .** pRe
93c0: 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  c. .*/.static in
93d0: 74 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  t whereKeyStats(
93e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
93f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9400: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
9410: 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
9420: 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
9430: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9440: 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61  to consider doma
9450: 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63  in of */.  Unpac
9460: 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c  kedRecord *pRec,
9470: 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72         /* Vector
9480: 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f   of values to co
9490: 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  nsider */.  int 
94a0: 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20  roundUp,        
94b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64          /* Round
94c0: 20 75 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f   up if true.  Ro
94d0: 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73  und down if fals
94e0: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  e */.  tRowcnt *
94f0: 61 53 74 61 74 20 20 20 20 20 20 20 20 20 20 20  aStat           
9500: 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73     /* OUT: stats
9510: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
9520: 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c  .){.  IndexSampl
9530: 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64  e *aSample = pId
9540: 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e  x->aSample;.  in
9550: 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
9560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9570: 65 78 20 6f 66 20 72 65 71 75 69 72 65 64 20 73  ex of required s
9580: 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65  tats in anEq[] e
9590: 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  tc. */.  int i; 
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
95c0: 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d   first sample >=
95d0: 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pRec */.  int i
95e0: 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20  Sample;         
95f0: 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65         /* Smalle
9600: 73 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72  st sample larger
9610: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
9620: 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20  o pRec */.  int 
9630: 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  iMin = 0;       
9640: 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c          /* Small
9650: 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79  est sample not y
9660: 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69  et tested */.  i
9670: 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20 20  nt iTest;       
9680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
9690: 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73  xt sample to tes
96a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20  t */.  int res; 
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
96d0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
96e0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  tion */.  int nF
96f0: 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  ield;           
9700: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9710: 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 70 52 65  of fields in pRe
9720: 63 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69  c */.  tRowcnt i
9730: 4c 6f 77 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Lower = 0;      
9740: 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61     /* anLt[] + a
9750: 6e 45 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74  nEq[] of largest
9760: 20 73 61 6d 70 6c 65 20 70 52 65 63 20 69 73 20   sample pRec is 
9770: 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  > */..#ifndef SQ
9780: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55  LITE_DEBUG.  UNU
9790: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70  SED_PARAMETER( p
97a0: 50 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a  Parse );.#endif.
97b0: 20 20 61 73 73 65 72 74 28 20 70 52 65 63 21 3d    assert( pRec!=
97c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
97d0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  Idx->nSample>0 )
97e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63  ;.  assert( pRec
97f0: 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 52  ->nField>0 && pR
9800: 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78  ec->nField<=pIdx
9810: 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a  ->nSampleCol );.
9820: 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72  .  /* Do a binar
9830: 79 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64  y search to find
9840: 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
9850: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
9860: 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20  r equal.  ** to 
9870: 70 52 65 63 2e 20 49 66 20 70 52 65 63 20 63 6f  pRec. If pRec co
9880: 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20  ntains a single 
9890: 66 69 65 6c 64 2c 20 74 68 65 20 73 65 74 20 6f  field, the set o
98a0: 66 20 73 61 6d 70 6c 65 73 20 74 6f 20 73 65 61  f samples to sea
98b0: 72 63 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70  rch.  ** is simp
98c0: 6c 79 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  ly the aSample[]
98d0: 20 61 72 72 61 79 2e 20 49 66 20 74 68 65 20 73   array. If the s
98e0: 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c  amples in aSampl
98f0: 65 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65  e[] contain more
9900: 0a 20 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66  .  ** than one f
9910: 69 65 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64  ields, all field
9920: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
9930: 66 69 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65  first are ignore
9940: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
9950: 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20  pRec contains N 
9960: 66 69 65 6c 64 73 2c 20 77 68 65 72 65 20 4e 20  fields, where N 
9970: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
9980: 2c 20 74 68 65 6e 20 61 73 20 77 65 6c 6c 20 61  , then as well a
9990: 73 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c  s the.  ** sampl
99a0: 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20  es in aSample[] 
99b0: 28 74 72 75 6e 63 61 74 65 64 20 74 6f 20 4e 20  (truncated to N 
99c0: 66 69 65 6c 64 73 29 2c 20 74 68 65 20 73 65 61  fields), the sea
99d0: 72 63 68 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a  rch also has to.
99e0: 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70 72    ** consider pr
99f0: 65 66 69 78 65 73 20 6f 66 20 74 68 6f 73 65 20  efixes of those 
9a00: 73 61 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78 61  samples. For exa
9a10: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 73 65 74  mple, if the set
9a20: 20 6f 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a   of samples.  **
9a30: 20 69 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a   in aSample is:.
9a40: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53    **.  **     aS
9a50: 61 6d 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35  ample[0] = (a, 5
9a60: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
9a70: 70 6c 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29  ple[1] = (a, 10)
9a80: 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70   .  **     aSamp
9a90: 6c 65 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a  le[2] = (b, 5) .
9aa0: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
9ab0: 5b 33 5d 20 3d 20 28 63 2c 20 31 30 30 29 20 0a  [3] = (c, 100) .
9ac0: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
9ad0: 5b 34 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a 20  [4] = (c, 105). 
9ae0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68   **.  ** Then th
9af0: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 73  e search space s
9b00: 68 6f 75 6c 64 20 69 64 65 61 6c 6c 79 20 62 65  hould ideally be
9b10: 20 74 68 65 20 73 61 6d 70 6c 65 73 20 61 62 6f   the samples abo
9b20: 76 65 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a  ve and the .  **
9b30: 20 75 6e 69 71 75 65 20 70 72 65 66 69 78 65 73   unique prefixes
9b40: 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63   [a], [b] and [c
9b50: 5d 2e 20 42 75 74 20 73 69 6e 63 65 20 74 68 61  ]. But since tha
9b60: 74 20 69 73 20 68 61 72 64 20 74 6f 20 6f 72 67  t is hard to org
9b70: 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65  anize, .  ** the
9b80: 20 63 6f 64 65 20 61 63 74 75 61 6c 6c 79 20 73   code actually s
9b90: 65 61 72 63 68 65 73 20 74 68 69 73 20 73 65 74  earches this set
9ba0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9bb0: 30 3a 20 28 61 29 20 0a 20 20 2a 2a 20 20 20 20  0: (a) .  **    
9bc0: 20 31 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a   1: (a, 5) .  **
9bd0: 20 20 20 20 20 32 3a 20 28 61 2c 20 31 30 29 20       2: (a, 10) 
9be0: 0a 20 20 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c  .  **     3: (a,
9bf0: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 34   10) .  **     4
9c00: 3a 20 28 62 29 20 0a 20 20 2a 2a 20 20 20 20 20  : (b) .  **     
9c10: 35 3a 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20  5: (b, 5) .  ** 
9c20: 20 20 20 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a      6: (c) .  **
9c30: 20 20 20 20 20 37 3a 20 28 63 2c 20 31 30 30 29       7: (c, 100)
9c40: 20 0a 20 20 2a 2a 20 20 20 20 20 38 3a 20 28 63   .  **     8: (c
9c50: 2c 20 31 30 35 29 0a 20 20 2a 2a 20 20 20 20 20  , 105).  **     
9c60: 39 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a  9: (c, 105).  **
9c70: 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 73  .  ** For each s
9c80: 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 53 61  ample in the aSa
9c90: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20  mple[] array, N 
9ca0: 73 61 6d 70 6c 65 73 20 61 72 65 20 70 72 65 73  samples are pres
9cb0: 65 6e 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ent in the.  ** 
9cc0: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
9cd0: 20 61 72 72 61 79 2e 20 49 6e 20 74 68 65 20 61   array. In the a
9ce0: 62 6f 76 65 2c 20 73 61 6d 70 6c 65 73 20 30 20  bove, samples 0 
9cf0: 61 6e 64 20 31 20 61 72 65 20 62 61 73 65 64 20  and 1 are based 
9d00: 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20  on .  ** sample 
9d10: 61 53 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70  aSample[0]. Samp
9d20: 6c 65 73 20 32 20 61 6e 64 20 33 20 6f 6e 20 61  les 2 and 3 on a
9d30: 53 61 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20  Sample[1] etc.. 
9d40: 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20   **.  ** Often, 
9d50: 73 61 6d 70 6c 65 20 69 20 6f 66 20 65 61 63 68  sample i of each
9d60: 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65   block of N effe
9d70: 63 74 69 76 65 20 73 61 6d 70 6c 65 73 20 68 61  ctive samples ha
9d80: 73 20 28 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a  s (i+1) fields..
9d90: 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 65 61 63    ** Except, eac
9da0: 68 20 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20  h sample may be 
9db0: 65 78 74 65 6e 64 65 64 20 74 6f 20 65 6e 73 75  extended to ensu
9dc0: 72 65 20 74 68 61 74 20 69 74 20 69 73 20 67 72  re that it is gr
9dd0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 0a 20 20  eater than or.  
9de0: 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ** equal to the 
9df0: 70 72 65 76 69 6f 75 73 20 73 61 6d 70 6c 65 20  previous sample 
9e00: 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 46 6f  in the array. Fo
9e10: 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68  r example, in th
9e20: 65 20 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73  e above, .  ** s
9e30: 61 6d 70 6c 65 20 32 20 69 73 20 74 68 65 20 66  ample 2 is the f
9e40: 69 72 73 74 20 73 61 6d 70 6c 65 20 6f 66 20 61  irst sample of a
9e50: 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70   block of N samp
9e60: 6c 65 73 2c 20 73 6f 20 61 74 20 66 69 72 73 74  les, so at first
9e70: 20 69 74 20 0a 20 20 2a 2a 20 61 70 70 65 61 72   it .  ** appear
9e80: 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
9e90: 20 62 65 20 31 20 66 69 65 6c 64 20 69 6e 20 73   be 1 field in s
9ea0: 69 7a 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68  ize. However, th
9eb0: 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74  at would make it
9ec0: 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74   .  ** smaller t
9ed0: 68 61 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f  han sample 1, so
9ee0: 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
9ef0: 63 68 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72  ch would not wor
9f00: 6b 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20  k. As a result, 
9f10: 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 74 65  .  ** it is exte
9f20: 6e 64 65 64 20 74 6f 20 74 77 6f 20 66 69 65 6c  nded to two fiel
9f30: 64 73 2e 20 54 68 65 20 64 75 70 6c 69 63 61 74  ds. The duplicat
9f40: 65 73 20 74 68 61 74 20 74 68 69 73 20 63 72 65  es that this cre
9f50: 61 74 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a  ates do not .  *
9f60: 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  * cause any prob
9f70: 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69  lems..  */.  nFi
9f80: 65 6c 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65  eld = pRec->nFie
9f90: 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a  ld;.  iCol = 0;.
9fa0: 20 20 69 53 61 6d 70 6c 65 20 3d 20 70 49 64 78    iSample = pIdx
9fb0: 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65  ->nSample * nFie
9fc0: 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e  ld;.  do{.    in
9fd0: 74 20 69 53 61 6d 70 3b 20 20 20 20 20 20 20 20  t iSamp;        
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9ff0: 6e 64 65 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b  ndex in aSample[
a000: 5d 20 6f 66 20 74 65 73 74 20 73 61 6d 70 6c 65  ] of test sample
a010: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20   */.    int n;  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a030: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a040: 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 65 73  of fields in tes
a050: 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20  t sample */..   
a060: 20 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69   iTest = (iMin+i
a070: 53 61 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69  Sample)/2;.    i
a080: 53 61 6d 70 20 3d 20 69 54 65 73 74 20 2f 20 6e  Samp = iTest / n
a090: 46 69 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 69  Field;.    if( i
a0a0: 53 61 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20  Samp>0 ){.      
a0b0: 2f 2a 20 54 68 65 20 70 72 6f 70 6f 73 65 64 20  /* The proposed 
a0c0: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
a0d0: 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
a0e0: 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69  sample aSample[i
a0f0: 53 61 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20  Samp]..      ** 
a100: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68  Specifically, th
a110: 65 20 73 68 6f 72 74 65 73 74 20 70 72 65 66 69  e shortest prefi
a120: 78 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28 31  x of at least (1
a130: 20 2b 20 69 54 65 73 74 25 6e 46 69 65 6c 64 29   + iTest%nField)
a140: 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64   .      ** field
a150: 73 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  s that is greate
a160: 72 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69  r than the previ
a170: 6f 75 73 20 65 66 66 65 63 74 69 76 65 20 73 61  ous effective sa
a180: 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mple.  */.      
a190: 66 6f 72 28 6e 3d 28 69 54 65 73 74 20 25 20 6e  for(n=(iTest % n
a1a0: 46 69 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46  Field) + 1; n<nF
a1b0: 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  ield; n++){.    
a1c0: 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
a1d0: 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d  iSamp-1].anLt[n-
a1e0: 31 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d  1]!=aSample[iSam
a1f0: 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62  p].anLt[n-1] ) b
a200: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
a220: 20 3d 20 69 54 65 73 74 20 2b 20 31 3b 0a 20 20   = iTest + 1;.  
a230: 20 20 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e    }..    pRec->n
a240: 46 69 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72  Field = n;.    r
a250: 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
a260: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
a270: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20  ample[iSamp].n, 
a280: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70  aSample[iSamp].p
a290: 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28  , pRec);.    if(
a2a0: 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
a2b0: 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65  iLower = aSample
a2c0: 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31  [iSamp].anLt[n-1
a2d0: 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  ] + aSample[iSam
a2e0: 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20  p].anEq[n-1];.  
a2f0: 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74      iMin = iTest
a300: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
a310: 28 20 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46  ( res==0 && n<nF
a320: 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  ield ){.      iL
a330: 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
a340: 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b  Samp].anLt[n-1];
a350: 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54  .      iMin = iT
a360: 65 73 74 2b 31 3b 0a 20 20 20 20 20 20 72 65 73  est+1;.      res
a370: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
a380: 7b 0a 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20  {.      iSample 
a390: 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 20 20 69  = iTest;.      i
a3a0: 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d  Col = n-1;.    }
a3b0: 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26  .  }while( res &
a3c0: 26 20 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29  & iMin<iSample )
a3d0: 3b 0a 20 20 69 20 3d 20 69 53 61 6d 70 6c 65 20  ;.  i = iSample 
a3e0: 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65  / nField;..#ifde
a3f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a400: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
a410: 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
a420: 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74 20 74  nts check that t
a430: 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
a440: 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65   code.  ** above
a450: 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74   found the right
a460: 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c   answer. This bl
a470: 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75  ock serves no pu
a480: 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a  rpose other.  **
a490: 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20   than to invoke 
a4a0: 74 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f  the asserts.  */
a4b0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
a4c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
a4d0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65  =0 ){.    if( re
a4e0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  s==0 ){.      /*
a4f0: 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20   If (res==0) is 
a500: 74 72 75 65 2c 20 74 68 65 6e 20 70 52 65 63 20  true, then pRec 
a510: 6d 75 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f  must be equal to
a520: 20 73 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20   sample i. */.  
a530: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49      assert( i<pI
a540: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->nSample );. 
a550: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
a560: 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20  l==nField-1 );. 
a570: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
a580: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  d = nField;.    
a590: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
a5a0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
a5b0: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
a5c0: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
a5d0: 2c 20 70 52 65 63 29 20 0a 20 20 20 20 20 20 20  , pRec) .       
a5e0: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
a5f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a600: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65  .      );.    }e
a610: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e  lse{.      /* Un
a620: 6c 65 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  less i==pIdx->nS
a630: 61 6d 70 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e  ample, indicatin
a640: 67 20 74 68 61 74 20 70 52 65 63 20 69 73 20 6c  g that pRec is l
a650: 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20 20  arger than.     
a660: 20 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20   ** all samples 
a670: 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  in the aSample[]
a680: 20 61 72 72 61 79 2c 20 70 52 65 63 20 6d 75 73   array, pRec mus
a690: 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  t be smaller tha
a6a0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 28  n the.      ** (
a6b0: 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72  iCol+1) field pr
a6c0: 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69  efix of sample i
a6d0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .  */.      asse
a6e0: 72 74 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61  rt( i<=pIdx->nSa
a6f0: 6d 70 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a  mple && i>=0 );.
a700: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
a710: 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20  ld = iCol+1;.   
a720: 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49     assert( i==pI
a730: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20  dx->nSample .   
a740: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
a750: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
a760: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
a770: 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
a780: 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20  pRec)>0.        
a790: 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
a7a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a7b0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 69  ;..      /* if i
a7c0: 3d 3d 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c  ==0 and iCol==0,
a7d0: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 70 52 65   then record pRe
a7e0: 63 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  c is smaller tha
a7f0: 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20  n all samples.  
a800: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 61 53      ** in the aS
a810: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f  ample[] array. O
a820: 74 68 65 72 77 69 73 65 2c 20 69 66 20 28 69 43  therwise, if (iC
a830: 6f 6c 3e 30 29 20 74 68 65 6e 20 70 52 65 63 20  ol>0) then pRec 
a840: 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  must.      ** be
a850: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
a860: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 28 69   equal to the (i
a870: 43 6f 6c 29 20 66 69 65 6c 64 20 70 72 65 66 69  Col) field prefi
a880: 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20  x of sample i.. 
a890: 20 20 20 20 20 2a 2a 20 49 66 20 28 69 3e 30 29       ** If (i>0)
a8a0: 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74  , then pRec must
a8b0: 20 61 6c 73 6f 20 62 65 20 67 72 65 61 74 65 72   also be greater
a8c0: 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d   than sample (i-
a8d0: 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  1).  */.      if
a8e0: 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( iCol>0 ){.    
a8f0: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
a900: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20   = iCol;.       
a910: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a920: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
a930: 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
a940: 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
a950: 65 63 29 3c 3d 30 0a 20 20 20 20 20 20 20 20 20  ec)<=0.         
a960: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
a970: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a980: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a990: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
a9a0: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
a9b0: 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20   = nField;.     
a9c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a9d0: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
a9e0: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  are(aSample[i-1]
a9f0: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  .n, aSample[i-1]
aa00: 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20  .p, pRec)<0.    
aa10: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
aa20: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
aa30: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a  iled );.      }.
aa40: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
aa50: 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45   /* ifdef SQLITE
aa60: 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28  _DEBUG */..  if(
aa70: 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   res==0 ){.    /
aa80: 2a 20 52 65 63 6f 72 64 20 70 52 65 63 20 69 73  * Record pRec is
aa90: 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65   equal to sample
aaa0: 20 69 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74   i */.    assert
aab0: 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31  ( iCol==nField-1
aac0: 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d   );.    aStat[0]
aad0: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
aae0: 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53  Lt[iCol];.    aS
aaf0: 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[1] = aSample
ab00: 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a  [i].anEq[iCol];.
ab10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
ab20: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
ab30: 68 65 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c  he (iCol+1) fiel
ab40: 64 20 70 72 65 66 69 78 20 6f 66 20 61 53 61 6d  d prefix of aSam
ab50: 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69  ple[i] is the fi
ab60: 72 73 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70  rst .    ** samp
ab70: 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74  le that is great
ab80: 65 72 20 74 68 61 6e 20 70 52 65 63 2e 20 4f 72  er than pRec. Or
ab90: 2c 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  , if i==pIdx->nS
aba0: 61 6d 70 6c 65 20 74 68 65 6e 20 70 52 65 63 0a  ample then pRec.
abb0: 20 20 20 20 2a 2a 20 69 73 20 6c 61 72 67 65 72      ** is larger
abc0: 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   than all sample
abd0: 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20  s in the array. 
abe0: 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  */.    tRowcnt i
abf0: 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20  Upper, iGap;.   
ac00: 20 69 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53   if( i>=pIdx->nS
ac10: 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  ample ){.      i
ac20: 55 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c  Upper = sqlite3L
ac30: 6f 67 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d  ogEstToInt(pIdx-
ac40: 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29  >aiRowLogEst[0])
ac50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ac60: 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d     iUpper = aSam
ac70: 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[i].anLt[iCol
ac80: 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ];.    }..    if
ac90: 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72  ( iLower>=iUpper
aca0: 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
acb0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
acc0: 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70       iGap = iUpp
acd0: 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20  er - iLower;.   
ace0: 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64   }.    if( round
acf0: 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  Up ){.      iGap
ad00: 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20   = (iGap*2)/3;. 
ad10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ad20: 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20  iGap = iGap/3;. 
ad30: 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30     }.    aStat[0
ad40: 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61  ] = iLower + iGa
ad50: 70 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  p;.    aStat[1] 
ad60: 3d 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 6e  = pIdx->aAvgEq[n
ad70: 46 69 65 6c 64 2d 31 5d 3b 0a 20 20 7d 0a 0a 20  Field-1];.  }.. 
ad80: 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   /* Restore the 
ad90: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c  pRec->nField val
ada0: 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
adb0: 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d  ing.  */.  pRec-
adc0: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
add0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
ade0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
adf0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
ae00: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
ae10: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
ae20: 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74  LL, pTerm is a t
ae30: 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65  erm that provide
ae40: 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f  s an upper or lo
ae50: 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20  wer.** bound on 
ae60: 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69  a range scan. Wi
ae70: 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e  thout considerin
ae80: 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65  g pTerm, it is e
ae90: 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61  stimated .** tha
aea0: 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20  t the scan will 
aeb0: 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e  visit nNew rows.
aec0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
aed0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
aee0: 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74  r.** estimated t
aef0: 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74  o be visited aft
af00: 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20  er taking pTerm 
af10: 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a  into account..**
af20: 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
af30: 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
af40: 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  fied a likelihoo
af50: 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68  d() value for th
af60: 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e  is term,.** then
af70: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
af80: 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68  e is the likelih
af90: 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62  ood multiplied b
afa0: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
afb0: 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f  ** input rows. O
afc0: 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66  therwise, this f
afd0: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
afe0: 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20  that an "IS NOT 
aff0: 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61  NULL" term.** ha
b000: 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  s a likelihood o
b010: 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20  f 0.50, and any 
b020: 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b  other term a lik
b030: 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e  elihood of 0.25.
b040: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
b050: 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  t whereRangeAdju
b060: 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  st(WhereTerm *pT
b070: 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77  erm, LogEst nNew
b080: 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74  ){.  LogEst nRet
b090: 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70   = nNew;.  if( p
b0a0: 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  Term ){.    if( 
b0b0: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
b0c0: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  <=0 ){.      nRe
b0d0: 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
b0e0: 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65  hProb;.    }else
b0f0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
b100: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
b110: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  L)==0 ){.      n
b120: 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  Ret -= 20;      
b130: 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
b140: 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
b150: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
b160: 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23  turn nRet;.}...#
b170: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b180: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
b190: 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T4./*.** Return 
b1a0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f 72  the affinity for
b1b0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
b1c0: 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f   of an index..*/
b1d0: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 49 6e 64  .char sqlite3Ind
b1e0: 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79  exColumnAffinity
b1f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e  (sqlite3 *db, In
b200: 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69  dex *pIdx, int i
b210: 43 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Col){.  assert( 
b220: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
b230: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  pIdx->nColumn );
b240: 0a 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a 43  .  if( !pIdx->zC
b250: 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66 28  olAff ){.    if(
b260: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
b270: 69 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49 64  inityStr(db, pId
b280: 78 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  x)==0 ) return S
b290: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
b2a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 64    }.  return pId
b2b0: 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d  x->zColAff[iCol]
b2c0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
b2d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b2e0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
b2f0: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
b300: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
b310: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
b320: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
b330: 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20 72  isited by a.** r
b340: 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73  ange-scan on a s
b350: 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20  kip-scan index. 
b360: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
b370: 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
b380: 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c  X i1 ON t1(a, b,
b390: 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54   c);.**   SELECT
b3a0: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
b3b0: 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57 45   a=? AND c BETWE
b3c0: 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a  EN ? AND ?;.**.*
b3d0: 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e  * Value pLoop->n
b3e0: 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Out is currently
b3f0: 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
b400: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
b410: 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65 64  rows .** visited
b420: 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28 61   for scanning (a
b430: 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69  =? AND b=?). Thi
b440: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75 63  s function reduc
b450: 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74 65  es that estimate
b460: 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61 63   .** by some fac
b470: 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  tor to account f
b480: 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45 45  or the (c BETWEE
b490: 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72 65  N ? AND ?) expre
b4a0: 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f  ssion based.** o
b4b0: 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74 61  n the stat4 data
b4c0: 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 20   for the index. 
b4d0: 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20 62  this scan will b
b4e0: 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69  e peformed multi
b4f0: 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f  ple .** times (o
b500: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61 2c  nce for each (a,
b510: 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74  b) combination t
b520: 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f 29  hat matches a=?)
b530: 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20 0a   is dealt with .
b540: 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ** by the caller
b550: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20  ..**.** It does 
b560: 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e 67  this by scanning
b570: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74 61   through all sta
b580: 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70  t4 samples, comp
b590: 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20  aring values.** 
b5a0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
b5b0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
b5c0: 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 73   with the corres
b5d0: 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69  ponding column i
b5e0: 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65  n each.** sample
b5f0: 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72 65  . If L and U are
b600: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
b610: 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20  amples found to 
b620: 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a  be less than or.
b630: 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ** equal to the 
b640: 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65 64  values extracted
b650: 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
b660: 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
b670: 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69  vely, and.** N i
b680: 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
b690: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74  er of samples, t
b6a0: 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76  he pLoop->nOut v
b6b0: 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65 64  alue is adjusted
b6c0: 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  .** as follows:.
b6d0: 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e  **.**   nOut = n
b6e0: 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20  Out * ( min(U - 
b6f0: 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a  L, 1) / N ).**.*
b700: 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20 4e  * If pLower is N
b710: 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20  ULL, or a value 
b720: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
b730: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65 72  ted from the ter
b740: 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74  m, L is.** set t
b750: 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70 65  o zero. If pUppe
b760: 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20  r is NULL, or a 
b770: 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
b780: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
b790: 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20 74  t,.** U is set t
b7a0: 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  o N..**.** Norma
b7b0: 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
b7c0: 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65 20  on sets *pbDone 
b7d0: 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74 75  to 1 before retu
b7e0: 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a  rning. However,.
b7f0: 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20 63  ** if no value c
b800: 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20  an be extracted 
b810: 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f 77  from either pLow
b820: 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61 6e  er or pUpper (an
b830: 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69  d so the.** esti
b840: 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
b850: 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69 76  er of rows deliv
b860: 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e 63  ered remains unc
b870: 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65  hanged), *pbDone
b880: 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20 69  .** is left as i
b890: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
b8a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
b8b0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
b8c0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
b8d0: 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51  therwise, .** SQ
b8e0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
b8f0: 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
b900: 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20 20  eSkipScanEst(.  
b910: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b920: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b930: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
b940: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
b950: 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72  hereTerm *pLower
b960: 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75  ,   /* Lower bou
b970: 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
b980: 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67   ex: "x>123" Mig
b990: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
b9a0: 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65  WhereTerm *pUppe
b9b0: 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f  r,   /* Upper bo
b9c0: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
b9d0: 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69  . ex: "x<455" Mi
b9e0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
b9f0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
ba00: 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  p,    /* Update 
ba10: 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20  the .nOut value 
ba20: 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  of this loop */.
ba30: 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20    int *pbDone   
ba40: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
ba50: 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73   true if at leas
ba60: 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c 75  t one expr. valu
ba70: 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 29  e extracted */.)
ba80: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
ba90: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
baa0: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
bab0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
bac0: 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33 20  .nEq;.  sqlite3 
bad0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
bae0: 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d  ;.  int nLower =
baf0: 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65   -1;.  int nUppe
bb00: 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31  r = p->nSample+1
bb10: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
bb20: 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66 66  ITE_OK;.  u8 aff
bb30: 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43   = sqlite3IndexC
bb40: 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 64 62  olumnAffinity(db
bb50: 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f 6c  , p, nEq);.  Col
bb60: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a  lSeq *pColl;.  .
bb70: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
bb80: 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *p1 = 0;        
bb90: 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
bba0: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
bbb0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
bbc0: 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20 20  lue *p2 = 0;    
bbd0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65        /* Value e
bbe0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 55  xtracted from pU
bbf0: 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  pper */.  sqlite
bc00: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20  3_value *pVal = 
bc10: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  0;        /* Val
bc20: 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ue extracted fro
bc30: 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70  m record */..  p
bc40: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
bc50: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
bc60: 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45  se, p->azColl[nE
bc70: 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65  q]);.  if( pLowe
bc80: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
bc90: 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46  lite3Stat4ValueF
bca0: 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
bcb0: 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pLower->pExpr->p
bcc0: 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31 29  Right, aff, &p1)
bcd0: 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30  ;.    nLower = 0
bce0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70  ;.  }.  if( pUpp
bcf0: 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
bd00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
bd10: 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75  sqlite3Stat4Valu
bd20: 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
bd30: 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  , pUpper->pExpr-
bd40: 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70  >pRight, aff, &p
bd50: 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20 3d  2);.    nUpper =
bd60: 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61   p2 ? 0 : p->nSa
bd70: 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  mple;.  }..  if(
bd80: 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20   p1 || p2 ){.   
bd90: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
bda0: 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28 69  nDiff;.    for(i
bdb0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
bdc0: 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c  K && i<p->nSampl
bdd0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
bde0: 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
bdf0: 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53  Column(db, p->aS
be00: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61  ample[i].p, p->a
be10: 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71  Sample[i].n, nEq
be20: 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  , &pVal);.      
be30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
be40: 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20  K && p1 ){.     
be50: 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c     int res = sql
be60: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70  ite3MemCompare(p
be70: 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b  1, pVal, pColl);
be80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
be90: 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a  >=0 ) nLower++;.
bea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
beb0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bec0: 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20  && p2 ){.       
bed0: 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74   int res = sqlit
bee0: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c  e3MemCompare(p2,
bef0: 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20   pVal, pColl);. 
bf00: 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d         if( res>=
bf10: 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20  0 ) nUpper++;.  
bf20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bf30: 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72 20  nDiff = (nUpper 
bf40: 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69  - nLower);.    i
bf50: 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44  f( nDiff<=0 ) nD
bf60: 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  iff = 1;..    /*
bf70: 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
bf80: 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c  h an upper and l
bf90: 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63 69  ower bound speci
bfa0: 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a 20  fied, and the . 
bfb0: 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
bfc0: 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
bfd0: 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20 74  they are close t
bfe0: 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74 68 65  ogether, use the
bff0: 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a   fallback.    **
c000: 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65 20   method (assume 
c010: 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 76 69  that the scan vi
c020: 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68 65  sits 1/64 of the
c030: 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69 6d   rows) for estim
c040: 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ating.    ** the
c050: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
c060: 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77 69  visited. Otherwi
c070: 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68 65  se, estimate the
c080: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
c090: 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65      ** using the
c0a0: 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65   method describe
c0b0: 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  d in the header 
c0c0: 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69 73  comment for this
c0d0: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
c0e0: 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20 7c    if( nDiff!=1 |
c0f0: 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70  | pUpper==0 || p
c100: 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Lower==0 ){.    
c110: 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20    int nAdjust = 
c120: 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70  (sqlite3LogEst(p
c130: 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c  ->nSample) - sql
c140: 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66 66  ite3LogEst(nDiff
c150: 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ));.      pLoop-
c160: 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74  >nOut -= nAdjust
c170: 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65 20  ;.      *pbDone 
c180: 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45  = 1;.      WHERE
c190: 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61  TRACE(0x10, ("ra
c1a0: 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72 65  nge skip-scan re
c1b0: 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61  gions: %u..%u  a
c1c0: 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64 5c  djust=%d est=%d\
c1d0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
c1f0: 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e  Lower, nUpper, n
c200: 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70  Adjust*-1, pLoop
c210: 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a  ->nOut));.    }.
c220: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
c230: 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30  sert( *pbDone==0
c240: 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   );.  }..  sqlit
c250: 65 33 56 61 6c 75 65 46 72 65 65 28 70 31 29 3b  e3ValueFree(p1);
c260: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
c270: 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69 74  ree(p2);.  sqlit
c280: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
c290: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
c2a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
c2b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
c2c0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a  _OR_STAT4 */../*
c2d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c2e0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74  n is used to est
c2f0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
c300: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
c310: 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a  ll be visited.**
c320: 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20   by scanning an 
c330: 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67  index for a rang
c340: 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65  e of values. The
c350: 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20   range may have 
c360: 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e  an upper.** boun
c370: 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64  d, a lower bound
c380: 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57  , or both. The W
c390: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
c3a0: 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75  s that set the u
c3b0: 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65  pper.** and lowe
c3c0: 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70  r bounds are rep
c3d0: 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77  resented by pLow
c3e0: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
c3f0: 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a  spectively. For.
c400: 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  ** example, assu
c410: 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20  ming that index 
c420: 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a  p is on t1(a):.*
c430: 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
c440: 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
c450: 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20  ND a < ? ....** 
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f     |_____|   |__
c480: 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___|.**         
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
c4a0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65   pLower    pUppe
c4d0: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  r.**.** If eithe
c4e0: 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f  r of the upper o
c4f0: 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73  r lower bound is
c500: 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68   not present, th
c510: 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65  en NULL is passe
c520: 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66  d in.** place of
c530: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
c540: 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a  ng WhereTerm..**
c550: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e  .** The value in
c560: 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77   (pBuilder->pNew
c570: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69  ->u.btree.nEq) i
c580: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c590: 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c  the index.** col
c5a0: 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74  umn subject to t
c5b0: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
c5c0: 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c  int. Or, equival
c5d0: 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65  ently, the numbe
c5e0: 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79  r of.** equality
c5f0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74   constraints opt
c600: 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72  imized by the pr
c610: 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61  oposed index sca
c620: 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  n. For example,.
c630: 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65  ** assuming inde
c640: 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20  x p is on t1(a, 
c650: 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20  b), and the SQL 
c660: 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
c670: 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
c680: 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20  ERE a = ? AND b 
c690: 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e  > ? AND b < ? ..
c6a0: 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
c6b0: 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73   is set to 1 (as
c6c0: 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72   the range restr
c6d0: 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c  icted column, b,
c6e0: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   is the second .
c6f0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ** left-most col
c700: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
c710: 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75  ). Or, if the qu
c720: 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
c730: 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
c740: 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
c750: 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
c760: 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30   nEq is set to 0
c770: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
c780: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
c790: 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20  lled, *pnOut is 
c7a0: 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  set to the sqlit
c7b0: 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68  e3LogEst() of th
c7c0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
c7d0: 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ows that the ind
c7e0: 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63  ex scan is expec
c7f0: 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74  ted to visit wit
c800: 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  hout .** conside
c810: 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63  ring the range c
c820: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e  onstraints. If n
c830: 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a 70  Eq is 0, then *p
c840: 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d 62  nOut is the numb
c850: 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69  er of .** rows i
c860: 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73  n the index. Ass
c870: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f  uming no error o
c880: 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73  ccurs, *pnOut is
c890: 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63   adjusted (reduc
c8a0: 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e  ed).** to accoun
c8b0: 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20  t for the range 
c8c0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77  constraints pLow
c8d0: 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a  er and pUpper..*
c8e0: 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73  * .** In the abs
c8f0: 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73  ence of sqlite_s
c900: 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74  tat4 ANALYZE dat
c910: 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61  a, or if such da
c920: 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ta cannot be.** 
c930: 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72  used, a single r
c940: 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20  ange inequality 
c950: 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
c960: 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61  ch space by a fa
c970: 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61  ctor of 4. .** a
c980: 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e  nd a pair of con
c990: 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e  straints (x>? AN
c9a0: 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74  D x<?) reduces t
c9b0: 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62  he expected numb
c9c0: 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69  er of.** rows vi
c9d0: 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f  sited by a facto
c9e0: 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74  r of 64..*/.stat
c9f0: 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
ca00: 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  eScanEst(.  Pars
ca10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ca20: 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
ca30: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
ca40: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
ca50: 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
ca60: 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65  ilder,.  WhereTe
ca70: 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
ca80: 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
ca90: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
caa0: 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
cab0: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
cac0: 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
cad0: 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
cae0: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
caf0: 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
cb00: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
cb10: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20  Loop *pLoop     
cb20: 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e  /* Modify the .n
cb30: 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72  Out and maybe .r
cb40: 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b  Run fields */.){
cb50: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cb60: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75  TE_OK;.  int nOu
cb70: 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b  t = pLoop->nOut;
cb80: 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a  .  LogEst nNew;.
cb90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cba0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
cbb0: 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20  TAT4.  Index *p 
cbc0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
cbd0: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
cbe0: 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
cbf0: 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20  ree.nEq;..  if( 
cc00: 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20  p->nSample>0 && 
cc10: 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f  nEq<p->nSampleCo
cc20: 6c 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  l.   && Optimiza
cc30: 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
cc40: 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 53  se->db, SQLITE_S
cc50: 74 61 74 33 34 29 0a 20 20 29 7b 0a 20 20 20 20  tat34).  ){.    
cc60: 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65  if( nEq==pBuilde
cc70: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a  r->nRecValid ){.
cc80: 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65        UnpackedRe
cc90: 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
cca0: 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
ccb0: 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
ccc0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 74 6d 20  .      int nBtm 
ccd0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
cce0: 2e 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74  .nBtm;.      int
ccf0: 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75   nTop = pLoop->u
cd00: 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20  .btree.nTop;..  
cd10: 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20      /* Variable 
cd20: 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73  iLower will be s
cd30: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
cd40: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
cd50: 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20   of rows in .   
cd60: 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20     ** the index 
cd70: 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68  that are less th
cd80: 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  an the lower bou
cd90: 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  nd of the range 
cda0: 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 20  query. The.     
cdb0: 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20   ** lower bound 
cdc0: 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74  being the concat
cdd0: 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e  enation of $P an
cde0: 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69  d $L, where $P i
cdf0: 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b  s the.      ** k
ce00: 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65 64  ey-prefix formed
ce10: 20 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c 75   by the nEq valu
ce20: 65 73 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e  es matched again
ce30: 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74 2d  st the nEq left-
ce40: 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  most.      ** co
ce50: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
ce60: 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68  ex, and $L is th
ce70: 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65  e value in pLowe
ce80: 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
ce90: 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
cea0: 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
ceb0: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
cec0: 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
ced0: 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 2a  cause it.      *
cee0: 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  * is not a simpl
cef0: 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69  e variable or li
cf00: 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68  teral value), th
cf10: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66  e lower bound of
cf20: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61   the.      ** ra
cf30: 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20 74  nge is $P. Due t
cf40: 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65  o a quirk in the
cf50: 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74 61   way whereKeySta
cf60: 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e  ts() works, even
cf70: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c 20  .      ** if $L 
cf80: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68  is available, wh
cf90: 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73  ereKeyStats() is
cfa0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68   called for both
cfb0: 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 20   ($P) and .     
cfc0: 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20   ** ($P:$L) and 
cfd0: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68  the larger of th
cfe0: 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76  e two returned v
cff0: 61 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a 20  alues is used.. 
d000: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
d010: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70   Similarly, iUpp
d020: 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20  er is to be set 
d030: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
d040: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
d050: 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c   rows.      ** l
d060: 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70  ess than the upp
d070: 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20  er bound of the 
d080: 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65  range query. Whe
d090: 72 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  re the upper bou
d0a0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  nd.      ** is e
d0b0: 69 74 68 65 72 20 28 24 50 29 20 6f 72 20 28 24  ither ($P) or ($
d0c0: 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76  P:$U). Again, ev
d0d0: 65 6e 20 69 66 20 24 55 20 69 73 20 61 76 61 69  en if $U is avai
d0e0: 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75  lable, both valu
d0f0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 69  es.      ** of i
d100: 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73  Upper are reques
d110: 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53  ted of whereKeyS
d120: 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73  tats() and the s
d130: 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20  maller used..   
d140: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
d150: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
d160: 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  s between the tw
d170: 6f 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65 6e  o bounds is then
d180: 20 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c 6f   just iUpper-iLo
d190: 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  wer..      */.  
d1a0: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
d1b0: 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20  er;     /* Rows 
d1c0: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f  less than the lo
d1d0: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
d1e0: 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
d1f0: 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c  r;     /* Rows l
d200: 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70  ess than the upp
d210: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
d220: 20 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d 20    int iLwrIdx = 
d230: 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65  -2;   /* aSample
d240: 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 72  [] for the lower
d250: 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
d260: 69 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d 31  int iUprIdx = -1
d270: 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d  ;   /* aSample[]
d280: 20 66 6f 72 20 74 68 65 20 75 70 70 65 72 20 62   for the upper b
d290: 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69  ound */..      i
d2a0: 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20 20  f( pRec ){.     
d2b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 65     testcase( pRe
d2c0: 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c  c->nField!=pBuil
d2d0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29  der->nRecValid )
d2e0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e  ;.        pRec->
d2f0: 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64 65  nField = pBuilde
d300: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20  r->nRecValid;.  
d310: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44      }.      /* D
d320: 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20  etermine iLower 
d330: 61 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67  and iUpper using
d340: 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20   ($P) only. */. 
d350: 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20       if( nEq==0 
d360: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65  ){.        iLowe
d370: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  r = 0;.        i
d380: 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45  Upper = p->nRowE
d390: 73 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st0;.      }else
d3a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  {.        /* Not
d3b0: 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75  e: this call cou
d3c0: 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  ld be optimized 
d3d0: 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65  away - since the
d3e0: 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73   same values mus
d3f0: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  t .        ** ha
d400: 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65  ve been requeste
d410: 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b  d when testing k
d420: 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71  ey $P in whereEq
d430: 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a  ualScanEst().  *
d440: 2f 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b  /.        whereK
d450: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d460: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
d470: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
d480: 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69   a[0];.        i
d490: 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61  Upper = a[0] + a
d4a0: 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  [1];.      }..  
d4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77      assert( pLow
d4c0: 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72  er==0 || (pLower
d4d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
d4e0: 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20  O_GT|WO_GE))!=0 
d4f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d500: 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70   pUpper==0 || (p
d510: 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
d520: 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
d530: 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )!=0 );.      as
d540: 73 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72  sert( p->aSortOr
d550: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
d560: 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65  if( p->aSortOrde
d570: 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20  r[nEq] ){.      
d580: 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f    /* The roles o
d590: 66 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  f pLower and pUp
d5a0: 70 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20  per are swapped 
d5b0: 66 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78  for a DESC index
d5c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50   */.        SWAP
d5d0: 28 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f  (WhereTerm*, pLo
d5e0: 77 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20  wer, pUpper);.  
d5f0: 20 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20        SWAP(int, 
d600: 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20  nBtm, nTop);.   
d610: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
d620: 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
d630: 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
d640: 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
d650: 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
d660: 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
d670: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20  .        int n; 
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74     /* Values ext
d6a0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
d6b0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  r */.        Exp
d6c0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
d6d0: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
d6e0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
d6f0: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
d700: 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
d710: 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
d720: 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29  , nBtm, nEq, &n)
d730: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
d740: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
d750: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52   ){.          tR
d760: 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
d770: 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d        u16 mask =
d780: 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_GT|WO_LE;.  
d790: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
d7a0: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
d7b0: 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73  e(pExpr)>n ) mas
d7c0: 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54  k = (WO_LE|WO_LT
d7d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77  );.          iLw
d7e0: 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53  rIdx = whereKeyS
d7f0: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
d800: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
d810: 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
d820: 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65  0] + ((pLower->e
d830: 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29  Operator & mask)
d840: 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
d850: 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
d860: 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72  >iLower ) iLower
d870: 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
d880: 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
d890: 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b       pLower = 0;
d8a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d8b0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
d8c0: 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
d8d0: 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20  e on the iUpper 
d8e0: 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
d8f0: 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20  $P:$U). */.     
d900: 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
d910: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20         int n;   
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61   /* Values extra
d940: 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20  cted from pExpr 
d950: 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
d960: 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d  *pExpr = pUpper-
d970: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
d980: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d990: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
d9a0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
d9b0: 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
d9c0: 6e 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a  nTop, nEq, &n);.
d9d0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
d9e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29  SQLITE_OK && n )
d9f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77  {.          tRow
da00: 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
da10: 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57      u16 mask = W
da20: 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20  O_GT|WO_LE;.    
da30: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
da40: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
da50: 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20  pExpr)>n ) mask 
da60: 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b  = (WO_LE|WO_LT);
da70: 0a 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49  .          iUprI
da80: 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  dx = whereKeySta
da90: 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
daa0: 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 1, a);.     
dab0: 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
dac0: 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70   + ((pUpper->eOp
dad0: 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f  erator & mask) ?
dae0: 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
daf0: 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69        if( iNew<i
db00: 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d  Upper ) iUpper =
db10: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
db20: 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20   nOut--;.       
db30: 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20     pUpper = 0;. 
db40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
db50: 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  ..      pBuilder
db60: 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
db70: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
db80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
db90: 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f    if( iUpper>iLo
dba0: 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wer ){.         
dbb0: 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c   nNew = sqlite3L
dbc0: 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69  ogEst(iUpper - i
dbd0: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Lower);.        
dbe0: 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66    /* TUNING:  If
dbf0: 20 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64   both iUpper and
dc00: 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69   iLower are deri
dc10: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ved from the sam
dc20: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
dc30: 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75  ample, then assu
dc40: 6d 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d  me they are 4x m
dc50: 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20  ore selective.  
dc60: 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20  This brings.    
dc70: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74        ** the est
dc80: 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69  imated selectivi
dc90: 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20  ty more in line 
dca0: 77 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75  with what it wou
dcb0: 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20  ld be.          
dcc0: 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20  ** if estimated 
dcd0: 77 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20  without the use 
dce0: 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65  of STAT3/4 table
dcf0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
dd00: 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70  if( iLwrIdx==iUp
dd10: 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32  rIdx ) nNew -= 2
dd20: 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d  0;  assert( 20==
dd30: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
dd40: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
dd50: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65  e{.          nNe
dd60: 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61  w = 10;        a
dd70: 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
dd80: 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
dd90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dda0: 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
ddb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  {.          nOut
ddc0: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20   = nNew;.       
ddd0: 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45   }.        WHERE
dde0: 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54  TRACE(0x10, ("ST
ddf0: 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20  AT4 range scan: 
de00: 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e  %u..%u  est=%d\n
de10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
de30: 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
de40: 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
de50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
de60: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f  e{.      int bDo
de70: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ne = 0;.      rc
de80: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69   = whereRangeSki
de90: 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  pScanEst(pParse,
dea0: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c   pLower, pUpper,
deb0: 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b   pLoop, &bDone);
dec0: 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65  .      if( bDone
ded0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
dee0: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
def0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
df00: 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53  (pParse);.  UNUS
df10: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75  ED_PARAMETER(pBu
df20: 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74  ilder);.  assert
df30: 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
df40: 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  er );.#endif.  a
df50: 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30  ssert( pUpper==0
df60: 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46   || (pUpper->wtF
df70: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
df80: 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20  L)==0 );.  nNew 
df90: 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
dfa0: 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29  st(pLower, nOut)
dfb0: 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65  ;.  nNew = where
dfc0: 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70  RangeAdjust(pUpp
dfd0: 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a  er, nNew);..  /*
dfe0: 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
dff0: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
e000: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d  er and lower lim
e010: 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c  it and neither l
e020: 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e  imit.  ** has an
e030: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66   application-def
e040: 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  ined likelihood(
e050: 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61  ), assume the ra
e060: 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75  nge is.  ** redu
e070: 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69  ced by an additi
e080: 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d  onal 75%. This m
e090: 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65  eans that, by de
e0a0: 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65  fault, an open-e
e0b0: 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20  nded.  ** range 
e0c0: 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20  query (e.g. col 
e0d0: 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20  > ?) is assumed 
e0e0: 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20  to match 1/4 of 
e0f0: 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a  the rows in the.
e100: 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c    ** index. Whil
e110: 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65  e a closed range
e120: 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45   (e.g. col BETWE
e130: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65  EN ? AND ?) is e
e140: 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a  stimated to.  **
e150: 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74   match 1/64 of t
e160: 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20  he index. */ .  
e170: 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c  if( pLower && pL
e180: 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  ower->truthProb>
e190: 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70  0 && pUpper && p
e1a0: 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Upper->truthProb
e1b0: 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d  >0 ){.    nNew -
e1c0: 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75  = 20;.  }..  nOu
e1d0: 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29  t -= (pLower!=0)
e1e0: 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a   + (pUpper!=0);.
e1f0: 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20    if( nNew<10 ) 
e200: 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28  nNew = 10;.  if(
e210: 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75   nNew<nOut ) nOu
e220: 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65  t = nNew;.#if de
e230: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
e240: 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20  _ENABLED).  if( 
e250: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  pLoop->nOut>nOut
e260: 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
e270: 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20  CE(0x10,("Range 
e280: 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74  scan lowers nOut
e290: 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e   from %d to %d\n
e2a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
e2b0: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
e2c0: 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a  ut, nOut));.  }.
e2d0: 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e  #endif.  pLoop->
e2e0: 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
e2f0: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Out;.  return rc
e300: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
e310: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e320: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
e330: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
e340: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
e350: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
e360: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
e370: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
e380: 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20  int x=VALUE and 
e390: 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45  where that VALUE
e3a0: 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68   occurs in.** th
e3b0: 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  e histogram data
e3c0: 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  .  This only wor
e3d0: 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65  ks when x is the
e3e0: 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f   left-most.** co
e3f0: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
e400: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
e410: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
e420: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   is available.**
e430: 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e   for that index.
e440: 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55    When pExpr==NU
e450: 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
e460: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a  e constraint is.
e470: 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69  ** "x IS NULL" i
e480: 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c  nstead of "x=VAL
e490: 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  UE"..**.** Write
e4a0: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
e4b0: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
e4c0: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
e4d0: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
e4e0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
e4f0: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
e500: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
e510: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
e520: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
e530: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e540: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
e550: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
e560: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
e570: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
e580: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
e590: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
e5a0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
e5b0: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
e5c0: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
e5d0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
e5e0: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
e5f0: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
e600: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
e610: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
e620: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71  atic int whereEq
e630: 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ualScanEst(.  Pa
e640: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e650: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
e660: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
e670: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
e680: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
e690: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20  Builder,.  Expr 
e6a0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
e6b0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
e6c0: 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78  r VALUE in the x
e6d0: 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e  =VALUE constrain
e6e0: 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  t */.  tRowcnt *
e6f0: 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
e700: 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
e710: 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
e720: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
e730: 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
e740: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
e750: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
e760: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
e770: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
e780: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
e790: 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72  *pRec = pBuilder
e7a0: 2d 3e 70 52 65 63 3b 0a 20 20 69 6e 74 20 72 63  ->pRec;.  int rc
e7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e7c0: 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
e7d0: 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
e7e0: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
e7f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
e800: 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
e810: 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
e820: 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
e830: 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d   assert( nEq<=p-
e840: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
e850: 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
e860: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e870: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
e880: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
e890: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
e8a0: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
e8b0: 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
e8c0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
e8d0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
e8e0: 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
e8f0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
e900: 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
e910: 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
e920: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
e930: 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
e940: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
e950: 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
e960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e970: 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
e980: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
e990: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
e9a0: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
e9b0: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
e9c0: 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
e9d0: 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
e9e0: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
e9f0: 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d  */.  if( nEq>=p-
ea00: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
ea10: 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
ea20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ea30: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
ea40: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
ea50: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
ea60: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
ea70: 20 31 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29   1, nEq-1, &bOk)
ea80: 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  ;.  pBuilder->pR
ea90: 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28  ec = pRec;.  if(
eaa0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
eab0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
eac0: 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( bOk==0 ) retur
ead0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
eae0: 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  D;.  pBuilder->n
eaf0: 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a  RecValid = nEq;.
eb00: 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  .  whereKeyStats
eb10: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
eb20: 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45  , 0, a);.  WHERE
eb30: 54 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75  TRACE(0x10,("equ
eb40: 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f  ality scan regio
eb50: 6e 73 20 25 73 28 25 64 29 3a 20 25 64 5c 6e 22  ns %s(%d): %d\n"
eb60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
eb70: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e       p->zName, n
eb80: 45 71 2d 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29  Eq-1, (int)a[1])
eb90: 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b  );.  *pnRow = a[
eba0: 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  1];.  .  return 
ebb0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
ebc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
ebd0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
ebe0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ebf0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
ec00: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
ec10: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
ec20: 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
ec30: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
ec40: 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63  ed on.** an IN c
ec50: 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20  onstraint where 
ec60: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
ec70: 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
ec80: 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c  erator.** is a l
ec90: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20  ist of values.  
eca0: 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
ecb0: 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
ecc0: 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a   (1,2,3,4).**.**
ecd0: 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
ece0: 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
ecf0: 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
ed00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
ed10: 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
ed20: 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
ed30: 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
ed40: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
ed50: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
ed60: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
ed70: 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
ed80: 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
ed90: 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
eda0: 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
edb0: 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
edc0: 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
edd0: 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
ede0: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
edf0: 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
ee00: 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
ee10: 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
ee20: 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
ee30: 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
ee40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
ee50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ee60: 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20  hereInScanEst(. 
ee70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ee80: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ee90: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
eea0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
eeb0: 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
eec0: 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
eed0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
eee0: 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
eef0: 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20  list on the RHS 
ef00: 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c  of "x IN (v1,v2,
ef10: 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52  v3,...)" */.  tR
ef20: 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
ef30: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
ef40: 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
ef50: 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
ef60: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
ef70: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
ef80: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
ef90: 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74  64 nRow0 = sqlit
efa0: 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d  e3LogEstToInt(p-
efb0: 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29  >aiRowLogEst[0])
efc0: 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69  ;.  int nRecVali
efd0: 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
efe0: 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72  ecValid;.  int r
eff0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
f000: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
f010: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
f020: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b  .  tRowcnt nEst;
f030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f040: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72  mber of rows for
f050: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a   a single term *
f060: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77  /.  tRowcnt nRow
f070: 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  Est = 0;    /* N
f080: 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
f090: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
f0a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f0c0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
f0d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
f0e0: 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
f0f0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
f100: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73  ITE_OK && i<pLis
f110: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
f120: 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30      nEst = nRow0
f130: 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
f140: 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
f150: 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
f160: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
f170: 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52  , &nEst);.    nR
f180: 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20  owEst += nEst;. 
f190: 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
f1a0: 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c  cValid = nRecVal
f1b0: 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  id;.  }..  if( r
f1c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f1d0: 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20      if( nRowEst 
f1e0: 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45 73  > nRow0 ) nRowEs
f1f0: 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a  t = nRow0;.    *
f200: 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
f210: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
f220: 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73  0x10,("IN row es
f230: 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e  timate: est=%d\n
f240: 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20  ", nRowEst));.  
f250: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  }.  assert( pBui
f260: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d  lder->nRecValid=
f270: 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  =nRecValid );.  
f280: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
f290: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
f2a0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
f2b0: 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20  AT4 */...#ifdef 
f2c0: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
f2d0: 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  ED./*.** Print t
f2e0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
f2f0: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
f300: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f310: 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 57  whereTermPrint(W
f320: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
f330: 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20 69   int iTerm){.  i
f340: 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
f350: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
f360: 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33 64  rintf("TERM-%-3d
f370: 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29   NULL\n", iTerm)
f380: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
f390: 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20  har zType[4];.  
f3a0: 20 20 63 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d    char zLeft[50]
f3b0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79  ;.    memcpy(zTy
f3c0: 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20  pe, "...", 4);. 
f3d0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
f3e0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
f3f0: 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20  TUAL ) zType[0] 
f400: 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70  = 'V';.    if( p
f410: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f420: 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54  & WO_EQUIV  ) zT
f430: 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20  ype[1] = 'E';.  
f440: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
f450: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
f460: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
f470: 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c   ) zType[2] = 'L
f480: 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
f490: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f4a0: 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20  _SINGLE ){.     
f4b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f4c0: 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  f(sizeof(zLeft),
f4d0: 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a  zLeft,"left={%d:
f4e0: 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d}",.          
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
f500: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20  rm->leftCursor, 
f510: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
f520: 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  umn);.    }else 
f530: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
f540: 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
f550: 30 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f  0 && pTerm->u.pO
f560: 72 49 6e 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20  rInfo!=0 ){.    
f570: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f580: 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29  tf(sizeof(zLeft)
f590: 2c 7a 4c 65 66 74 2c 22 69 6e 64 65 78 61 62 6c  ,zLeft,"indexabl
f5a0: 65 3d 30 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20  e=0x%lld", .    
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49     pTerm->u.pOrI
f5d0: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b  nfo->indexable);
f5e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f5f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f600: 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29  tf(sizeof(zLeft)
f610: 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 25 64 22  ,zLeft,"left=%d"
f620: 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  , pTerm->leftCur
f630: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sor);.    }.    
f640: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f650: 74 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d  tf(.       "TERM
f660: 2d 25 2d 33 64 20 25 70 20 25 73 20 25 2d 31 32  -%-3d %p %s %-12
f670: 73 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30  s prob=%-3d op=0
f680: 78 25 30 33 78 20 77 74 46 6c 61 67 73 3d 30 78  x%03x wtFlags=0x
f690: 25 30 34 78 22 2c 0a 20 20 20 20 20 20 20 69 54  %04x",.       iT
f6a0: 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70  erm, pTerm, zTyp
f6b0: 65 2c 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d  e, zLeft, pTerm-
f6c0: 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20  >truthProb,.    
f6d0: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
f6e0: 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c  tor, pTerm->wtFl
f6f0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ags);.    if( pT
f700: 65 72 6d 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20  erm->iField ){. 
f710: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
f720: 67 50 72 69 6e 74 66 28 22 20 69 46 69 65 6c 64  gPrintf(" iField
f730: 3d 25 64 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69  =%d\n", pTerm->i
f740: 46 69 65 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73  Field);.    }els
f750: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
f760: 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
f770: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f780: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
f790: 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  (0, pTerm->pExpr
f7a0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 0);.  }.}.#end
f7b0: 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  if..#ifdef WHERE
f7c0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
f7d0: 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d  .** Show the com
f7e0: 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
f7f0: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 0a 2a   a WhereClause.*
f800: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
f810: 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 57  ereClausePrint(W
f820: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
f830: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
f840: 28 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  (i=0; i<pWC->nTe
f850: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68  rm; i++){.    wh
f860: 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26 70 57  ereTermPrint(&pW
f870: 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d  C->a[i], i);.  }
f880: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
f890: 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
f8a0: 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
f8b0: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
f8c0: 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ect for debuggin
f8d0: 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
f8e0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
f8f0: 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f  oopPrint(WhereLo
f900: 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75  op *p, WhereClau
f910: 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72  se *pWC){.  Wher
f920: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
f930: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  pWC->pWInfo;.  i
f940: 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66  nt nb = 1+(pWInf
f950: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
f960: 63 2b 33 29 2f 34 3b 0a 20 20 73 74 72 75 63 74  c+3)/4;.  struct
f970: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
f980: 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
f990: 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e  TabList->a + p->
f9a0: 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iTab;.  Table *p
f9b0: 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
f9c0: 62 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c  b;.  Bitmask mAl
f9d0: 6c 20 3d 20 28 28 28 42 69 74 6d 61 73 6b 29 31  l = (((Bitmask)1
f9e0: 29 3c 3c 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a  )<<(nb*4)) - 1;.
f9f0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
fa00: 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c  intf("%c%2d.%0*l
fa10: 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63  lx.%0*llx", p->c
fa20: 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Id,.            
fa30: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62           p->iTab
fa40: 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c  , nb, p->maskSel
fa50: 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71  f, nb, p->prereq
fa60: 20 26 20 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69   & mAll);.  sqli
fa70: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
fa80: 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20   %12s",.        
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
faa0: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
fab0: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
fac0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
fad0: 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
fae0: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
faf0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  E)==0 ){.    con
fb00: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
fb10: 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72      if( p->u.btr
fb20: 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e  ee.pIndex && (zN
fb30: 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  ame = p->u.btree
fb40: 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21  .pIndex->zName)!
fb50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
fb60: 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22  strncmp(zName, "
fb70: 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
fb80: 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20  _", 17)==0 ){.  
fb90: 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71        int i = sq
fba0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
fbb0: 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  ame) - 1;.      
fbc0: 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69    while( zName[i
fbd0: 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20  ]!='_' ) i--;.  
fbe0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69        zName += i
fbf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fc00: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
fc10: 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c  tf(".%-16s %2d",
fc20: 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72   zName, p->u.btr
fc30: 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c  ee.nEq);.    }el
fc40: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
fc50: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32  3DebugPrintf("%2
fc60: 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20  0s","");.    }. 
fc70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
fc80: 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   *z;.    if( p->
fc90: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b  u.vtab.idxStr ){
fca0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
fcb0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
fcc0: 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20  \"%s\",%x)",.   
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
fce0: 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
fcf0: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c  ->u.vtab.idxStr,
fd00: 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d   p->u.vtab.omitM
fd10: 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ask);.    }else{
fd20: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
fd30: 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
fd40: 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  %x)", p->u.vtab.
fd50: 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61  idxNum, p->u.vta
fd60: 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20  b.omitMask);.   
fd70: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
fd80: 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39  bugPrintf(" %-19
fd90: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  s", z);.    sqli
fda0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d  te3_free(z);.  }
fdb0: 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
fdc0: 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
fdd0: 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  AN ){.    sqlite
fde0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66  3DebugPrintf(" f
fdf0: 20 25 30 35 78 20 25 64 2d 25 64 22 2c 20 70 2d   %05x %d-%d", p-
fe00: 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
fe10: 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20  erm,p->nSkip);. 
fe20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
fe30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
fe40: 20 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70   f %05x N %d", p
fe50: 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c  ->wsFlags, p->nL
fe60: 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Term);.  }.  sql
fe70: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fe80: 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c  " cost %d,%d,%d\
fe90: 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70  n", p->rSetup, p
fea0: 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29  ->rRun, p->nOut)
feb0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72  ;.  if( p->nLTer
fec0: 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65  m && (sqlite3Whe
fed0: 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29  reTrace & 0x100)
fee0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
fef0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
ff00: 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29  <p->nLTerm; i++)
ff10: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72  {.      whereTer
ff20: 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d  mPrint(p->aLTerm
ff30: 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  [i], i);.    }. 
ff40: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
ff50: 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20  ** Convert bulk 
ff60: 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61  memory into a va
ff70: 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  lid WhereLoop th
ff80: 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64  at can be passed
ff90: 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70  .** to whereLoop
ffa0: 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79  Clear harmlessly
ffb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ffc0: 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57   whereLoopInit(W
ffd0: 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
ffe0: 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61  p->aLTerm = p->a
fff0: 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d  LTermSpace;.  p-
10000 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
10010 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79  ->nLSlot = Array
10020 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70  Size(p->aLTermSp
10030 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61  ace);.  p->wsFla
10040 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gs = 0;.}../*.**
10050 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65   Clear the Where
10060 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c  Loop.u union.  L
10070 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70  eave WhereLoop.p
10080 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f  LTerm intact..*/
10090 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
100a0 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
100b0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
100c0 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
100d0 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
100e0 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  (WHERE_VIRTUALTA
100f0 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49  BLE|WHERE_AUTO_I
10100 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28  NDEX) ){.    if(
10110 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
10120 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
10130 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74  E)!=0 && p->u.vt
10140 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
10150 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
10160 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  e(p->u.vtab.idxS
10170 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  tr);.      p->u.
10180 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
10190 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  0;.      p->u.vt
101a0 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  ab.idxStr = 0;. 
101b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
101c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
101d0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
101e0 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  && p->u.btree.pI
101f0 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  ndex!=0 ){.     
10200 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10210 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
10220 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ndex->zColAff);.
10230 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
10240 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62  reeNN(db, p->u.b
10250 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20  tree.pIndex);.  
10260 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
10270 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
10280 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
10290 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61  allocate interna
102a0 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
102b0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
102c0 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
102d0 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
102e0 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  r(sqlite3 *db, W
102f0 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
10300 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70  if( p->aLTerm!=p
10310 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20  ->aLTermSpace ) 
10320 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
10330 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
10340 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
10350 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20  Union(db, p);.  
10360 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
10370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
10380 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ase the memory a
10390 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c  llocation for pL
103a0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f  oop->aLTerm[] to
103b0 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a   be at least n..
103c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
103d0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71  ereLoopResize(sq
103e0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
103f0 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  Loop *p, int n){
10400 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70  .  WhereTerm **p
10410 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  aNew;.  if( p->n
10420 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72  LSlot>=n ) retur
10430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e  n SQLITE_OK;.  n
10440 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70   = (n+7)&~7;.  p
10450 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
10460 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
10470 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
10480 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
10490 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
104a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
104b0 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e  PT;.  memcpy(paN
104c0 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73  ew, p->aLTerm, s
104d0 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
104e0 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a  0])*p->nLSlot);.
104f0 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
10500 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
10510 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e  ) sqlite3DbFreeN
10520 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  N(db, p->aLTerm)
10530 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
10540 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
10550 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
10560 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10570 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
10580 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
10590 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
105a0 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
105b0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
105c0 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
105d0 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
105e0 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
105f0 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
10600 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
10610 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
10620 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
10630 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
10640 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
10650 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
10660 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
10670 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10680 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
10690 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c   }.  memcpy(pTo,
106a0 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f   pFrom, WHERE_LO
106b0 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d  OP_XFER_SZ);.  m
106c0 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72  emcpy(pTo->aLTer
106d0 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d  m, pFrom->aLTerm
106e0 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69  , pTo->nLTerm*si
106f0 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  zeof(pTo->aLTerm
10700 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72  [0]));.  if( pFr
10710 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
10720 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
10730 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
10740 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
10750 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
10760 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20  (pFrom->wsFlags 
10770 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
10780 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46  EX)!=0 ){.    pF
10790 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  rom->u.btree.pIn
107a0 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  dex = 0;.  }.  r
107b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
107c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
107d0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
107e0 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
107f0 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  id whereLoopDele
10800 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
10810 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
10820 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
10830 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
10840 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
10850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
10860 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
10870 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
10880 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
10890 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
108a0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
108b0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  o){.  int i;.  a
108c0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 21 3d 30  ssert( pWInfo!=0
108d0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
108e0 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
108f0 20 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65   i++){.    Where
10900 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
10910 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
10920 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
10930 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65 76 65 6c  WLoop && (pLevel
10940 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
10950 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
10960 45 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  E) ){.      sqli
10970 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
10980 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
10990 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  op);.    }.  }. 
109a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
109b0 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
109c0 2d 3e 73 57 43 29 3b 0a 20 20 77 68 69 6c 65 28  ->sWC);.  while(
109d0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
109e0 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  ){.    WhereLoop
109f0 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c   *p = pWInfo->pL
10a00 6f 6f 70 73 3b 0a 20 20 20 20 70 57 49 6e 66 6f  oops;.    pWInfo
10a10 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
10a20 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  extLoop;.    whe
10a30 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
10a40 20 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   p);.  }.  sqlit
10a50 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
10a60 57 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  WInfo);.}../*.**
10a70 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10a80 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
10a90 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
10aa0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61  *.**   (1)  X ha
10ab0 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
10ac0 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a  wer cost that Y.
10ad0 2a 2a 20 20 20 28 32 29 20 20 58 20 75 73 65 73  **   (2)  X uses
10ae0 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61   fewer WHERE cla
10af0 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59  use terms than Y
10b00 0a 2a 2a 20 20 20 28 33 29 20 20 45 76 65 72 79  .**   (3)  Every
10b10 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
10b20 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20  rm used by X is 
10b30 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 0a 2a  also used by Y.*
10b40 2a 20 20 20 28 34 29 20 20 58 20 73 6b 69 70 73  *   (4)  X skips
10b50 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e   at least as man
10b60 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a  y columns as Y.*
10b70 2a 20 20 20 28 35 29 20 20 49 66 20 58 20 69 73  *   (5)  If X is
10b80 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
10b90 78 2c 20 74 68 61 6e 20 59 20 69 73 20 74 6f 6f  x, than Y is too
10ba0 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e  .**.** Condition
10bb0 73 20 28 32 29 20 61 6e 64 20 28 33 29 20 6d 65  s (2) and (3) me
10bc0 61 6e 20 74 68 61 74 20 58 20 69 73 20 61 20 22  an that X is a "
10bd0 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 6f  proper subset" o
10be0 66 20 59 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20  f Y..** If X is 
10bf0 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
10c00 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61  of Y then Y is a
10c10 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61   better choice a
10c20 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68  nd ought.** to h
10c30 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
10c40 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
10c50 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65  returns TRUE whe
10c60 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20  n that cost .** 
10c70 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20  relationship is 
10c80 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65  inverted and nee
10c90 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ds to be adjuste
10ca0 64 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20 28  d.  Constraint (
10cb0 34 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20  4).** was added 
10cc0 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73 65  because if X use
10cd0 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73  s skip-scan less
10ce0 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c   than Y it still
10cf0 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76   might.** deserv
10d00 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65  e a lower cost e
10d10 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70  ven if it is a p
10d20 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
10d30 59 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20 28  Y.  Constraint (
10d40 35 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20  5).** was added 
10d50 62 65 63 61 75 73 65 20 61 20 63 6f 76 65 72 69  because a coveri
10d60 6e 67 20 69 6e 64 65 78 20 70 72 6f 62 61 62 6c  ng index probabl
10d70 79 20 64 65 73 65 72 76 65 73 20 74 6f 20 68 61  y deserves to ha
10d80 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 0a  ve a lower cost.
10d90 2a 2a 20 74 68 61 6e 20 61 20 6e 6f 6e 2d 63 6f  ** than a non-co
10da0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 65 76 65  vering index eve
10db0 6e 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f  n if it is a pro
10dc0 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2f 0a 73  per subset..*/.s
10dd0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
10de0 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
10df0 53 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20  Subset(.  const 
10e00 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20  WhereLoop *pX,  
10e10 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68       /* First Wh
10e20 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61  ereLoop to compa
10e30 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68  re */.  const Wh
10e40 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20  ereLoop *pY     
10e50 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67     /* Compare ag
10e60 61 69 6e 73 74 20 74 68 69 73 20 57 68 65 72 65  ainst this Where
10e70 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Loop */.){.  int
10e80 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d   i, j;.  if( pX-
10e90 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69  >nLTerm-pX->nSki
10ea0 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d  p >= pY->nLTerm-
10eb0 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20  pY->nSkip ){.   
10ec0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20   return 0; /* X 
10ed0 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20  is not a subset 
10ee0 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  of Y */.  }.  if
10ef0 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58  ( pY->nSkip > pX
10f00 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e  ->nSkip ) return
10f10 20 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52   0;.  if( pX->rR
10f20 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29  un >= pY->rRun )
10f30 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52  {.    if( pX->rR
10f40 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20  un > pY->rRun ) 
10f50 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
10f60 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61  X costs more tha
10f70 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  n Y */.    if( p
10f80 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f  X->nOut > pY->nO
10f90 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ut ) return 0;  
10fa0 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72    /* X costs mor
10fb0 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a  e than Y */.  }.
10fc0 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65    for(i=pX->nLTe
10fd0 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
10fe0 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c  {.    if( pX->aL
10ff0 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Term[i]==0 ) con
11000 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a  tinue;.    for(j
11010 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  =pY->nLTerm-1; j
11020 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
11030 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b   if( pY->aLTerm[
11040 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69  j]==pX->aLTerm[i
11050 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ] ) break;.    }
11060 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72  .    if( j<0 ) r
11070 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e  eturn 0;  /* X n
11080 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
11090 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d   since term X[i]
110a0 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a   not used by Y *
110b0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 58 2d  /.  }.  if( (pX-
110c0 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 49  >wsFlags&WHERE_I
110d0 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20  DX_ONLY)!=0 .   
110e0 26 26 20 28 70 59 2d 3e 77 73 46 6c 61 67 73 26  && (pY->wsFlags&
110f0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
11100 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
11110 20 30 3b 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69   0;  /* Constrai
11120 6e 74 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  nt (5) */.  }.  
11130 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c  return 1;  /* Al
11140 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65  l conditions mee
11150 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  t */.}../*.** Tr
11160 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  y to adjust the 
11170 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  cost of WhereLoo
11180 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61  p pTemplate upwa
11190 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73  rds or downwards
111a0 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a   so.** that:.**.
111b0 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61  **   (1) pTempla
111c0 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68  te costs less th
111d0 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65  an any other Whe
111e0 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65  reLoops that are
111f0 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20   a proper.**    
11200 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65     subset of pTe
11210 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28  mplate.**.**   (
11220 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  2) pTemplate cos
11230 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79  ts more than any
11240 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
11250 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d  s for which pTem
11260 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69  plate.**       i
11270 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
11280 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20  t..**.** To say 
11290 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20  "WhereLoop X is 
112a0 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
112b0 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74  of Y" means that
112c0 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a   X uses fewer.**
112d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
112e0 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74  rms than Y and t
112f0 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20  hat every WHERE 
11300 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64  clause term used
11310 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f   by X is.** also
11320 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73   used by Y..*/.s
11330 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
11340 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63  LoopAdjustCost(c
11350 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
11360 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  p, WhereLoop *pT
11370 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20  emplate){.  if( 
11380 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
11390 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
113a0 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  XED)==0 ) return
113b0 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70  ;.  for(; p; p=p
113c0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
113d0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
113e0 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29  Template->iTab )
113f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
11400 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
11410 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
11420 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
11430 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
11440 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
11450 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65  set(p, pTemplate
11460 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
11470 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
11480 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20  ost downward so 
11490 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70  that it is cheap
114a0 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20  er than its .   
114b0 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20     ** subset p. 
114c0 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  */.      WHERETR
114d0 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65  ACE(0x80,("subse
114e0 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e  t cost adjustmen
114f0 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64  t %d,%d to %d,%d
11500 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
11510 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
11520 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65  plate->rRun, pTe
11530 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d  mplate->nOut, p-
11540 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31  >rRun, p->nOut-1
11550 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  ));.      pTempl
11560 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72  ate->rRun = p->r
11570 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  Run;.      pTemp
11580 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e  late->nOut = p->
11590 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65  nOut - 1;.    }e
115a0 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  lse if( whereLoo
115b0 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
115c0 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  bset(pTemplate, 
115d0 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  p) ){.      /* A
115e0 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
115f0 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74  cost upward so t
11600 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69  hat it is costli
11610 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a  er than p since.
11620 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61        ** pTempla
11630 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  te is a proper s
11640 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20  ubset of p */.  
11650 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
11660 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
11670 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
11680 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116a0 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
116b0 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
116c0 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
116d0 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20  , p->nOut+1));. 
116e0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
116f0 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
11700 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
11710 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
11720 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  + 1;.    }.  }.}
11730 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
11740 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
11750 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76  Loops in *ppPrev
11760 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65   looking for one
11770 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20   that can be.** 
11780 72 65 70 6c 61 63 65 64 20 62 79 20 70 54 65 6d  replaced by pTem
11790 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  plate..**.** Ret
117a0 75 72 6e 20 4e 55 4c 4c 20 69 66 20 70 54 65 6d  urn NULL if pTem
117b0 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62  plate does not b
117c0 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 57 68 65  elong on the Whe
117d0 72 65 4c 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a 20  reLoop list..** 
117e0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69  In other words i
117f0 66 20 70 54 65 6d 70 6c 61 74 65 20 6f 75 67 68  f pTemplate ough
11800 74 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 20  t to be dropped 
11810 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e  from further con
11820 73 69 64 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  sideration..**.*
11830 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65  * If pX is a Whe
11840 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d  reLoop that pTem
11850 70 6c 61 74 65 20 63 61 6e 20 72 65 70 6c 61 63  plate can replac
11860 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  e, then return t
11870 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20  he.** link that 
11880 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a  points to pX..**
11890 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65  .** If pTemplate
118a0 20 63 61 6e 6e 6f 74 20 72 65 70 6c 61 63 65 20   cannot replace 
118b0 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65  any existing ele
118c0 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74  ment of the list
118d0 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f   but needs.** to
118e0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
118f0 20 6c 69 73 74 20 61 73 20 61 20 6e 65 77 20 65   list as a new e
11900 6e 74 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  ntry, then retur
11910 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
11920 68 65 0a 2a 2a 20 74 61 69 6c 20 6f 66 20 74 68  he.** tail of th
11930 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
11940 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68  c WhereLoop **wh
11950 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
11960 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  r(.  WhereLoop *
11970 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74  *ppPrev,.  const
11980 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
11990 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65  plate.){.  Where
119a0 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Loop *p;.  for(p
119b0 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70  =(*ppPrev); p; p
119c0 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c  pPrev=&p->pNextL
119d0 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b  oop, p=*ppPrev){
119e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
119f0 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
11a00 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78  b || p->iSortIdx
11a10 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f  !=pTemplate->iSo
11a20 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  rtIdx ){.      /
11a30 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
11a40 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78  iTab or iSortIdx
11a50 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20   values for two 
11a60 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69  WhereLoop are di
11a70 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  fferent.      **
11a80 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72   then those Wher
11a90 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62  eLoops need to b
11aa0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70  e considered sep
11ab0 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65  arately.  Neithe
11ac0 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  r is.      ** a 
11ad0 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70  candidate to rep
11ae0 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20  lace the other. 
11af0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
11b00 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  e;.    }.    /* 
11b10 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
11b20 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74  mplementation, t
11b30 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20  he rSetup value 
11b40 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20  is either zero. 
11b50 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73     ** or the cos
11b60 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e  t of building an
11b70 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
11b80 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65   (NlogN) and the
11b90 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73   NlogN.    ** is
11ba0 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f   the same for co
11bb0 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f  mpatible WhereLo
11bc0 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ops. */.    asse
11bd0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30  rt( p->rSetup==0
11be0 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
11bf0 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20  Setup==0 .      
11c00 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
11c10 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
11c20 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
11c30 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41     /* whereLoopA
11c40 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73  ddBtree() always
11c50 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69   generates and i
11c60 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d  nserts the autom
11c70 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a  atic index.    *
11c80 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48  * case first.  H
11c90 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  ence compatible 
11ca0 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c  candidate WhereL
11cb0 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20  oops never have 
11cc0 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20  a larger.    ** 
11cd0 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69  rSetup. Call thi
11ce0 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  s SETUP-INVARIAN
11cf0 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  T */.    assert(
11d00 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
11d10 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
11d20 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f  ..    /* Any loo
11d30 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69  p using an appli
11d40 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e  ation-defined in
11d50 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20  dex (or PRIMARY 
11d60 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e  KEY or.    ** UN
11d70 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29  IQUE constraint)
11d80 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72   with one or mor
11d90 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
11da0 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
11db0 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61  * than an automa
11dc0 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73  tic index. Unles
11dd0 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73  s it is a skip-s
11de0 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
11df0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
11e00 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
11e10 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
11e20 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30  plate->nSkip)==0
11e30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
11e40 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
11e50 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
11e60 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
11e70 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
11e80 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21  HERE_COLUMN_EQ)!
11e90 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70  =0.     && (p->p
11ea0 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
11eb0 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
11ec0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
11ed0 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
11ee0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11ef0 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  If existing Wher
11f00 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65  eLoop p is bette
11f10 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
11f20 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  , pTemplate can 
11f30 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72  be.    ** discar
11f40 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20  ded.  WhereLoop 
11f50 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a  p is better if:.
11f60 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20      **   (1)  p 
11f70 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
11f80 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54  ndencies than pT
11f90 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20  emplate, and.   
11fa0 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73   **   (2)  p has
11fb0 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
11fc0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65  er cost than pTe
11fd0 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20  mplate.    */.  
11fe0 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
11ff0 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
12000 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
12010 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20      /* (1)  */. 
12020 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
12030 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
12040 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20  tup             
12050 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a       /* (2a) */.
12060 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c       && p->rRun<
12070 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
120a0 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
120b0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  <=pTemplate->nOu
120c0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
120d0 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a         /* (2c) *
120e0 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  /.    ){.      r
120f0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73  eturn 0;  /* Dis
12100 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a  card pTemplate *
12110 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
12120 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  If pTemplate is 
12130 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68  always better th
12140 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65  an p, then cause
12150 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69   p to be overwri
12160 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68  tten.    ** with
12170 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65   pTemplate.  pTe
12180 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
12190 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20   than p if:.    
121a0 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c  **   (1)  pTempl
121b0 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20  ate has no more 
121c0 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e  dependences than
121d0 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20   p, and.    **  
121e0 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (2)  pTemplate 
121f0 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20  has an equal or 
12200 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
12210 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
12220 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
12230 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
12240 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
12250 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a  ereq   /* (1)  *
12260 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
12270 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
12280 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
122a0 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
122b0 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70  & p->nOut>=pTemp
122c0 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122e0 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
122f0 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  /.    ){.      a
12300 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
12310 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
12320 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d  tup ); /* SETUP-
12330 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
12340 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  */.      break; 
12350 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20    /* Cause p to 
12360 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
12370 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
12380 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12390 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a  n ppPrev;.}../*.
123a0 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70  ** Insert or rep
123b0 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lace a WhereLoop
123c0 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
123d0 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69   template suppli
123e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ed..**.** An exi
123f0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
12400 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f  entry might be o
12410 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
12420 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a  e new template.*
12430 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20  * is better and 
12440 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64  has fewer depend
12450 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20  encies.  Or the 
12460 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65  template will be
12470 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20   ignored.** and 
12480 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f  no insert will o
12490 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74  ccur if an exist
124a0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
124b0 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a   faster and has.
124c0 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  ** fewer depende
124d0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74  ncies than the t
124e0 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77  emplate.  Otherw
124f0 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ise a new WhereL
12500 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  oop is.** added 
12510 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d  based on the tem
12520 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  plate..**.** If 
12530 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
12540 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
12550 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20  n we care about 
12560 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
12570 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
12580 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
12590 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
125a0 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
125b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
125c0 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
125d0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
125e0 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
125f0 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
12600 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
12610 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
12620 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
12630 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
12640 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
12650 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
12660 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
12670 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
12680 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
12690 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
126a0 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
126b0 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
126c0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73   new template is
126d0 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
126e0 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
126f0 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
12700 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
12710 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
12720 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
12730 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
12740 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
12750 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
12760 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
12770 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
12780 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
12790 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
127a0 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
127b0 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
127c0 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
127d0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
127e0 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
127f0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
12800 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
12810 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
12820 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
12830 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
12840 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
12850 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
12860 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68  ppPrev, *p;.  Wh
12870 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
12880 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
12890 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
128a0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
128b0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63  se->db;.  int rc
128c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
128d0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64  der->pOrSet is d
128e0 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c  efined, then onl
128f0 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  y keep track of 
12900 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61  the costs.  ** a
12910 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f  nd prereqs..  */
12920 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
12930 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20 20  >pOrSet!=0 ){.  
12940 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65 2d    if( pTemplate-
12950 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20 57  >nLTerm ){.#if W
12960 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
12970 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d 20  D.      u16 n = 
12980 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
12990 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  ->n;.      int x
129a0 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   =.#endif.      
129b0 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42  whereOrInsert(pB
129c0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20  uilder->pOrSet, 
129d0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
129e0 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  q, pTemplate->rR
129f0 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  un,.            
12a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a10 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
12a20 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48  e->nOut);.#if WH
12a30 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
12a40 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
12a50 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
12a60 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
12a70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
12a80 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
12a90 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
12aa0 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
12ab0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
12ac0 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
12ad0 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
12ae0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
12af0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
12b00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
12b10 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20   /* Look for an 
12b20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
12b30 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69  op to replace wi
12b40 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a  th pTemplate.  *
12b50 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a  /.  whereLoopAdj
12b60 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e  ustCost(pWInfo->
12b70 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
12b80 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77  e);.  ppPrev = w
12b90 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
12ba0 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  er(&pWInfo->pLoo
12bb0 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  ps, pTemplate);.
12bc0 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30  .  if( ppPrev==0
12bd0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
12be0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
12bf0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74  a WhereLoop on t
12c00 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  he list that is 
12c10 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
12c20 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f  an pTemplate, so
12c30 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65   just ignore pTe
12c40 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48  mplate */.#if WH
12c50 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
12c60 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69   /* 0x8 */.    i
12c70 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
12c80 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
12c90 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
12ca0 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70 3a  Printf("   skip:
12cb0 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
12cc0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
12cd0 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
12ce0 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
12cf0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
12d00 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73  ITE_OK;  .  }els
12d10 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72  e{.    p = *ppPr
12d20 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ev;.  }..  /* If
12d30 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
12d40 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
12d50 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
12d60 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
12d70 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
12d80 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
12d90 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
12da0 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
12db0 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
12dc0 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
12dd0 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
12de0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12df0 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
12e00 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
12e10 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
12e20 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
12e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
12e40 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61 63  ugPrintf("replac
12e50 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  e: ");.      whe
12e60 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70  reLoopPrint(p, p
12e70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
12e80 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
12e90 67 50 72 69 6e 74 66 28 22 20 20 20 77 69 74 68  gPrintf("   with
12ea0 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : ");.    }else{
12eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
12ec0 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 20 61  bugPrintf("    a
12ed0 64 64 3a 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  dd: ");.    }.  
12ee0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
12ef0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12f00 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
12f10 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
12f20 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  0 ){.    /* Allo
12f30 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
12f40 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74  Loop to add to t
12f50 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
12f60 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65  st */.    *ppPre
12f70 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44  v = p = sqlite3D
12f80 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
12f90 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
12fa0 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
12fb0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
12fc0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
12fd0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
12fe0 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  p);.    p->pNext
12ff0 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Loop = 0;.  }els
13000 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c  e{.    /* We wil
13010 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67  l be overwriting
13020 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20   WhereLoop p[]. 
13030 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20 64   But before we d
13040 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  o, first.    ** 
13050 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  go through the r
13060 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  est of the list 
13070 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f  and delete any o
13080 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65 73  ther entries bes
13090 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20  ides.    ** p[] 
130a0 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75  that are also su
130b0 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70  pplated by pTemp
130c0 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72  late */.    Wher
130d0 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d  eLoop **ppTail =
130e0 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a   &p->pNextLoop;.
130f0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
13100 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65  ToDel;.    while
13110 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20  ( *ppTail ){.   
13120 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72     ppTail = wher
13130 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
13140 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74  ppTail, pTemplat
13150 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70  e);.      if( pp
13160 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Tail==0 ) break;
13170 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20  .      pToDel = 
13180 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69  *ppTail;.      i
13190 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62  f( pToDel==0 ) b
131a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54  reak;.      *ppT
131b0 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e  ail = pToDel->pN
131c0 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45  extLoop;.#if WHE
131d0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
131e0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
131f0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
13200 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
13210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
13220 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65  bugPrintf(" dele
13230 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  te: ");.        
13240 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
13250 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d  ToDel, pBuilder-
13260 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
13270 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72  endif.      wher
13280 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
13290 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  pToDel);.    }. 
132a0 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c   }.  rc = whereL
132b0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
132c0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
132d0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
132e0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
132f0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
13300 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
13310 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
13320 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
13330 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
13340 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
13350 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
13360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
13370 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13380 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
13390 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
133a0 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
133b0 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
133c0 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
133d0 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
133e0 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
133f0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
13400 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
13410 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65  ndex..*.** For e
13420 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
13430 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
13440 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
13450 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
13460 68 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72  h has a truth pr
13470 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e  obability assign
13480 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  ed by one of the
13490 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a   likelihood(),.*
134a0 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75  * likely(), or u
134b0 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75  nlikely() SQL fu
134c0 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20  nctions, reduce 
134d0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
134e0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75  mber.** of outpu
134f0 74 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72  t rows by the pr
13500 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66  obability specif
13510 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e  ied..**.** TUNIN
13520 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48  G:  For every WH
13530 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
13540 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64  that is not used
13550 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   by the index.**
13560 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20   and which does 
13570 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69  not have an assi
13580 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61  gned truth proba
13590 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69  bility, heuristi
135a0 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  cs.** described 
135b0 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74  below are used t
135c0 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
135d0 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
135e0 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f  ability..** TODO
135f0 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69   --> Perhaps thi
13600 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  s is something t
13610 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70  hat could be imp
13620 72 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a  roved by better.
13630 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74  ** table statist
13640 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69  ics..**.** Heuri
13650 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74  stic 1:  Estimat
13660 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
13670 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35  ability as 93.75
13680 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a  %.  The 93.75%.*
13690 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f  * value correspo
136a0 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67  nds to -1 in Log
136b0 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f  Est notation, so
136c0 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72   this means decr
136d0 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65  ement.** the Whe
136e0 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c  reLoop.nOut fiel
136f0 64 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68  d for every such
13700 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
13710 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  rm..**.** Heuris
13720 74 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65  tic 2:  If there
13730 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d   exists one or m
13740 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
13750 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
13760 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20   form "x==EXPR" 
13770 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20  and EXPR is not 
13780 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20  a constant 0 or 
13790 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  1, then make sur
137a0 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f  e the.** final o
137b0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
137c0 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72  te is no greater
137d0 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65   than 1/4 of the
137e0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a   total number.**
137f0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
13800 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
13810 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74   words, assume t
13820 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c  hat x==EXPR will
13830 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61   filter.** out a
13840 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66  t least 3 out of
13850 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50   4 rows.  If EXP
13860 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20  R is -1 or 0 or 
13870 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68  1, then maybe th
13880 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20  e.** "x" column 
13890 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c  is boolean or el
138a0 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20  se -1 or 0 or 1 
138b0 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61  is a common defa
138c0 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20  ult value.** on 
138d0 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61  the "x" column a
138e0 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  nd so in that ca
138f0 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20  se only cap the 
13900 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d  output row estim
13910 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e  ate.** at 1/2 in
13920 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f  stead of 1/4..*/
13930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
13940 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
13950 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  st(.  WhereClaus
13960 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20  e *pWC,      /* 
13970 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
13980 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
13990 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20  *pLoop,      /* 
139a0 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75  The loop to adju
139b0 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20  st downward */. 
139c0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20   LogEst nRow    
139d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
139e0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
139f0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f   entire table */
13a00 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
13a10 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42  *pTerm, *pX;.  B
13a20 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65  itmask notAllowe
13a30 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65  d = ~(pLoop->pre
13a40 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  req|pLoop->maskS
13a50 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  elf);.  int i, j
13a60 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52  , k;.  LogEst iR
13a70 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a  educe = 0;    /*
13a80 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f   pLoop->nOut sho
13a90 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e  uld not exceed n
13aa0 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a  Row-iReduce */..
13ab0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
13ac0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
13ad0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
13ae0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   );.  for(i=pWC-
13af0 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57  >nTerm, pTerm=pW
13b00 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  C->a; i>0; i--, 
13b10 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
13b20 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
13b30 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
13b40 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
13b50 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
13b60 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
13b70 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20  >maskSelf)==0 ) 
13b80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
13b90 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
13ba0 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64  All & notAllowed
13bb0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
13bc0 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70  .    for(j=pLoop
13bd0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
13be0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58  ; j--){.      pX
13bf0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
13c00 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
13c10 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==0 ) continue;
13c20 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
13c30 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13c40 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72      if( pX->iPar
13c50 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d  ent>=0 && (&pWC-
13c60 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29  >a[pX->iParent])
13c70 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
13c80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
13c90 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
13ca0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
13cb0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  <=0 ){.        /
13cc0 2a 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f  * If a truth pro
13cd0 62 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63  bability is spec
13ce0 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  ified using the 
13cf0 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e  likelihood() hin
13d00 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts,.        ** t
13d10 68 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62  hen use the prob
13d20 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64  ability provided
13d30 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
13d40 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
13d50 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70  pLoop->nOut += p
13d60 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
13d70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13d80 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20        /* In the 
13d90 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69  absence of expli
13da0 63 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62  cit truth probab
13db0 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75  ilities, use heu
13dc0 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20  ristics to.     
13dd0 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65     ** guess a re
13de0 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70  asonable truth p
13df0 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20  robability. */. 
13e00 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
13e10 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66  ut--;.        if
13e20 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13e30 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
13e40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
13e50 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
13e60 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
13e70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
13e80 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
13e90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
13ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
13eb0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
13ec0 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29  eger(pRight, &k)
13ed0 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b   && k>=(-1) && k
13ee0 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <=1 ){.         
13ef0 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20     k = 10;.     
13f00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13f10 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a          k = 20;.
13f20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13f30 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63        if( iReduc
13f40 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20  e<k ) iReduce = 
13f50 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
13f60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
13f70 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74   if( pLoop->nOut
13f80 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20   > nRow-iReduce 
13f90 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d  )  pLoop->nOut =
13fa0 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b   nRow - iReduce;
13fb0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20  .}../* .** Term 
13fc0 70 54 65 72 6d 20 69 73 20 61 20 76 65 63 74 6f  pTerm is a vecto
13fd0 72 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73  r range comparis
13fe0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  on operation. Th
13ff0 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73  e first comparis
14000 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65 63  on.** in the vec
14010 74 6f 72 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  tor can be optim
14020 69 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d  ized using colum
14030 6e 20 6e 45 71 20 6f 66 20 74 68 65 20 69 6e 64  n nEq of the ind
14040 65 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ex. This.** func
14050 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
14060 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
14070 20 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73   vector elements
14080 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
14090 64 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  d.** as part of 
140a0 74 68 65 20 72 61 6e 67 65 20 63 6f 6d 70 61 72  the range compar
140b0 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ison..**.** For 
140c0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
140d0 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
140e0 20 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e    WHERE a = ? AN
140f0 44 20 28 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f  D (b, c, d) > (?
14100 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e  , ?, ?).**.** an
14110 64 20 74 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a  d the index:.**.
14120 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
14130 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20  X ... ON (a, b, 
14140 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74  c, d, e).**.** t
14150 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
14160 6e 20 77 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b  n would be invok
14170 65 64 20 77 69 74 68 20 6e 45 71 3d 31 2e 20 54  ed with nEq=1. T
14180 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
14190 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73  d in.** this cas
141a0 65 20 69 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69  e is 3..*/.stati
141b0 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
141c0 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72  VectorLen(.  Par
141d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
141e0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
141f0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  text */.  int iC
14200 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur,            /
14210 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
14220 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
14230 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
14240 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
14250 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 69 6e  be used for a in
14260 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
14270 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  int */.  int nEq
14280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
14290 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72   Number of prior
142a0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
142b0 61 69 6e 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e  aints on same in
142c0 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
142d0 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a  rm *pTerm     /*
142e0 20 54 68 65 20 76 65 63 74 6f 72 20 69 6e 65 71   The vector ineq
142f0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
14300 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  t */.){.  int nC
14310 6d 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  mp = sqlite3Expr
14320 56 65 63 74 6f 72 53 69 7a 65 28 70 54 65 72 6d  VectorSize(pTerm
14330 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
14340 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d  .  int i;..  nCm
14350 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70  p = MIN(nCmp, (p
14360 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e  Idx->nColumn - n
14370 45 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Eq));.  for(i=1;
14380 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20   i<nCmp; i++){. 
14390 20 20 20 2f 2a 20 54 65 73 74 20 69 66 20 63 6f     /* Test if co
143a0 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66 20 70 54  mparison i of pT
143b0 65 72 6d 20 69 73 20 63 6f 6d 70 61 74 69 62 6c  erm is compatibl
143c0 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69  e with column (i
143d0 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66  +nEq) .    ** of
143e0 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20 6e   the index. If n
143f0 6f 74 2c 20 65 78 69 74 20 74 68 65 20 6c 6f 6f  ot, exit the loo
14400 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  p.  */.    char 
14410 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
14420 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
14430 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20  arison affinity 
14440 2a 2f 0a 20 20 20 20 63 68 61 72 20 69 64 78 61  */.    char idxa
14450 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
14460 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64 20       /* Indexed 
14470 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
14480 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
14490 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
144a0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
144b0 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  son collation se
144c0 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78  quence */.    Ex
144d0 70 72 20 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d  pr *pLhs = pTerm
144e0 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  ->pExpr->pLeft->
144f0 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
14500 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
14510 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  Rhs = pTerm->pEx
14520 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
14530 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
14540 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
14550 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70  {.      pRhs = p
14560 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  Rhs->x.pSelect->
14570 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
14580 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
14590 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73       pRhs = pRhs
145a0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
145b0 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  pExpr;.    }..  
145c0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
145d0 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 63  the LHS of the c
145e0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63  omparison is a c
145f0 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20  olumn reference 
14600 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  to.    ** the ri
14610 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ght column of th
14620 65 20 72 69 67 68 74 20 73 6f 75 72 63 65 20 74  e right source t
14630 61 62 6c 65 2e 20 41 6e 64 20 74 68 61 74 20 74  able. And that t
14640 68 65 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f  he sort.    ** o
14650 72 64 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  rder of the inde
14660 78 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  x column is the 
14670 73 61 6d 65 20 61 73 20 74 68 65 20 73 6f 72 74  same as the sort
14680 20 6f 72 64 65 72 20 6f 66 20 74 68 65 0a 20 20   order of the.  
14690 20 20 2a 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e    ** leftmost in
146a0 64 65 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a  dex column.  */.
146b0 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70      if( pLhs->op
146c0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20  !=TK_COLUMN .   
146d0 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c    || pLhs->iTabl
146e0 65 21 3d 69 43 75 72 20 0a 20 20 20 20 20 7c 7c  e!=iCur .     ||
146f0 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d   pLhs->iColumn!=
14700 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
14710 2b 6e 45 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70  +nEq] .     || p
14720 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
14730 69 2b 6e 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53  i+nEq]!=pIdx->aS
14740 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20  ortOrder[nEq].  
14750 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
14760 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
14770 74 63 61 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f  tcase( pLhs->iCo
14780 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29  lumn==XN_ROWID )
14790 3b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  ;.    aff = sqli
147a0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
147b0 74 79 28 70 52 68 73 2c 20 73 71 6c 69 74 65 33  ty(pRhs, sqlite3
147c0 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 68  ExprAffinity(pLh
147d0 73 29 29 3b 0a 20 20 20 20 69 64 78 61 66 66 20  s));.    idxaff 
147e0 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f  = sqlite3TableCo
147f0 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 49 64  lumnAffinity(pId
14800 78 2d 3e 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d  x->pTable, pLhs-
14810 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69  >iColumn);.    i
14820 66 28 20 61 66 66 21 3d 69 64 78 61 66 66 20 29  f( aff!=idxaff )
14830 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f   break;..    pCo
14840 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
14850 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
14860 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70  (pParse, pLhs, p
14870 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Rhs);.    if( pC
14880 6f 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  oll==0 ) break;.
14890 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
148a0 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
148b0 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
148c0 6c 5b 69 2b 6e 45 71 5d 29 20 29 20 62 72 65 61  l[i+nEq]) ) brea
148d0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
148e0 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  i;.}../*.** Adju
148f0 73 74 20 74 68 65 20 63 6f 73 74 20 43 20 62 79  st the cost C by
14900 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61   the costMult fa
14910 63 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e  cter T.  This on
14920 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20  ly occurs if.** 
14930 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44  compiled with -D
14940 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
14950 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66  STMULT.*/.#ifdef
14960 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
14970 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65  OSTMULT.# define
14980 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
14990 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20  lier(C,T)  C += 
149a0 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  T.#else.# define
149b0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
149c0 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66  lier(C,T).#endif
149d0 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20  ../*.** We have 
149e0 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70  so far matched p
149f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
14a00 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73  .btree.nEq terms
14a10 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65   of the .** inde
14a20 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f  x pIndex. Try to
14a30 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e   match one more.
14a40 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
14a50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
14a60 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  led, pBuilder->p
14a70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69  New->nOut contai
14a80 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65  ns the .** numbe
14a90 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74  r of rows expect
14aa0 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64  ed to be visited
14ab0 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73   by filtering us
14ac0 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20  ing the nEq .** 
14ad0 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69  terms only. If i
14ae0 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74  t is modified, t
14af0 68 69 73 20 76 61 6c 75 65 20 69 73 20 72 65 73  his value is res
14b00 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68 69  tored before thi
14b10 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
14b20 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  eturns..**.** If
14b30 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30   pProbe->tnum==0
14b40 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e  , that means pIn
14b50 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e  dex is a fake in
14b60 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65  dex used for the
14b70 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
14b80 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74  ARY KEY..*/.stat
14b90 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
14ba0 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20  AddBtreeIndex(. 
14bb0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
14bc0 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20  r *pBuilder,    
14bd0 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
14be0 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73  p factory */.  s
14bf0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
14c00 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f  em *pSrc,      /
14c10 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
14c20 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
14c30 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
14c40 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20  robe,           
14c50 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
14c60 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20  ex on pSrc */.  
14c70 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20  LogEst nInMul   
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66  /* log(Number of
14ca0 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20   iterations due 
14cb0 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57  to IN) */.){.  W
14cc0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
14cd0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
14ce0 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61  nfo;  /* WHERE a
14cf0 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a  nalyse context *
14d00 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
14d10 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
14d20 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se;        /* Pa
14d30 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
14d40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
14d50 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
14d60 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
14d70 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63  onnection malloc
14d80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
14d90 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14db0 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
14dc0 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  oop under constr
14dd0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  uction */.  Wher
14de0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
14df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
14e00 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72   WhereTerm under
14e10 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
14e20 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20  /.  int opMask; 
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e40 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65      /* Valid ope
14e50 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74  rators for const
14e60 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72  raints */.  Wher
14e70 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20  eScan scan;     
14e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14e90 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52  terator for WHER
14ea0 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  E terms */.  Bit
14eb0 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65  mask saved_prere
14ec0 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  q;           /* 
14ed0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
14ee0 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a  f pNew->prereq *
14ef0 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c  /.  u16 saved_nL
14f00 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
14f10 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14f20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
14f30 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73  LTerm */.  u16 s
14f40 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20  aved_nEq;       
14f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
14f60 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
14f70 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
14f80 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  q */.  u16 saved
14f90 5f 6e 42 74 6d 3b 20 20 20 20 20 20 20 20 20 20  _nBtm;          
14fa0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
14fb0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
14fc0 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 2a  ->u.btree.nBtm *
14fd0 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 54  /.  u16 saved_nT
14fe0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
14ff0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
15000 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
15010 2e 62 74 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a 20  .btree.nTop */. 
15020 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70   u16 saved_nSkip
15030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15040 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
15050 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69  ue of pNew->nSki
15060 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64  p */.  u32 saved
15070 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  _wsFlags;       
15080 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
15090 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
150a0 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c  ->wsFlags */.  L
150b0 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  ogEst saved_nOut
150c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
150d0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
150e0 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a   of pNew->nOut *
150f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
15100 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
15110 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
15120 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  de */.  LogEst r
15130 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
15140 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15150 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
15160 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45   table */.  LogE
15170 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
15180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15190 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c  ogarithm of tabl
151a0 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72  e size */.  Wher
151b0 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c  eTerm *pTop = 0,
151c0 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54   *pBtm = 0; /* T
151d0 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61  op and bottom ra
151e0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
151f0 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  */..  pNew = pBu
15200 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69  ilder->pNew;.  i
15210 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
15220 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
15230 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
15240 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
15250 30 30 2c 20 28 22 42 45 47 49 4e 20 25 73 2e 61  00, ("BEGIN %s.a
15260 64 64 42 74 72 65 65 49 64 78 28 25 73 29 2c 20  ddBtreeIdx(%s), 
15270 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  nEq=%d\n",.     
15280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15290 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e  pProbe->pTable->
152a0 7a 4e 61 6d 65 2c 70 50 72 6f 62 65 2d 3e 7a 4e  zName,pProbe->zN
152b0 61 6d 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72  ame, pNew->u.btr
152c0 65 65 2e 6e 45 71 29 29 3b 0a 0a 20 20 61 73 73  ee.nEq));..  ass
152d0 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
152e0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
152f0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
15300 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
15310 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
15320 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29  _TOP_LIMIT)==0 )
15330 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73  ;.  if( pNew->ws
15340 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
15350 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f  M_LIMIT ){.    o
15360 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f  pMask = WO_LT|WO
15370 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _LE;.  }else{.  
15380 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
15390 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20  u.btree.nBtm==0 
153a0 29 3b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  );.    opMask = 
153b0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47  WO_EQ|WO_IN|WO_G
153c0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
153d0 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _LE|WO_ISNULL|WO
153e0 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _IS;.  }.  if( p
153f0 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
15400 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28  d ) opMask &= ~(
15410 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
15420 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73  T|WO_LE);..  ass
15430 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72  ert( pNew->u.btr
15440 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  ee.nEq<pProbe->n
15450 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76  Column );..  sav
15460 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75  ed_nEq = pNew->u
15470 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61  .btree.nEq;.  sa
15480 76 65 64 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d  ved_nBtm = pNew-
15490 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20  >u.btree.nBtm;. 
154a0 20 73 61 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e   saved_nTop = pN
154b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70  ew->u.btree.nTop
154c0 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20  ;.  saved_nSkip 
154d0 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20  = pNew->nSkip;. 
154e0 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20   saved_nLTerm = 
154f0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20  pNew->nLTerm;.  
15500 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20  saved_wsFlags = 
15510 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  pNew->wsFlags;. 
15520 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20   saved_prereq = 
15530 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20  pNew->prereq;.  
15540 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65  saved_nOut = pNe
15550 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d  w->nOut;.  pTerm
15560 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74   = whereScanInit
15570 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72  (&scan, pBuilder
15580 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75  ->pWC, pSrc->iCu
15590 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c  rsor, saved_nEq,
155a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
155b0 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c           opMask,
155c0 20 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77   pProbe);.  pNew
155d0 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
155e0 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
155f0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
15600 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
15610 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f  Log(rSize);.  fo
15620 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
15630 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
15640 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
15650 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
15660 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72    u16 eOp = pTer
15670 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  m->eOperator;   
15680 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72  /* Shorthand for
15690 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
156a0 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20  r */.    LogEst 
156b0 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f  rCostIdx;.    Lo
156c0 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73  gEst nOutUnadjus
156d0 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  ted;        /* n
156e0 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20  Out before IN() 
156f0 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74  and WHERE adjust
15700 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
15710 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
15720 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
15730 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
15740 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
15750 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
15760 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
15770 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49    if( (eOp==WO_I
15780 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
15790 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
157a0 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
157b0 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e   indexColumnNotN
157c0 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65  ull(pProbe, save
157d0 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  d_nEq).    ){.  
157e0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
157f0 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d   ignore IS [NOT]
15800 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
15810 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  s on NOT NULL co
15820 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
15830 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
15840 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
15850 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
15860 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44  tinue;..    /* D
15870 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
15880 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61  upper bound of a
15890 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
158a0 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  on range constra
158b0 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69  int.    ** to mi
158c0 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72  x with a lower r
158d0 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20  ange bound from 
158e0 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63  some other sourc
158f0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65  e */.    if( pTe
15900 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
15910 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54  RM_LIKEOPT && pT
15920 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
15930 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65  WO_LT ) continue
15940 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ;..    /* Do not
15950 20 61 6c 6c 6f 77 20 63 6f 6e 73 74 72 61 69 6e   allow constrain
15960 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45 52  ts from the WHER
15970 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75  E clause to be u
15980 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  sed by the.    *
15990 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  * right table of
159a0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f   a LEFT JOIN.  O
159b0 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nly constraints 
159c0 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
159d0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f   are.    ** allo
159e0 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  wed */.    if( (
159f0 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  pSrc->fg.jointyp
15a00 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a  e & JT_LEFT)!=0.
15a10 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
15a20 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
15a30 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
15a40 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  in).    ){.     
15a50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
15a60 0a 0a 20 20 20 20 69 66 28 20 49 73 55 6e 69 71  ..    if( IsUniq
15a70 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29 20  ueIndex(pProbe) 
15a80 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50  && saved_nEq==pP
15a90 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20  robe->nKeyCol-1 
15aa0 29 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65  ){.      pBuilde
15ab0 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53  r->bldFlags |= S
15ac0 51 4c 49 54 45 5f 42 4c 44 46 5f 55 4e 49 51 55  QLITE_BLDF_UNIQU
15ad0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
15ae0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c      pBuilder->bl
15af0 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  dFlags |= SQLITE
15b00 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44 3b 0a 20  _BLDF_INDEXED;. 
15b10 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 77     }.    pNew->w
15b20 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
15b30 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77  sFlags;.    pNew
15b40 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
15b50 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
15b60 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
15b70 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a  m = saved_nBtm;.
15b80 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
15b90 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e  e.nTop = saved_n
15ba0 54 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  Top;.    pNew->n
15bb0 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
15bc0 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68  Term;.    if( wh
15bd0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
15be0 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
15bf0 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b  Term+1) ) break;
15c00 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70   /* OOM */.    p
15c10 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
15c20 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54  ->nLTerm++] = pT
15c30 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  erm;.    pNew->p
15c40 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70  rereq = (saved_p
15c50 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70  rereq | pTerm->p
15c60 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70  rereqRight) & ~p
15c70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a  New->maskSelf;..
15c80 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d      assert( nInM
15c90 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c  ul==0.        ||
15ca0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
15cb0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  & WHERE_COLUMN_N
15cc0 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20  ULL)!=0 .       
15cd0 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
15ce0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
15cf0 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20  N_IN)!=0 .      
15d00 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
15d10 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50  ags & WHERE_SKIP
15d20 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b  SCAN)!=0 .    );
15d30 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20  ..    if( eOp & 
15d40 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  WO_IN ){.      E
15d50 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
15d60 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
15d70 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
15d80 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
15d90 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
15da0 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
15db0 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
15dc0 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
15dd0 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
15de0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
15df0 69 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  i;.        nIn =
15e00 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
15e10 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
15e20 32 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  25) );..        
15e30 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
15e40 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  n may actually b
15e50 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 78  e of the form (x
15e60 2c 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54 2e  , y) IN (SELECT.
15e70 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ..)..        ** 
15e80 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
15e90 72 65 20 69 73 20 61 20 73 65 70 61 72 61 74 65  re is a separate
15ea0 20 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20 6f   term for each o
15eb0 66 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a 20  f (x) and (y).. 
15ec0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
15ed0 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74 69  r, the nIn multi
15ee0 70 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e 6c  plier should onl
15ef0 79 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e 63  y be applied onc
15f00 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20 20  e, not once.    
15f10 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20      ** for each 
15f20 73 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20 66  such term. The f
15f30 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 68  ollowing loop ch
15f40 65 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d 20  ecks that pTerm 
15f50 69 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  is the.        *
15f60 2a 20 66 69 72 73 74 20 73 75 63 68 20 74 65 72  * first such ter
15f70 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73 65  m in use, and se
15f80 74 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20 30  ts nIn back to 0
15f90 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a   if it is not. *
15fa0 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
15fb0 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72  0; i<pNew->nLTer
15fc0 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  m-1; i++){.     
15fd0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61       if( pNew->a
15fe0 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65 77  LTerm[i] && pNew
15ff0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78  ->aLTerm[i]->pEx
16000 70 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e 20  pr==pExpr ) nIn 
16010 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
16020 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
16030 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
16040 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
16050 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
16060 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
16070 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
16080 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
16090 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33     nIn = sqlite3
160a0 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e  LogEst(pExpr->x.
160b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
160c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
160d0 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20  In>0 );  /* RHS 
160e0 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20  always has 2 or 
160f0 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54  more terms...  T
16100 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20  he parser.      
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22      ** changes "
16130 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22  x IN (?)" into "
16140 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  x=?". */.      }
16150 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62  .      if( pProb
16160 65 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a 20  e->hasStat1 ){. 
16170 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 4d 2c         LogEst M,
16180 20 6c 6f 67 4b 2c 20 73 61 66 65 74 79 4d 61 72   logK, safetyMar
16190 67 69 6e 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  gin;.        /* 
161a0 4c 65 74 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  Let:.        ** 
161b0 20 20 4e 20 3d 20 74 68 65 20 74 6f 74 61 6c 20    N = the total 
161c0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
161d0 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  n the table.    
161e0 20 20 20 20 2a 2a 20 20 20 4b 20 3d 20 74 68 65      **   K = the
161f0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
16200 65 73 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  es on the RHS of
16210 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16220 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 4d 20  .        **   M 
16230 3d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  = the number of 
16240 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
16250 65 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  e that match ter
16260 6d 73 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20  ms to the .     
16270 20 20 20 2a 2a 20 20 20 20 20 20 20 74 6f 20 74     **       to t
16280 68 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 73  he left in the s
16290 61 6d 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74  ame index.  If t
162a0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
162b0 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s on.        ** 
162c0 20 20 20 20 20 20 74 68 65 20 6c 65 66 74 2d 6d        the left-m
162d0 6f 73 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  ost index column
162e0 2c 20 4d 3d 3d 4e 2e 0a 20 20 20 20 20 20 20 20  , M==N..        
162f0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 69  **.        ** Gi
16300 76 65 6e 20 74 68 65 20 64 65 66 69 6e 69 74 69  ven the definiti
16310 6f 6e 73 20 61 62 6f 76 65 2c 20 69 74 20 69 73  ons above, it is
16320 20 62 65 74 74 65 72 20 74 6f 20 6f 6d 69 74 20   better to omit 
16330 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
16340 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20          ** from 
16350 74 68 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  the index lookup
16360 20 61 6e 64 20 69 6e 73 74 65 61 64 20 64 6f 20   and instead do 
16370 61 20 73 63 61 6e 20 6f 66 20 74 68 65 20 4d 20  a scan of the M 
16380 65 6c 65 6d 65 6e 74 73 2c 0a 20 20 20 20 20 20  elements,.      
16390 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 65 61 63    ** testing eac
163a0 68 20 73 63 61 6e 6e 65 64 20 72 6f 77 20 61 67  h scanned row ag
163b0 61 69 6e 73 74 20 74 68 65 20 49 4e 20 6f 70 65  ainst the IN ope
163c0 72 61 74 6f 72 20 73 65 70 61 72 61 74 65 6c 79  rator separately
163d0 2c 20 69 66 3a 0a 20 20 20 20 20 20 20 20 2a 2a  , if:.        **
163e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
163f0 20 20 20 4d 2a 6c 6f 67 28 4b 29 20 3c 20 4b 2a     M*log(K) < K*
16400 6c 6f 67 28 4e 29 0a 20 20 20 20 20 20 20 20 2a  log(N).        *
16410 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 75 72  *.        ** Our
16420 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 4d   estimates for M
16430 2c 20 4b 2c 20 61 6e 64 20 4e 20 6d 69 67 68 74  , K, and N might
16440 20 62 65 20 69 6e 61 63 63 75 72 61 74 65 2c 20   be inaccurate, 
16450 73 6f 20 77 65 20 62 75 69 6c 64 20 69 6e 0a 20  so we build in. 
16460 20 20 20 20 20 20 20 2a 2a 20 61 20 73 61 66 65         ** a safe
16470 74 79 20 6d 61 72 67 69 6e 20 6f 66 20 32 20 28  ty margin of 2 (
16480 4c 6f 67 45 73 74 3a 20 31 30 29 20 74 68 61 74  LogEst: 10) that
16490 20 66 61 76 6f 72 73 20 75 73 69 6e 67 20 74 68   favors using th
164a0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20  e IN operator.  
164b0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
164c0 65 20 69 6e 64 65 78 2c 20 61 73 20 75 73 69 6e  e index, as usin
164d0 67 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20 62  g an index has b
164e0 65 74 74 65 72 20 77 6f 72 73 74 2d 63 61 73 65  etter worst-case
164f0 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 20   behavior..     
16500 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e     ** If we do n
16510 6f 74 20 68 61 76 65 20 72 65 61 6c 20 73 71 6c  ot have real sql
16520 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 2c 20  ite_stat1 data, 
16530 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 74 6f  always prefer to
16540 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
16550 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
16560 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 20     */.        M 
16570 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
16580 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d  ogEst[saved_nEq]
16590 3b 0a 20 20 20 20 20 20 20 20 6c 6f 67 4b 20 3d  ;.        logK =
165a0 20 65 73 74 4c 6f 67 28 6e 49 6e 29 3b 0a 20 20   estLog(nIn);.  
165b0 20 20 20 20 20 20 73 61 66 65 74 79 4d 61 72 67        safetyMarg
165c0 69 6e 20 3d 20 31 30 3b 20 20 2f 2a 20 54 55 4e  in = 10;  /* TUN
165d0 49 4e 47 3a 20 65 78 74 72 61 20 77 65 69 67 68  ING: extra weigh
165e0 74 20 66 6f 72 20 69 6e 64 65 78 65 64 20 49 4e  t for indexed IN
165f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
16600 4d 20 2b 20 6c 6f 67 4b 20 2b 20 73 61 66 65 74  M + logK + safet
16610 79 4d 61 72 67 69 6e 20 3c 20 6e 49 6e 20 2b 20  yMargin < nIn + 
16620 72 4c 6f 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  rLogSize ){.    
16630 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
16640 28 30 78 34 30 2c 0a 20 20 20 20 20 20 20 20 20  (0x40,.         
16650 20 20 20 28 22 53 63 61 6e 20 70 72 65 66 65 72     ("Scan prefer
16660 72 65 64 20 6f 76 65 72 20 49 4e 20 6f 70 65 72  red over IN oper
16670 61 74 6f 72 20 6f 6e 20 63 6f 6c 75 6d 6e 20 25  ator on column %
16680 64 20 6f 66 20 5c 22 25 73 5c 22 20 28 25 64 3c  d of \"%s\" (%d<
16690 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %d)\n",.        
166a0 20 20 20 20 20 73 61 76 65 64 5f 6e 45 71 2c 20       saved_nEq, 
166b0 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 4d  pProbe->zName, M
166c0 2b 6c 6f 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72 4c  +logK+10, nIn+rL
166d0 6f 67 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  ogSize));.      
166e0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
166f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16700 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
16710 45 28 30 78 34 30 2c 0a 20 20 20 20 20 20 20 20  E(0x40,.        
16720 20 20 20 20 28 22 49 4e 20 6f 70 65 72 61 74 6f      ("IN operato
16730 72 20 70 72 65 66 65 72 72 65 64 20 6f 6e 20 63  r preferred on c
16740 6f 6c 75 6d 6e 20 25 64 20 6f 66 20 5c 22 25 73  olumn %d of \"%s
16750 5c 22 20 28 25 64 3e 3d 25 64 29 5c 6e 22 2c 0a  \" (%d>=%d)\n",.
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76               sav
16770 65 64 5f 6e 45 71 2c 20 70 50 72 6f 62 65 2d 3e  ed_nEq, pProbe->
16780 7a 4e 61 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31 30  zName, M+logK+10
16790 2c 20 6e 49 6e 2b 72 4c 6f 67 53 69 7a 65 29 29  , nIn+rLogSize))
167a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
167b0 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
167c0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
167d0 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
167e0 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
167f0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
16800 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
16810 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
16820 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20  mn[saved_nEq];. 
16830 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
16840 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
16850 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73 73  MN_EQ;.      ass
16860 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d  ert( saved_nEq==
16870 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
16880 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  q );.      if( i
16890 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a 20  Col==XN_ROWID . 
168a0 20 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e 3d        || (iCol>=
168b0 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26  0 && nInMul==0 &
168c0 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72  & saved_nEq==pPr
168d0 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a  obe->nKeyCol-1).
168e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
168f0 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f   if( iCol==XN_RO
16900 57 49 44 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 75  WID || pProbe->u
16910 6e 69 71 4e 6f 74 4e 75 6c 6c 20 0a 20 20 20 20  niqNotNull .    
16920 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d       || (pProbe-
16930 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70  >nKeyCol==1 && p
16940 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 20 26  Probe->onError &
16950 26 20 65 4f 70 3d 3d 57 4f 5f 45 51 29 20 0a 20  & eOp==WO_EQ) . 
16960 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
16970 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
16980 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f  s |= WHERE_ONERO
16990 57 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  W;.        }else
169a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
169b0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
169c0 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20  RE_UNQ_WANTED;. 
169d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
169e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
169f0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
16a00 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
16a10 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
16a20 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
16a30 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
16a40 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b  (WO_GT|WO_GE) ){
16a50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16a60 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a   eOp & WO_GT );.
16a70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16a80 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  eOp & WO_GE );. 
16a90 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
16aa0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
16ab0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42  MN_RANGE|WHERE_B
16ac0 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
16ad0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
16ae0 74 6d 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56  tm = whereRangeV
16af0 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20  ectorLen(.      
16b00 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63      pParse, pSrc
16b10 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62  ->iCursor, pProb
16b20 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54  e, saved_nEq, pT
16b30 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  erm.      );.   
16b40 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
16b50 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
16b60 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
16b70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
16b80 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20  _LIKEOPT ){.    
16b90 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e      /* Range con
16ba0 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d  traints that com
16bb0 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20  e from the LIKE 
16bc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65  optimization are
16bd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
16be0 79 73 20 75 73 65 64 20 69 6e 20 70 61 69 72 73  ys used in pairs
16bf0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  . */.        pTo
16c00 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20  p = &pTerm[1];. 
16c10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
16c20 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43  pTop-(pTerm->pWC
16c30 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43  ->a))<pTerm->pWC
16c40 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  ->nTerm );.     
16c50 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
16c60 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
16c70 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20  LIKEOPT );.     
16c80 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
16c90 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
16ca0 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
16cb0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
16cc0 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
16cd0 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
16ce0 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
16cf0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
16d00 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
16d10 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20  +] = pTop;.     
16d20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
16d30 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
16d40 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MIT;.        pNe
16d50 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
16d60 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
16d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
16d80 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f  sert( eOp & (WO_
16d90 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20  LT|WO_LE) );.   
16da0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
16db0 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20   & WO_LT );.    
16dc0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
16dd0 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  & WO_LE );.     
16de0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
16df0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
16e00 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  ANGE|WHERE_TOP_L
16e10 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77  IMIT;.      pNew
16e20 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
16e30 20 77 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f   whereRangeVecto
16e40 72 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  rLen(.          
16e50 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43  pParse, pSrc->iC
16e60 75 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73  ursor, pProbe, s
16e70 61 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a  aved_nEq, pTerm.
16e80 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70        );.      p
16e90 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
16ea0 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
16eb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
16ec0 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
16ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16ee0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
16ef0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
16f00 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  2] : 0;.    }.. 
16f10 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
16f20 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69  int pNew->nOut i
16f30 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
16f40 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
16f50 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  cted to.    ** b
16f60 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  e visited by the
16f70 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f   index scan befo
16f80 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  re considering t
16f90 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68  erm pTerm, or th
16fa0 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
16fb0 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75  of nIn and nInMu
16fc0 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
16fd0 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
16fe0 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20   all .    ** "x 
16ff0 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61  IN(...)" terms a
17000 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
17010 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62   "x = ?". This b
17020 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20  lock updates.   
17030 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
17040 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61   pNew->nOut to a
17050 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d  ccount for pTerm
17060 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49   (but not nIn/nI
17070 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61  nMul).  */.    a
17080 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
17090 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
170a0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
170b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
170c0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
170d0 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
170e0 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f  Out using stat3/
170f0 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
17100 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
17110 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20  tat3/stat4.     
17120 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20   ** data, using 
17130 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d  some other estim
17140 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  ate.  */.      w
17150 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
17160 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
17170 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
17180 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
17190 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
171a0 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   ++pNew->u.btree
171b0 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65  .nEq;.      asse
171c0 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53  rt( eOp & (WO_IS
171d0 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e  NULL|WO_EQ|WO_IN
171e0 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20  |WO_IS) );..    
171f0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
17200 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
17210 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
17220 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
17230 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43  0 && pProbe->aiC
17240 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d  olumn[saved_nEq]
17250 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  >=0 ){.        a
17260 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f  ssert( (eOp & WO
17270 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29  _IN) || nIn==0 )
17280 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17290 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20  se( eOp & WO_IN 
172a0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
172b0 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
172c0 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
172d0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
172e0 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73   nIn;.      }els
172f0 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
17300 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
17310 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74  _STAT4.        t
17320 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
17330 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e  .        if( nIn
17340 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  Mul==0 .        
17350 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d   && pProbe->nSam
17360 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26  ple .         &&
17370 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
17380 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d  Eq<=pProbe->nSam
17390 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20  pleCol.         
173a0 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e  && ((eOp & WO_IN
173b0 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73  )==0 || !ExprHas
173c0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
173d0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
173e0 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 20 26  ect)).         &
173f0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
17400 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
17410 5f 53 74 61 74 33 34 29 0a 20 20 20 20 20 20 20  _Stat34).       
17420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
17430 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
17440 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
17450 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20 28      if( (eOp & (
17460 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_EQ|WO_ISNULL|
17470 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20 20  WO_IS))!=0 ){.  
17480 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
17490 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20  se( eOp & WO_EQ 
174a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
174b0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
174c0 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IS );.        
174d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
174e0 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  p & WO_ISNULL );
174f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17500 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
17510 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
17520 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69  lder, pExpr->pRi
17530 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ght, &nOut);.   
17540 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
17550 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
17560 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
17570 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
17580 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
17590 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &nOut);.        
175a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
175b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
175c0 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c  FOUND ) rc = SQL
175d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
175e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
175f0 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20 20  _OK ) break;    
17600 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75        /* Jump ou
17610 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20 6c  t of the pTerm l
17620 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oop */.         
17630 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20   if( nOut ){.   
17640 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
17650 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Out = sqlite3Log
17660 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20  Est(nOut);.     
17670 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
17680 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74  >nOut>saved_nOut
17690 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20   ) pNew->nOut = 
176a0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
176b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
176c0 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20  ut -= nIn;.     
176d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
176e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75  .        if( nOu
176f0 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20 20  t==0 ).#endif.  
17700 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
17710 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
17720 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f  (pProbe->aiRowLo
17730 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f  gEst[nEq] - pPro
17740 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
17750 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20  nEq-1]);.       
17760 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f     if( eOp & WO_
17770 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
17780 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
17790 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
177a0 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c  likelihood() val
177b0 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ue, assume that 
177c0 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  a .            *
177d0 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20  * "col IS NULL" 
177e0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68  expression match
177f0 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e 79  es twice as many
17800 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20 20   rows .         
17810 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29     ** as (col=?)
17820 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
17830 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31   pNew->nOut += 1
17840 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
17850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17860 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
17870 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20 74  et rCostIdx to t
17880 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
17890 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f 77  ing selected row
178a0 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a  s in index. Add.
178b0 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65      ** it to pNe
178c0 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20 69  w->rRun, which i
178d0 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
178e0 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  to the cost of t
178f0 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  he index.    ** 
17900 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c  seek only. Then,
17910 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f   if this is a no
17920 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
17930 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f  , add the cost o
17940 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69 6e  f.    ** visitin
17950 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68  g the rows in th
17960 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a  e main table.  *
17970 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20 3d  /.    rCostIdx =
17980 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20   pNew->nOut + 1 
17990 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a  + (15*pProbe->sz
179a0 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54  IdxRow)/pSrc->pT
179b0 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20  ab->szTabRow;.  
179c0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
179d0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
179e0 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74 49  rLogSize, rCostI
179f0 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e  dx);.    if( (pN
17a00 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  ew->wsFlags & (W
17a10 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
17a20 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a  ERE_IPK))==0 ){.
17a30 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
17a40 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
17a50 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  Add(pNew->rRun, 
17a60 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29  pNew->nOut + 16)
17a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70 6c  ;.    }.    Appl
17a80 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
17a90 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f  pNew->rRun, pPro
17aa0 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74  be->pTable->cost
17ab0 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74  Mult);..    nOut
17ac0 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e 65  Unadjusted = pNe
17ad0 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65  w->nOut;.    pNe
17ae0 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75  w->rRun += nInMu
17af0 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65  l + nIn;.    pNe
17b00 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75  w->nOut += nInMu
17b10 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65  l + nIn;.    whe
17b20 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
17b30 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  st(pBuilder->pWC
17b40 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a  , pNew, rSize);.
17b50 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
17b60 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
17b70 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69  r, pNew);..    i
17b80 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
17b90 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
17ba0 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 70  RANGE ){.      p
17bb0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
17bc0 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  d_nOut;.    }els
17bd0 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  e{.      pNew->n
17be0 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75  Out = nOutUnadju
17bf0 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  sted;.    }..   
17c00 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
17c10 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
17c20 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26  LIMIT)==0.     &
17c30 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
17c40 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
17c50 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  umn.    ){.     
17c60 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
17c70 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
17c80 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
17c90 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20  nInMul+nIn);.   
17ca0 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75   }.    pNew->nOu
17cb0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
17cc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17cd0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
17ce0 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72  AT4.    pBuilder
17cf0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
17d00 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
17d10 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72    }.  pNew->prer
17d20 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72 65  eq = saved_prere
17d30 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  q;.  pNew->u.btr
17d40 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
17d50 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  Eq;.  pNew->u.bt
17d60 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64  ree.nBtm = saved
17d70 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75  _nBtm;.  pNew->u
17d80 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61  .btree.nTop = sa
17d90 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65 77  ved_nTop;.  pNew
17da0 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f  ->nSkip = saved_
17db0 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77  nSkip;.  pNew->w
17dc0 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
17dd0 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  sFlags;.  pNew->
17de0 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
17df0 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  t;.  pNew->nLTer
17e00 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  m = saved_nLTerm
17e10 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  ;..  /* Consider
17e20 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63   using a skip-sc
17e30 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  an if there are 
17e40 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
17e50 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
17e60 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74   available for t
17e70 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
17e80 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ms of the index,
17e90 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72   and if the aver
17ea0 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
17eb0 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68  of repeats in th
17ec0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
17ed0 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38  s is at least 18
17ee0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
17ef0 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38   magic number 18
17f00 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20   is selected on 
17f10 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73  the basis that s
17f20 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a  canning 17 rows.
17f30 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61    ** is almost a
17f40 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68  lways quicker th
17f50 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b  an an index seek
17f60 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66   (even though if
17f70 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
17f80 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
17f90 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65  han 2^17 rows we
17fa0 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73   assume otherwis
17fb0 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73  e in other parts
17fc0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64   of.  ** the cod
17fd0 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66  e). And, even if
17fe0 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73   it is not, it s
17ff0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f  hould not be too
18000 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20   much slower. . 
18010 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
18020 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61   hand, the extra
18030 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64   seeks could end
18040 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66   up being signif
18050 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72  icantly.  ** mor
18060 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f  e expensive.  */
18070 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73  .  assert( 42==s
18080 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29  qlite3LogEst(18)
18090 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f   );.  if( saved_
180a0 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70  nEq==saved_nSkip
180b0 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71  .   && saved_nEq
180c0 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  +1<pProbe->nKeyC
180d0 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d  ol.   && pProbe-
180e0 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20  >noSkipScan==0. 
180f0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
18100 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
18110 49 54 45 5f 53 6b 69 70 53 63 61 6e 29 0a 20 20  ITE_SkipScan).  
18120 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
18130 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
18140 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e  q+1]>=42  /* TUN
18150 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72  ING: Minimum for
18160 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20   skip-scan */.  
18170 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c   && (rc = whereL
18180 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
18190 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
181a0 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  +1))==SQLITE_OK.
181b0 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20    ){.    LogEst 
181c0 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d  nIter;.    pNew-
181d0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
181e0 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b      pNew->nSkip+
181f0 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  +;.    pNew->aLT
18200 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
18210 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ++] = 0;.    pNe
18220 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
18230 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20  ERE_SKIPSCAN;.  
18240 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65    nIter = pProbe
18250 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
18260 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62  ved_nEq] - pProb
18270 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
18280 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20  aved_nEq+1];.   
18290 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
182a0 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e  Iter;.    /* TUN
182b0 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e  ING:  Because un
182c0 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74  certainties in t
182d0 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72  he estimates for
182e0 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69   skip-scan queri
182f0 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61  es,.    ** add a
18300 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61 63   1.375 fudge fac
18310 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70  tor to make skip
18320 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c  -scan slightly l
18330 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20  ess likely. */. 
18340 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20     nIter += 5;. 
18350 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
18360 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
18370 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
18380 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c  , nIter + nInMul
18390 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  );.    pNew->nOu
183a0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
183b0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
183c0 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
183d0 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  q;.    pNew->nSk
183e0 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
183f0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
18400 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
18410 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 57 48 45 52  ags;.  }..  WHER
18420 45 54 52 41 43 45 28 30 78 38 30 30 2c 20 28 22  ETRACE(0x800, ("
18430 45 4e 44 20 25 73 2e 61 64 64 42 74 72 65 65 49  END %s.addBtreeI
18440 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 2c 20  dx(%s), nEq=%d, 
18450 72 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%d\n",.      
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18470 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e  pProbe->pTable->
18480 7a 4e 61 6d 65 2c 20 70 50 72 6f 62 65 2d 3e 7a  zName, pProbe->z
18490 4e 61 6d 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c  Name, saved_nEq,
184a0 20 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   rc));.  return 
184b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
184c0 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69  urn True if it i
184d0 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
184e0 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20  pIndex might be 
184f0 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70  useful in.** imp
18500 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52  lementing the OR
18510 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e  DER BY clause in
18520 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a   pBuilder..**.**
18530 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66   Return False if
18540 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e   pBuilder does n
18550 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52  ot contain an OR
18560 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
18570 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
18580 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65  no way for pInde
18590 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69  x to be useful i
185a0 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  n implementing t
185b0 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  hat.** ORDER BY 
185c0 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
185d0 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74  c int indexMight
185e0 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
185f0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
18600 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
18610 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a   Index *pIndex,.
18620 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b    int iCursor.){
18630 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42  .  ExprList *pOB
18640 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 61 43  ;.  ExprList *aC
18650 6f 6c 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 69  olExpr;.  int ii
18660 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e  , jj;..  if( pIn
18670 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
18680 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
18690 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65  ( (pOB = pBuilde
186a0 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r->pWInfo->pOrde
186b0 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  rBy)==0 ) return
186c0 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   0;.  for(ii=0; 
186d0 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69  ii<pOB->nExpr; i
186e0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
186f0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
18700 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
18710 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  OB->a[ii].pExpr)
18720 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
18730 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
18740 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
18750 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
18760 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
18770 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
18780 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  1;.      for(jj=
18790 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b  0; jj<pIndex->nK
187a0 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  eyCol; jj++){.  
187b0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
187c0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78  >iColumn==pIndex
187d0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29  ->aiColumn[jj] )
187e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
187f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
18800 20 28 61 43 6f 6c 45 78 70 72 20 3d 20 70 49 6e   (aColExpr = pIn
18810 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21 3d  dex->aColExpr)!=
18820 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
18830 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
18840 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a  nKeyCol; jj++){.
18850 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64          if( pInd
18860 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
18870 21 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74  !=XN_EXPR ) cont
18880 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
18890 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
188a0 70 61 72 65 53 6b 69 70 28 70 45 78 70 72 2c 61  pareSkip(pExpr,a
188b0 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70  ColExpr->a[jj].p
188c0 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30  Expr,iCursor)==0
188d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
188e0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
188f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
18900 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18910 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  }../* Check to s
18920 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c 20  ee if a partial 
18930 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72 74  index with pPart
18940 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20 62  IndexWhere can b
18950 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65  e used.** in the
18960 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20   current query. 
18970 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
18980 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61  it can be and fa
18990 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  lse if not..*/.s
189a0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 55  tatic int whereU
189b0 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
189c0 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72  x(int iTab, Wher
189d0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
189e0 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69  pr *pWhere){.  i
189f0 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
18a00 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 50 61 72 73  m *pTerm;.  Pars
18a10 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
18a20 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
18a30 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65  .  while( pWhere
18a40 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
18a50 20 20 20 20 69 66 28 20 21 77 68 65 72 65 55 73      if( !whereUs
18a60 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
18a70 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72 65  (iTab,pWC,pWhere
18a80 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
18a90 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65 20  n 0;.    pWhere 
18aa0 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74  = pWhere->pRight
18ab0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
18ac0 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
18ad0 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
18ae0 47 20 29 20 70 50 61 72 73 65 20 3d 20 30 3b 0a  G ) pParse = 0;.
18af0 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d    for(i=0, pTerm
18b00 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
18b10 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
18b20 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
18b30 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
18b40 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 21  Expr;.    if( (!
18b50 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18b60 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
18b70 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52  in) || pExpr->iR
18b80 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
18b90 54 61 62 29 0a 20 20 20 20 20 26 26 20 73 71 6c  Tab).     && sql
18ba0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
18bb0 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
18bc0 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62 29  r, pWhere, iTab)
18bd0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72   .    ){.      r
18be0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
18bf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
18c00 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
18c10 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
18c20 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
18c30 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
18c40 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
18c50 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69 66 69 65  .** is identifie
18c60 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
18c70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
18c80 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
18c90 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  teed to be.** a 
18ca0 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f  b-tree table, no
18cb0 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
18cc0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73  e..**.** The cos
18cd0 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52  ts (WhereLoop.rR
18ce0 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65  un) of the b-tre
18cf0 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79  e loops added by
18d00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
18d10 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64  * are calculated
18d20 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
18d30 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63  ** For a full sc
18d40 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65  an, assuming the
18d50 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78   table (or index
18d60 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20  ) contains nRow 
18d70 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rows:.**.**     
18d80 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e  cost = nRow * 3.
18d90 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
18da0 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62       // full-tab
18db0 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63  le scan.**     c
18dc0 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20  ost = nRow * K  
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63      // scan of c
18df0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
18e00 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
18e10 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20   * (K+3.0)      
18e20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61            // sca
18e30 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  n of non-coverin
18e40 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68  g index.**.** wh
18e50 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65  ere K is a value
18e60 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
18e70 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f   3.0 set based o
18e80 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a  n the relative .
18e90 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76 65  ** estimated ave
18ea0 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65  rage size of the
18eb0 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
18ec0 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20   records..**.** 
18ed0 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61  For an index sca
18ee0 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74 20  n, where nVisit 
18ef0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
18f00 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69   index rows visi
18f10 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63  ted.** by the sc
18f20 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73  an, and nSeek is
18f30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
18f40 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72  eek operations r
18f50 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74  equired on .** t
18f60 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a  he index b-tree:
18f70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  .**.**     cost 
18f80 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e  = nSeek * (log(n
18f90 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69  Row) + K * nVisi
18fa0 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63  t)          // c
18fb0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
18fc0 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65       cost = nSee
18fd0 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b  k * (log(nRow) +
18fe0 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69   (K+3.0) * nVisi
18ff0 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76  t)    // non-cov
19000 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
19010 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65  * Normally, nSee
19020 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61  k is 1. nSeek va
19030 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61  lues greater tha
19040 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69  n 1 come about i
19050 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20  f the .** WHERE 
19060 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20  clause includes 
19070 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65  "x IN (....)" te
19080 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63  rms used in plac
19090 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77  e of "x=?". Or w
190a0 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74  hen .** implicit
190b0 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78   "x IN (SELECT x
190c0 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d   FROM tbl)" term
190d0 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72 20  s are added for 
190e0 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a  skip-scans..**.*
190f0 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20  * The estimated 
19100 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56  values (nRow, nV
19110 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74  isit, nSeek) oft
19120 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72  en contain a lar
19130 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20  ge amount.** of 
19140 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f  uncertainty.  Fo
19150 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73  r this reason, s
19160 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e  coring is design
19170 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73  ed to pick plans
19180 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65   that.** "do the
19190 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66 20   least harm" if 
191a0 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61 72  the estimates ar
191b0 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46  e inaccurate.  F
191c0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a  or example, a.**
191d0 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f   log(nRow) facto
191e0 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  r is omitted fro
191f0 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  m a non-covering
19200 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f   index scan in o
19210 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20  rder to.** bias 
19220 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66  the scoring in f
19230 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e  avor of using an
19240 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68   index, since th
19250 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20  e worst-case.** 
19260 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75  performance of u
19270 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73  sing an index is
19280 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61 6e   far better than
19290 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20   the worst-case 
192a0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f  performance.** o
192b0 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  f a full table s
192c0 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  can..*/.static i
192d0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
192e0 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
192f0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
19300 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
19310 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
19320 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  */.  Bitmask mPr
19330 65 72 65 71 20 20 20 20 20 20 20 20 20 20 20 20  ereq            
19340 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
19350 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
19360 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
19370 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
19380 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
19390 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
193a0 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
193b0 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
193c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
193d0 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
193e0 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
193f0 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
19400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19410 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
19420 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
19430 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  y key */.  LogEs
19440 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b  t aiRowEstPk[2];
19450 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69         /* The ai
19460 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75  RowLogEst[] valu
19470 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
19480 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43  dex */.  i16 aiC
19490 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20  olumnPk = -1;   
194a0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c       /* The aCol
194b0 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  umn[] value for 
194c0 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
194d0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
194e0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
194f0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
19500 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
19510 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
19520 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ;  /* The FROM c
19530 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d  lause btree term
19540 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65   to add */.  Whe
19550 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
19560 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
19570 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  late WhereLoop o
19580 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
19590 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
195a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
195b0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
195c0 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20  SortIdx = 1;    
195d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
195e0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
195f0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
19600 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f          /* A boo
19610 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  lean value */.  
19620 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20  LogEst rSize;   
19630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
19640 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
19650 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
19660 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
19670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
19680 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
19690 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
196a0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
196b0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
196c0 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
196d0 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45  The parsed WHERE
196e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62   clause */.  Tab
196f0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
19700 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
19710 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
19720 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70  */.  .  pNew = p
19730 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
19740 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
19750 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54  er->pWInfo;.  pT
19760 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
19770 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72  >pTabList;.  pSr
19780 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20  c = pTabList->a 
19790 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
197a0 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
197b0 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
197c0 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65  der->pWC;.  asse
197d0 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  rt( !IsVirtual(p
197e0 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20  Src->pTab) );.. 
197f0 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e   if( pSrc->pIBIn
19800 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
19810 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
19820 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
19830 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
19840 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
19850 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42  robe = pSrc->pIB
19860 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69  Index;.  }else i
19870 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
19880 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65  b) ){.    pProbe
19890 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
198a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
198b0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44   There is no IND
198c0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
198d0 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49   Create a fake I
198e0 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c  ndex object in l
198f0 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69  ocal.    ** vari
19900 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72  able sPk to repr
19910 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
19920 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
19930 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20  x.  Make this.  
19940 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20    ** fake index 
19950 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63  the first in a c
19960 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62  hain of Index ob
19970 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f  jects with all o
19980 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a  f the real.    *
19990 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c  * indices to fol
199a0 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  low */.    Index
199b0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
199c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
199d0 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69  rst of real indi
199e0 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
199f0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
19a00 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49  sPk, 0, sizeof(I
19a10 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e  ndex));.    sPk.
19a20 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20  nKeyCol = 1;.   
19a30 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
19a40 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
19a50 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
19a60 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c  ;.    sPk.aiRowL
19a70 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  ogEst = aiRowEst
19a80 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
19a90 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
19aa0 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
19ab0 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b   = pTab;.    sPk
19ac0 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62  .szIdxRow = pTab
19ad0 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
19ae0 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
19af0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
19b00 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
19b10 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  [1] = 0;.    pFi
19b20 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
19b30 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
19b40 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e  ( pSrc->fg.notIn
19b50 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
19b60 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
19b70 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
19b80 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
19b90 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
19ba0 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
19bb0 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
19bc0 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
19bd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
19be0 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
19bf0 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
19c00 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
19c10 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
19c20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
19c30 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  t;.  rLogSize = 
19c40 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
19c50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19c60 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
19c70 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
19c80 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
19c90 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
19ca0 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f  OrSet      /* No
19cb0 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52 20  t part of an OR 
19cc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a  optimization */.
19cd0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
19ce0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
19cf0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
19d00 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
19d10 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ->pParse->db->fl
19d20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74  ags & SQLITE_Aut
19d30 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26  oIndex)!=0.   &&
19d40 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d   pSrc->pIBIndex=
19d50 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e  =0      /* Has n
19d60 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
19d70 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53  use */.   && !pS
19d80 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  rc->fg.notIndexe
19d90 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f  d   /* Has no NO
19da0 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
19db0 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f 77   */.   && HasRow
19dc0 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20 20  id(pTab)        
19dd0 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54 20   /* Not WITHOUT 
19de0 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49  ROWID table. (FI
19df0 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a  XME: Why not?) *
19e00 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
19e10 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f  g.isCorrelated /
19e20 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
19e30 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
19e40 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69    && !pSrc->fg.i
19e50 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e  sRecursive  /* N
19e60 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 63  ot a recursive c
19e70 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72  ommon table expr
19e80 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a  ession. */.  ){.
19e90 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
19ea0 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65  auto-index Where
19eb0 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65  Loops */.    Whe
19ec0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
19ed0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57     WhereTerm *pW
19ee0 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
19ef0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  pWC->nTerm;.    
19f00 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
19f10 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
19f20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  && pTerm<pWCEnd;
19f30 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
19f40 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
19f50 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
19f60 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
19f70 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  nue;.      if( t
19f80 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
19f90 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29  (pTerm, pSrc, 0)
19fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
19fb0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
19fc0 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
19fd0 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  >nSkip = 0;.    
19fe0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
19ff0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
1a000 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
1a010 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
1a020 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
1a030 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
1a040 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d   /* TUNING: One-
1a050 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f  time cost for co
1a060 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f  mputing the auto
1a070 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20  matic index is. 
1a080 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61         ** estima
1a090 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f  ted to be X*N*lo
1a0a0 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
1a0b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1a0c0 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  ows in.        *
1a0d0 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
1a0e0 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68  g indexed and wh
1a0f0 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45  ere X is 7 (LogE
1a100 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61  st=28) for norma
1a110 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  l.        ** tab
1a120 6c 65 73 20 6f 72 20 30 2e 35 20 28 4c 6f 67 45  les or 0.5 (LogE
1a130 73 74 3d 2d 31 30 29 20 66 6f 72 20 76 69 65 77  st=-10) for view
1a140 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
1a150 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20  .  The value.   
1a160 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20       ** of X is 
1a170 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77  smaller for view
1a180 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
1a190 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75 65   so that the que
1a1a0 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20  ry planner.     
1a1b0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f     ** will be mo
1a1c0 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61 62  re aggressive ab
1a1d0 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61  out generating a
1a1e0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
1a1f0 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   for.        ** 
1a200 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73  those objects, s
1a210 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ince there is no
1a220 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
1a230 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20  add schema.     
1a240 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e     ** indexes on
1a250 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64 20   subqueries and 
1a260 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  views. */.      
1a270 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1a280 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a   rLogSize + rSiz
1a290 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
1a2a0 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
1a2b0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
1a2c0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
1a2d0 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
1a2e0 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
1a2f0 2b 3d 20 32 38 3b 0a 20 20 20 20 20 20 20 20 7d  += 28;.        }
1a300 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1a310 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2d 3d 20  pNew->rSetup -= 
1a320 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  10;.        }.  
1a330 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
1a340 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
1a350 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f  rSetup, pTab->co
1a360 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  stMult);.       
1a370 20 69 66 28 20 70 4e 65 77 2d 3e 72 53 65 74 75   if( pNew->rSetu
1a380 70 3c 30 20 29 20 70 4e 65 77 2d 3e 72 53 65 74  p<0 ) pNew->rSet
1a390 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  up = 0;.        
1a3a0 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20  /* TUNING: Each 
1a3b0 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65  index lookup yie
1a3c0 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74  lds 20 rows in t
1a3d0 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a  he table.  This.
1a3e0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f          ** is mo
1a3f0 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61  re than the usua
1a400 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f  l guess of 10 ro
1a410 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76  ws, since we hav
1a420 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20  e no way.       
1a430 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68   ** of knowing h
1a440 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65  ow selective the
1a450 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69   index will ulti
1a460 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77  mately be.  It w
1a470 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
1a480 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61  not be unreasona
1a490 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  ble to make this
1a4a0 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67   value much larg
1a4b0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  er. */.        p
1a4c0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20  New->nOut = 43; 
1a4d0 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c   assert( 43==sql
1a4e0 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29  ite3LogEst(20) )
1a4f0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a500 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
1a510 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
1a520 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20  ,pNew->nOut);.  
1a530 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
1a540 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f  ags = WHERE_AUTO
1a550 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20  _INDEX;.        
1a560 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
1a570 50 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e  Prereq | pTerm->
1a580 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
1a590 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1a5a0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
1a5b0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
1a5c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1a5d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1a5e0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
1a5f0 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  EX */..  /* Loop
1a600 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65   over all indice
1a610 73 2e 20 49 66 20 74 68 65 72 65 20 77 61 73 20  s. If there was 
1a620 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
1a630 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
1a640 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 69  .  ** consider i
1a650 6e 64 65 78 20 70 50 72 6f 62 65 2e 20 20 2a 2f  ndex pProbe.  */
1a660 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
1a670 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
1a680 3b 20 0a 20 20 20 20 20 20 70 50 72 6f 62 65 3d  ; .      pProbe=
1a690 28 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20  (pSrc->pIBIndex 
1a6a0 3f 20 30 20 3a 20 70 50 72 6f 62 65 2d 3e 70 4e  ? 0 : pProbe->pN
1a6b0 65 78 74 29 2c 20 69 53 6f 72 74 49 64 78 2b 2b  ext), iSortIdx++
1a6c0 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  .  ){.    if( pP
1a6d0 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
1a6e0 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21  ere!=0.     && !
1a6f0 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
1a700 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43  alIndex(pSrc->iC
1a710 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f  ursor, pWC, pPro
1a720 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
1a730 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  e) ){.      test
1a740 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62  case( pNew->iTab
1a750 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
1a760 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65  );  /* See ticke
1a770 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a  t [98d973b8f5] *
1a780 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
1a790 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e  ;  /* Partial in
1a7a0 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74  dex inappropriat
1a7b0 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
1a7c0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
1a7d0 28 20 70 50 72 6f 62 65 2d 3e 62 4e 6f 51 75 65  ( pProbe->bNoQue
1a7e0 72 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ry ) continue;. 
1a7f0 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62     rSize = pProb
1a800 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  e->aiRowLogEst[0
1a810 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  ];.    pNew->u.b
1a820 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
1a830 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
1a840 6e 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  nBtm = 0;.    pN
1a850 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70  ew->u.btree.nTop
1a860 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1a870 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70  nSkip = 0;.    p
1a880 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
1a890 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74  .    pNew->iSort
1a8a0 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Idx = 0;.    pNe
1a8b0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1a8c0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
1a8d0 3d 20 6d 50 72 65 72 65 71 3b 0a 20 20 20 20 70  = mPrereq;.    p
1a8e0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
1a8f0 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  e;.    pNew->u.b
1a900 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50  tree.pIndex = pP
1a910 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e  robe;.    b = in
1a920 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
1a930 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72  OrderBy(pBuilder
1a940 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e  , pProbe, pSrc->
1a950 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a  iCursor);.    /*
1a960 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53   The ONEPASS_DES
1a970 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72  IRED flags never
1a980 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72   occurs together
1a990 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a   with ORDER BY *
1a9a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
1a9b0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1a9c0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
1a9d0 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
1a9e0 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   b==0 );.    if(
1a9f0 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
1aa00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74   ){.      /* Int
1aa10 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
1aa20 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
1aa30 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1aa40 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20  WHERE_IPK;..    
1aa50 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20    /* Full table 
1aa60 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  scan */.      pN
1aa70 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
1aa80 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
1aa90 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
1aaa0 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74  : Cost of full t
1aab0 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a  able scan is (N*
1aac0 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70  3.0). */.      p
1aad0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
1aae0 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70  e + 16;.      Ap
1aaf0 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
1ab00 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54  r(pNew->rRun, pT
1ab10 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
1ab20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
1ab30 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
1ab40 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
1ab50 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1ab60 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1ab70 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1ab80 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
1ab90 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ze;.      if( rc
1aba0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
1abb0 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
1abc0 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  sk m;.      if( 
1abd0 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69  pProbe->isCoveri
1abe0 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ng ){.        pN
1abf0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1ac00 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
1ac10 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
1ac20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20        m = 0;.   
1ac30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ac40 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55    m = pSrc->colU
1ac50 73 65 64 20 26 20 70 50 72 6f 62 65 2d 3e 63 6f  sed & pProbe->co
1ac60 6c 4e 6f 74 49 64 78 65 64 3b 0a 20 20 20 20 20  lNotIdxed;.     
1ac70 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
1ac80 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45   = (m==0) ? (WHE
1ac90 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
1aca0 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45  E_INDEXED) : WHE
1acb0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
1acc0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75    }..      /* Fu
1acd0 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65  ll scan via inde
1ace0 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  x */.      if( b
1acf0 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52  .       || !HasR
1ad00 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20 20  owid(pTab).     
1ad10 20 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50 61    || pProbe->pPa
1ad20 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
1ad30 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20       || ( m==0. 
1ad40 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
1ad50 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  e->bUnordered==0
1ad60 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50  .         && (pP
1ad70 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  robe->szIdxRow<p
1ad80 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20  Tab->szTabRow). 
1ad90 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
1ada0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1adb0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
1adc0 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20  ESIRED)==0.     
1add0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c      && sqlite3Gl
1ade0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43  obalConfig.bUseC
1adf0 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  is.         && O
1ae00 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
1ae10 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  ed(pWInfo->pPars
1ae20 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
1ae30 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20  verIdxScan).    
1ae40 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b        ).      ){
1ae50 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
1ae60 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
1ae70 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20  ortIdx : 0;..   
1ae80 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
1ae90 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65   of visiting the
1aea0 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e   index rows is N
1aeb0 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20  *K, where K is. 
1aec0 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65         ** betwee
1aed0 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64  n 1.1 and 3.0, d
1aee0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
1aef0 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f  relative sizes o
1af00 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1af10 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
1af20 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20   rows. */.      
1af30 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
1af40 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70  Size + 1 + (15*p
1af50 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
1af60 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  /pTab->szTabRow;
1af70 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d  .        if( m!=
1af80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1af90 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e  * If this is a n
1afa0 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
1afb0 78 20 73 63 61 6e 2c 20 61 64 64 20 69 6e 20 74  x scan, add in t
1afc0 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 20  he cost of.     
1afd0 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61       ** doing ta
1afe0 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68  ble lookups.  Th
1aff0 65 20 63 6f 73 74 20 77 69 6c 6c 20 62 65 20 33  e cost will be 3
1b000 78 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  x the number of.
1b010 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f            ** loo
1b020 6b 75 70 73 2e 20 20 54 61 6b 65 20 69 6e 74 6f  kups.  Take into
1b030 20 61 63 63 6f 75 6e 74 20 57 48 45 52 45 20 63   account WHERE c
1b040 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
1b050 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20   can be.        
1b060 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75    ** satisfied u
1b070 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e  sing just the in
1b080 64 65 78 2c 20 61 6e 64 20 74 68 61 74 20 64 6f  dex, and that do
1b090 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 20   not require a. 
1b0a0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
1b0b0 65 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20  e lookup. */.   
1b0c0 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4c         LogEst nL
1b0d0 6f 6f 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b 20  ookup = rSize + 
1b0e0 31 36 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f 73  16;  /* Base cos
1b0f0 74 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20 20  t:  N*3 */.     
1b100 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1b110 20 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20         int iCur 
1b120 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b  = pSrc->iCursor;
1b130 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
1b140 43 6c 61 75 73 65 20 2a 70 57 43 32 20 3d 20 26  Clause *pWC2 = &
1b150 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 20  pWInfo->sWC;.   
1b160 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
1b170 20 69 69 3c 70 57 43 32 2d 3e 6e 54 65 72 6d 3b   ii<pWC2->nTerm;
1b180 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
1b190 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1b1a0 54 65 72 6d 20 3d 20 26 70 57 43 32 2d 3e 61 5b  Term = &pWC2->a[
1b1b0 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii];.           
1b1c0 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
1b1d0 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28  rCoveredByIndex(
1b1e0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 69 43  pTerm->pExpr, iC
1b1f0 75 72 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20  ur, pProbe) ){. 
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1b210 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1b220 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
1b230 20 70 54 65 72 6d 20 63 61 6e 20 62 65 20 65 76   pTerm can be ev
1b240 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6a 75  aluated using ju
1b250 73 74 20 74 68 65 20 69 6e 64 65 78 2e 20 20 53  st the index.  S
1b260 6f 20 72 65 64 75 63 65 0a 20 20 20 20 20 20 20  o reduce.       
1b270 20 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65       ** the expe
1b280 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 74  cted number of t
1b290 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 20 61 63 63  able lookups acc
1b2a0 6f 72 64 69 6e 67 6c 79 20 2a 2f 0a 20 20 20 20  ordingly */.    
1b2b0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1b2c0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
1b2d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b2e0 20 6e 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54 65 72   nLookup += pTer
1b2f0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
1b300 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1b310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
1b320 4c 6f 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20 20 20  Lookup--;.      
1b330 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1b340 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
1b350 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 20 6e  WO_EQ|WO_IS) ) n
1b360 4c 6f 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a 20 20  Lookup -= 19;.  
1b370 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b390 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65    .          pNe
1b3a0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
1b3b0 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
1b3c0 3e 72 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b  >rRun, nLookup);
1b3d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b3e0 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
1b3f0 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
1b400 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  n, pTab->costMul
1b410 74 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  t);.        wher
1b420 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
1b430 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  t(pWC, pNew, rSi
1b440 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ze);.        rc 
1b450 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
1b460 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
1b470 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
1b480 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
1b490 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
1b4a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1b4b0 20 20 20 7d 0a 0a 20 20 20 20 70 42 75 69 6c 64     }..    pBuild
1b4c0 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 3d 20 30  er->bldFlags = 0
1b4d0 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
1b4e0 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
1b4f0 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
1b500 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 20 20  , pProbe, 0);.  
1b510 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
1b520 62 6c 64 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45  bldFlags==SQLITE
1b530 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44 20 29 7b  _BLDF_INDEXED ){
1b540 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6e  .      /* If a n
1b550 6f 6e 2d 75 6e 69 71 75 65 20 69 6e 64 65 78 20  on-unique index 
1b560 69 73 20 75 73 65 64 2c 20 6f 72 20 69 66 20 61  is used, or if a
1b570 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6b   prefix of the k
1b580 65 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ey for.      ** 
1b590 75 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73 20  unique index is 
1b5a0 75 73 65 64 20 28 6d 61 6b 69 6e 67 20 74 68 65  used (making the
1b5b0 20 69 6e 64 65 78 20 66 75 6e 63 74 69 6f 6e 61   index functiona
1b5c0 6c 6c 79 20 6e 6f 6e 2d 75 6e 69 71 75 65 29 0a  lly non-unique).
1b5d0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
1b5e0 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64  e sqlite_stat1 d
1b5f0 61 74 61 20 62 65 63 6f 6d 65 73 20 69 6d 70 6f  ata becomes impo
1b600 72 74 61 6e 74 20 66 6f 72 20 73 63 6f 72 69 6e  rtant for scorin
1b610 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  g the.      ** p
1b620 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61  lan */.      pTa
1b630 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
1b640 46 5f 53 74 61 74 73 55 73 65 64 3b 0a 20 20 20  F_StatsUsed;.   
1b650 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1b660 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
1b670 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74  _STAT4.    sqlit
1b680 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65  e3Stat4ProbeFree
1b690 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29  (pBuilder->pRec)
1b6a0 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
1b6b0 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20  nRecValid = 0;. 
1b6c0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65     pBuilder->pRe
1b6d0 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  c = 0;.#endif.  
1b6e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b6f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1b700 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1b710 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  LE../*.** Argume
1b720 6e 74 20 70 49 64 78 49 6e 66 6f 20 69 73 20 61  nt pIdxInfo is a
1b730 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
1b740 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72   with all constr
1b750 61 69 6e 74 73 20 74 68 61 74 20 6d 61 79 0a 2a  aints that may.*
1b760 2a 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65  * be used by the
1b770 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
1b780 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 42 75  dentified by pBu
1b790 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
1b7a0 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  b. This.** funct
1b7b0 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75 62 73  ion marks a subs
1b7c0 65 74 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 73  et of those cons
1b7d0 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2c 20  traints usable, 
1b7e0 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 78  invokes the.** x
1b7f0 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
1b800 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 72 65   and adds the re
1b810 74 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f 20 70  turned plan to p
1b820 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41  Builder..**.** A
1b830 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6d   constraint is m
1b840 61 72 6b 65 64 20 75 73 61 62 6c 65 20 69 66 3a  arked usable if:
1b850 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67 75 6d  .**.**   * Argum
1b860 65 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e 64 69  ent mUsable indi
1b870 63 61 74 65 73 20 74 68 61 74 20 69 74 73 20 70  cates that its p
1b880 72 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65  rerequisites are
1b890 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e 64 0a   available, and.
1b8a0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69 73 20  **.**   * It is 
1b8b0 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f  not one of the o
1b8c0 70 65 72 61 74 6f 72 73 20 73 70 65 63 69 66 69  perators specifi
1b8d0 65 64 20 69 6e 20 74 68 65 20 6d 45 78 63 6c 75  ed in the mExclu
1b8e0 64 65 20 6d 61 73 6b 20 70 61 73 73 65 64 0a 2a  de mask passed.*
1b8f0 2a 20 20 20 20 20 61 73 20 74 68 65 20 66 6f 75  *     as the fou
1b900 72 74 68 20 61 72 67 75 6d 65 6e 74 20 28 77 68  rth argument (wh
1b910 69 63 68 20 69 6e 20 70 72 61 63 74 69 63 65 20  ich in practice 
1b920 69 73 20 65 69 74 68 65 72 20 57 4f 5f 49 4e 20  is either WO_IN 
1b930 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  or 0)..**.** Arg
1b940 75 6d 65 6e 74 20 6d 50 72 65 72 65 71 20 69 73  ument mPrereq is
1b950 20 61 20 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65   a mask of table
1b960 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73  s that must be s
1b970 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68  canned before th
1b980 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62  e.** virtual tab
1b990 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20  le in question. 
1b9a0 54 68 65 73 65 20 61 72 65 20 61 64 64 65 64 20  These are added 
1b9b0 74 6f 20 74 68 65 20 70 6c 61 6e 73 20 70 72 65  to the plans pre
1b9c0 72 65 71 75 69 73 69 74 65 73 0a 2a 2a 20 62 65  requisites.** be
1b9d0 66 6f 72 65 20 69 74 20 69 73 20 61 64 64 65 64  fore it is added
1b9e0 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   to pBuilder..**
1b9f0 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d  .** Output param
1ba00 65 74 65 72 20 2a 70 62 49 6e 20 69 73 20 73 65  eter *pbIn is se
1ba10 74 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65  t to true if the
1ba20 20 70 6c 61 6e 20 61 64 64 65 64 20 74 6f 20 70   plan added to p
1ba30 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65 73 20  Builder.** uses 
1ba40 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f 5f 49  one or more WO_I
1ba50 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66 61 6c 73  N terms, or fals
1ba60 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1ba70 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1ba80 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e  LoopAddVirtualOn
1ba90 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  e(.  WhereLoopBu
1baa0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
1bab0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
1bac0 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eq,             
1bad0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61     /* Mask of ta
1bae0 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1baf0 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42 69 74  e used. */.  Bit
1bb00 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20 20 20  mask mUsable,   
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c 65 20 74  Mask of usable t
1bb30 61 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36 20 6d  ables */.  u16 m
1bb40 45 78 63 6c 75 64 65 2c 20 20 20 20 20 20 20 20  Exclude,        
1bb50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1bb60 63 6c 75 64 65 20 74 65 72 6d 73 20 75 73 69 6e  clude terms usin
1bb70 67 20 74 68 65 73 65 20 6f 70 65 72 61 74 6f 72  g these operator
1bb80 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  s */.  sqlite3_i
1bb90 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
1bba0 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c 61  nfo,   /* Popula
1bbb0 74 65 64 20 6f 62 6a 65 63 74 20 66 6f 72 20 78  ted object for x
1bbc0 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 75  BestIndex */.  u
1bbd0 31 36 20 6d 4e 6f 4f 6d 69 74 2c 20 20 20 20 20  16 mNoOmit,     
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bbf0 2a 20 44 6f 20 6e 6f 74 20 6f 6d 69 74 20 74 68  * Do not omit th
1bc00 65 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ese constraints 
1bc10 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 49 6e 20 20  */.  int *pbIn  
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75       /* OUT: Tru
1bc40 65 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20 61  e if plan uses a
1bc50 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a  n IN(...) op */.
1bc60 29 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  ){.  WhereClause
1bc70 20 2a 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72   *pWC = pBuilder
1bc80 2d 3e 70 57 43 3b 0a 20 20 73 74 72 75 63 74 20  ->pWC;.  struct 
1bc90 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
1bca0 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
1bcb0 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
1bcc0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
1bcd0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
1bce0 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  age = pIdxInfo->
1bcf0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
1bd00 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1bd10 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 72   mxTerm;.  int r
1bd20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bd30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
1bd40 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1bd50 77 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w;.  Parse *pPar
1bd60 73 65 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  se = pBuilder->p
1bd70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1bd80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1bd90 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 26 70 42  item *pSrc = &pB
1bda0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
1bdb0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
1bdc0 2d 3e 69 54 61 62 5d 3b 0a 20 20 69 6e 74 20 6e  ->iTab];.  int n
1bdd0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
1bde0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
1bdf0 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  nt;..  assert( (
1be00 6d 55 73 61 62 6c 65 20 26 20 6d 50 72 65 72 65  mUsable & mPrere
1be10 71 29 3d 3d 6d 50 72 65 72 65 71 20 29 3b 0a 20  q)==mPrereq );. 
1be20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a 20 20 70 4e   *pbIn = 0;.  pN
1be30 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72  ew->prereq = mPr
1be40 65 72 65 71 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ereq;..  /* Set 
1be50 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 20  the usable flag 
1be60 6f 6e 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  on the subset of
1be70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65   constraints ide
1be80 6e 74 69 66 69 65 64 20 62 79 20 0a 20 20 2a 2a  ntified by .  **
1be90 20 61 72 67 75 6d 65 6e 74 73 20 6d 55 73 61 62   arguments mUsab
1bea0 6c 65 20 61 6e 64 20 6d 45 78 63 6c 75 64 65 2e  le and mExclude.
1beb0 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
1bec0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
1bed0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
1bee0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
1bef0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66  aConstraint;.  f
1bf00 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
1bf10 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
1bf20 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 57 68 65  Cons++){.    Whe
1bf30 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
1bf40 26 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73  &pWC->a[pIdxCons
1bf50 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b 0a  ->iTermOffset];.
1bf60 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
1bf70 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  able = 0;.    if
1bf80 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
1bf90 52 69 67 68 74 20 26 20 6d 55 73 61 62 6c 65 29  Right & mUsable)
1bfa0 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ==pTerm->prereqR
1bfb0 69 67 68 74 20 0a 20 20 20 20 20 26 26 20 28 70  ight .     && (p
1bfc0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1bfd0 26 20 6d 45 78 63 6c 75 64 65 29 3d 3d 30 0a 20  & mExclude)==0. 
1bfe0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78     ){.      pIdx
1bff0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
1c000 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1c010 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1c020 20 6f 75 74 70 75 74 20 66 69 65 6c 64 73 20 6f   output fields o
1c030 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
1c040 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
1c050 72 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70  re */.  memset(p
1c060 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Usage, 0, sizeof
1c070 28 70 55 73 61 67 65 5b 30 5d 29 2a 6e 43 6f 6e  (pUsage[0])*nCon
1c080 73 74 72 61 69 6e 74 29 3b 0a 20 20 61 73 73 65  straint);.  asse
1c090 72 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  rt( pIdxInfo->ne
1c0a0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d  edToFreeIdxStr==
1c0b0 30 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  0 );.  pIdxInfo-
1c0c0 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  >idxStr = 0;.  p
1c0d0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
1c0e0 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
1c0f0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1c100 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
1c110 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
1c120 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
1c130 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20   / (double)2;.  
1c140 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1c150 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20  tedRows = 25;.  
1c160 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
1c170 67 73 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  gs = 0;.  pIdxIn
1c180 66 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73  fo->colUsed = (s
1c190 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72  qlite3_int64)pSr
1c1a0 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f  c->colUsed;..  /
1c1b0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 76 69 72  * Invoke the vir
1c1c0 74 75 61 6c 20 74 61 62 6c 65 20 78 42 65 73 74  tual table xBest
1c1d0 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20 2a  Index() method *
1c1e0 2f 0a 20 20 72 63 20 3d 20 76 74 61 62 42 65 73  /.  rc = vtabBes
1c1f0 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
1c200 53 72 63 2d 3e 70 54 61 62 2c 20 70 49 64 78 49  Src->pTab, pIdxI
1c210 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nfo);.  if( rc )
1c220 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6d   return rc;..  m
1c230 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 61 73  xTerm = -1;.  as
1c240 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c  sert( pNew->nLSl
1c250 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ot>=nConstraint 
1c260 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1c270 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
1c280 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ) pNew->aLTerm[i
1c290 5d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  ] = 0;.  pNew->u
1c2a0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d  .vtab.omitMask =
1c2b0 20 30 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   0;.  pIdxCons =
1c2c0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
1c2d0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
1c2e0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
1c2f0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66  aConstraint;.  f
1c300 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
1c310 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
1c320 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  Cons++){.    int
1c330 20 69 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20   iTerm;.    if( 
1c340 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b  (iTerm = pUsage[
1c350 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31  i].argvIndex - 1
1c360 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  )>=0 ){.      Wh
1c370 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
1c380 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 49        int j = pI
1c390 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
1c3a0 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69  set;.      if( i
1c3b0 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Term>=nConstrain
1c3c0 74 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a  t.       || j<0.
1c3d0 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43         || j>=pWC
1c3e0 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 7c  ->nTerm.       |
1c3f0 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  | pNew->aLTerm[i
1c400 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20  Term]!=0.       
1c410 7c 7c 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61  || pIdxCons->usa
1c420 62 6c 65 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a  ble==0.      ){.
1c430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c440 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
1c450 25 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61  %s.xBestIndex ma
1c460 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d  lfunction",pSrc-
1c470 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
1c480 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1c490 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1c4a0 6f 46 72 65 65 49 64 78 53 74 72 20 29 3b 0a 20  oFreeIdxStr );. 
1c4b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1c4c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1c4d0 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
1c4e0 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73  se( iTerm==nCons
1c4f0 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20  traint-1 );.    
1c500 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30    testcase( j==0
1c510 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c520 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72  se( j==pWC->nTer
1c530 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 54 65  m-1 );.      pTe
1c540 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
1c550 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
1c560 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72  req |= pTerm->pr
1c570 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
1c580 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70   assert( iTerm<p
1c590 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
1c5a0 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
1c5b0 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d  m[iTerm] = pTerm
1c5c0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72  ;.      if( iTer
1c5d0 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72  m>mxTerm ) mxTer
1c5e0 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  m = iTerm;.     
1c5f0 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
1c600 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 74 65  ==15 );.      te
1c610 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
1c620 36 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  6 );.      if( i
1c630 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67  Term<16 && pUsag
1c640 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77  e[i].omit ) pNew
1c650 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
1c660 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20  k |= 1<<iTerm;. 
1c670 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1c680 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1c690 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
1c6a0 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74    /* A virtual t
1c6b0 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e  able that is con
1c6c0 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49  strained by an I
1c6d0 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74  N clause may not
1c6e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  .        ** cons
1c6f0 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ume the ORDER BY
1c700 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20   clause because 
1c710 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66  (1) the order of
1c720 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20   IN terms.      
1c730 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65    ** is not nece
1c740 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20  ssarily related 
1c750 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  to the order of 
1c760 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64  output terms and
1c770 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20  .        ** (2) 
1c780 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73  Multiple outputs
1c790 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49   from a single I
1c7a0 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74  N value will not
1c7b0 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 2a   merge.        *
1c7c0 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a  * together.  */.
1c7d0 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
1c7e0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
1c7f0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  d = 0;.        p
1c800 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67  IdxInfo->idxFlag
1c810 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e 44  s &= ~SQLITE_IND
1c820 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a  EX_SCAN_UNIQUE;.
1c830 20 20 20 20 20 20 20 20 2a 70 62 49 6e 20 3d 20          *pbIn = 
1c840 31 3b 20 61 73 73 65 72 74 28 20 28 6d 45 78 63  1; assert( (mExc
1c850 6c 75 64 65 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  lude & WO_IN)==0
1c860 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1c870 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 75 2e  }.  }.  pNew->u.
1c880 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 26 3d  vtab.omitMask &=
1c890 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 70 4e   ~mNoOmit;..  pN
1c8a0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54  ew->nLTerm = mxT
1c8b0 65 72 6d 2b 31 3b 0a 20 20 66 6f 72 28 69 3d 30  erm+1;.  for(i=0
1c8c0 3b 20 69 3c 3d 6d 78 54 65 72 6d 3b 20 69 2b 2b  ; i<=mxTerm; i++
1c8d0 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ){.    if( pNew-
1c8e0 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 7b  >aLTerm[i]==0 ){
1c8f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f  .      /* The no
1c900 6e 2d 7a 65 72 6f 20 61 72 67 76 49 64 78 20 76  n-zero argvIdx v
1c910 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 63 6f  alues must be co
1c920 6e 74 69 67 75 6f 75 73 2e 20 20 52 61 69 73 65  ntiguous.  Raise
1c930 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72 72   an.      ** err
1c940 6f 72 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  or if they are n
1c950 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ot */.      sqli
1c960 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c970 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64 65  se,"%s.xBestInde
1c980 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70  x malfunction",p
1c990 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
1c9a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c9b0 65 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  e( pIdxInfo->nee
1c9c0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 3b  dToFreeIdxStr );
1c9d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1c9e0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1c9f0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1ca00 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
1ca10 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
1ca20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
1ca30 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Num = pIdxInfo->
1ca40 69 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d 3e  idxNum;.  pNew->
1ca50 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1ca60 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  = pIdxInfo->need
1ca70 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20  ToFreeIdxStr;.  
1ca80 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
1ca90 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
1caa0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1cab0 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
1cac0 2d 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e 65 77  ->idxStr;.  pNew
1cad0 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
1cae0 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e  ed = (i8)(pIdxIn
1caf0 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
1cb00 6d 65 64 20 3f 0a 20 20 20 20 20 20 70 49 64 78  med ?.      pIdx
1cb10 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a  Info->nOrderBy :
1cb20 20 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65   0);.  pNew->rSe
1cb30 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
1cb40 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
1cb50 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28  ogEstFromDouble(
1cb60 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1cb70 74 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65 77  tedCost);.  pNew
1cb80 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
1cb90 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
1cba0 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
1cbb0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 57  ..  /* Set the W
1cbc0 48 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61 67  HERE_ONEROW flag
1cbd0 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64   if the xBestInd
1cbe0 65 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64 69  ex() method indi
1cbf0 63 61 74 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  cated.  ** that 
1cc00 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69  the scan will vi
1cc10 73 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  sit at most one 
1cc20 72 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f 74  row. Clear it ot
1cc30 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69 66  herwise. */.  if
1cc40 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46  ( pIdxInfo->idxF
1cc50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 4e  lags & SQLITE_IN
1cc60 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20  DEX_SCAN_UNIQUE 
1cc70 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  ){.    pNew->wsF
1cc80 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
1cc90 45 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EROW;.  }else{. 
1cca0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
1ccb0 20 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52 4f   &= ~WHERE_ONERO
1ccc0 57 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77 68  W;.  }.  rc = wh
1ccd0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1cce0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1ccf0 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61   if( pNew->u.vta
1cd00 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
1cd10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1cd20 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
1cd30 74 72 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  tr);.    pNew->u
1cd40 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1cd50 20 30 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45 54   0;.  }.  WHERET
1cd60 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 20  RACE(0xffff, (" 
1cd70 20 62 49 6e 3d 25 64 20 70 72 65 72 65 71 49 6e   bIn=%d prereqIn
1cd80 3d 25 30 34 6c 6c 78 20 70 72 65 72 65 71 4f 75  =%04llx prereqOu
1cd90 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20  t=%04llx\n",.   
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 2a 70 62 49 6e 2c 20 28 73 71 6c 69 74     *pbIn, (sqlit
1cdc0 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 72 65  e3_uint64)mPrere
1cdd0 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
1cde0 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
1cdf0 33 5f 75 69 6e 74 36 34 29 28 70 4e 65 77 2d 3e  3_uint64)(pNew->
1ce00 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65  prereq & ~mPrere
1ce10 71 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  q)));..  return 
1ce20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
1ce30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1ce40 20 69 6e 76 6f 6b 65 64 20 66 72 6f 6d 20 77 69   invoked from wi
1ce50 74 68 69 6e 20 61 6e 20 78 42 65 73 74 49 6e 64  thin an xBestInd
1ce60 65 78 28 29 20 63 61 6c 6c 62 61 63 6b 2c 20 69  ex() callback, i
1ce70 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70  t.** returns a p
1ce80 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
1ce90 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
1cea0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  e name of the co
1ceb0 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65  llation.** seque
1cec0 6e 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  nce associated w
1ced0 69 74 68 20 65 6c 65 6d 65 6e 74 20 69 43 6f 6e  ith element iCon
1cee0 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
1cef0 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e 61 43 6f 6e  _index_info.aCon
1cf00 73 74 72 61 69 6e 74 0a 2a 2a 20 61 72 72 61 79  straint.** array
1cf10 2e 20 4f 72 2c 20 69 66 20 69 43 6f 6e 73 20 69  . Or, if iCons i
1cf20 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 6f  s out of range o
1cf30 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 63  r there is no ac
1cf40 74 69 76 65 20 78 42 65 73 74 49 6e 64 65 78 0a  tive xBestIndex.
1cf50 2a 2a 20 63 61 6c 6c 2c 20 72 65 74 75 72 6e 20  ** call, return 
1cf60 4e 55 4c 4c 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  NULL..*/.const c
1cf70 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 76 74 61  har *sqlite3_vta
1cf80 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 73 71 6c 69  b_collation(sqli
1cf90 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
1cfa0 70 49 64 78 49 6e 66 6f 2c 20 69 6e 74 20 69 43  pIdxInfo, int iC
1cfb0 6f 6e 73 29 7b 0a 20 20 48 69 64 64 65 6e 49 6e  ons){.  HiddenIn
1cfc0 64 65 78 49 6e 66 6f 20 2a 70 48 69 64 64 65 6e  dexInfo *pHidden
1cfd0 20 3d 20 28 48 69 64 64 65 6e 49 6e 64 65 78 49   = (HiddenIndexI
1cfe0 6e 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31  nfo*)&pIdxInfo[1
1cff0 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ];.  const char 
1d000 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *zRet = 0;.  if(
1d010 20 69 43 6f 6e 73 3e 3d 30 20 26 26 20 69 43 6f   iCons>=0 && iCo
1d020 6e 73 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ns<pIdxInfo->nCo
1d030 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
1d040 43 6f 6c 6c 53 65 71 20 2a 70 43 20 3d 20 30 3b  CollSeq *pC = 0;
1d050 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d  .    int iTerm =
1d060 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
1d070 74 72 61 69 6e 74 5b 69 43 6f 6e 73 5d 2e 69 54  traint[iCons].iT
1d080 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 45  ermOffset;.    E
1d090 78 70 72 20 2a 70 58 20 3d 20 70 48 69 64 64 65  xpr *pX = pHidde
1d0a0 6e 2d 3e 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  n->pWC->a[iTerm]
1d0b0 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
1d0c0 70 58 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pX->pLeft ){.   
1d0d0 20 20 20 70 43 20 3d 20 73 71 6c 69 74 65 33 42     pC = sqlite3B
1d0e0 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
1d0f0 53 65 71 28 70 48 69 64 64 65 6e 2d 3e 70 50 61  Seq(pHidden->pPa
1d100 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
1d110 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
1d120 20 7d 0a 20 20 20 20 7a 52 65 74 20 3d 20 28 70   }.    zRet = (p
1d130 43 20 3f 20 70 43 2d 3e 7a 4e 61 6d 65 20 3a 20  C ? pC->zName : 
1d140 22 42 49 4e 41 52 59 22 29 3b 0a 20 20 7d 0a 20  "BINARY");.  }. 
1d150 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
1d160 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
1d170 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1d180 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20   for a table of 
1d190 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66  the join identif
1d1a0 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64  ied by.** pBuild
1d1b0 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
1d1c0 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
1d1d0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1d1e0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
1d1f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
1d200 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72 20 43  are no LEFT or C
1d210 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20  ROSS JOIN joins 
1d220 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20 62 6f  in the query, bo
1d230 74 68 20 6d 50 72 65 72 65 71 20 61 6e 64 0a 2a  th mPrereq and.*
1d240 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72 65 20  * mUnusable are 
1d250 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65 72 77  set to 0. Otherw
1d260 69 73 65 2c 20 6d 50 72 65 72 65 71 20 69 73 20  ise, mPrereq is 
1d270 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 46 52  a mask of all FR
1d280 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65 6e 74  OM clause.** ent
1d290 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ries that occur 
1d2a0 62 65 66 6f 72 65 20 74 68 65 20 76 69 72 74 75  before the virtu
1d2b0 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  al table in the 
1d2c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64 20  FROM clause and 
1d2d0 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74 65 64  are.** separated
1d2e0 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c   from it by at l
1d2f0 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72  east one LEFT or
1d300 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53 69 6d   CROSS JOIN. Sim
1d310 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d  ilarly, the.** m
1d320 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20 63 6f  Unusable mask co
1d330 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f 4d 20  ntains all FROM 
1d340 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 20 74  clause entries t
1d350 68 61 74 20 6f 63 63 75 72 20 61 66 74 65 72 20  hat occur after 
1d360 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  the.** virtual t
1d370 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73 65 70  able and are sep
1d380 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62  arated from it b
1d390 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c  y at least one L
1d3a0 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f 53 53  EFT or .** CROSS
1d3b0 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   JOIN. .**.** Fo
1d3c0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
1d3d0 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a 2a 2a  e query were:.**
1d3e0 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
1d3f0 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e 20  1, t2 LEFT JOIN 
1d400 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f 53 53  t3, t4, vt CROSS
1d410 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a   JOIN t5, t6;.**
1d420 0a 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72 65 71  .** then mPrereq
1d430 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1d440 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55 6e  (t1, t2) and mUn
1d450 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20 74  usable to (t5, t
1d460 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68  6)..**.** All th
1d470 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 50 72 65  e tables in mPre
1d480 72 65 71 20 6d 75 73 74 20 62 65 20 73 63 61 6e  req must be scan
1d490 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63  ned before the c
1d4a0 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 0a  urrent virtual .
1d4b0 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79  ** table. So any
1d4c0 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
1d4d0 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69 74   all prerequisit
1d4e0 65 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  es are satisfied
1d4f0 20 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65 71 20   by .** mPrereq 
1d500 6d 61 79 20 62 65 20 73 70 65 63 69 66 69 65 64  may be specified
1d510 20 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e 20   as "usable" in 
1d520 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42 65  all calls to xBe
1d530 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e  stIndex. .** Con
1d540 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62  versely, all tab
1d550 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65  les in mUnusable
1d560 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
1d570 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
1d580 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  nt.** virtual ta
1d590 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d  ble, so any term
1d5a0 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
1d5b0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 76  prerequisites ov
1d5c0 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55  erlap with.** mU
1d5d0 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20 61  nusable should a
1d5e0 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67 75  lways be configu
1d5f0 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61 62  red as "not-usab
1d600 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e 64  le" for xBestInd
1d610 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ex..*/.static in
1d620 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  t whereLoopAddVi
1d630 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f  rtual(.  WhereLo
1d640 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
1d650 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63  der,  /* WHERE c
1d660 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
1d670 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
1d680 50 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 20  Prereq,         
1d690 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
1d6a0 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  at must be scann
1d6b0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 6f  ed before this o
1d6c0 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
1d6d0 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20 20  mUnusable       
1d6e0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
1d6f0 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e  hat must be scan
1d700 6e 65 64 20 61 66 74 65 72 20 74 68 69 73 20 6f  ned after this o
1d710 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ne */.){.  int r
1d720 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1d730 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1d740 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72  n code */.  Wher
1d750 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
1d760 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
1d770 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
1d780 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
1d790 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
1d7a0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
1d7b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d7c0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1d7d0 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  C;            /*
1d7e0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1d7f0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1d800 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
1d810 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
1d820 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
1d830 65 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c 69 74  earch */.  sqlit
1d840 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1d850 3b 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63  ;       /* Objec
1d860 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 65  t to pass to xBe
1d870 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 69  stIndex() */.  i
1d880 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
1d890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d8a0 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
1d8b0 69 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20 20 69  ints in p */.  i
1d8c0 6e 74 20 62 49 6e 3b 20 20 20 20 20 20 20 20 20  nt bIn;         
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d8e0 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65 73  rue if plan uses
1d8f0 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f   IN(...) operato
1d900 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
1d910 20 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d 61 73   *pNew;.  Bitmas
1d920 6b 20 6d 42 65 73 74 3b 20 20 20 20 20 20 20 20  k mBest;        
1d930 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
1d940 20 75 73 65 64 20 62 79 20 62 65 73 74 20 70 6f   used by best po
1d950 73 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a 20  ssible plan */. 
1d960 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20   u16 mNoOmit;.. 
1d970 20 61 73 73 65 72 74 28 20 28 6d 50 72 65 72 65   assert( (mPrere
1d980 71 20 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d 3d  q & mUnusable)==
1d990 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  0 );.  pWInfo = 
1d9a0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1d9b0 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ;.  pParse = pWI
1d9c0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70  nfo->pParse;.  p
1d9d0 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
1d9e0 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  WC;.  pNew = pBu
1d9f0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
1da00 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  Src = &pWInfo->p
1da10 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d  TabList->a[pNew-
1da20 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73 65 72 74  >iTab];.  assert
1da30 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72 63  ( IsVirtual(pSrc
1da40 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20 70 20 3d  ->pTab) );.  p =
1da50 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
1da60 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  fo(pParse, pWC, 
1da70 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72 63 2c  mUnusable, pSrc,
1da80 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65   pBuilder->pOrde
1da90 72 42 79 2c 20 0a 20 20 20 20 20 20 26 6d 4e 6f  rBy, .      &mNo
1daa0 4f 6d 69 74 29 3b 0a 20 20 69 66 28 20 70 3d 3d  Omit);.  if( p==
1dab0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1dac0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1dad0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1dae0 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
1daf0 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41  s = WHERE_VIRTUA
1db00 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e  LTABLE;.  pNew->
1db10 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e  nLTerm = 0;.  pN
1db20 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
1db30 72 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f 6e 73  ree = 0;.  nCons
1db40 74 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43 6f 6e  traint = p->nCon
1db50 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77  straint;.  if( w
1db60 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70  hereLoopResize(p
1db70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c  Parse->db, pNew,
1db80 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b   nConstraint) ){
1db90 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1dba0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
1dbb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1dbc0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1dbd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74  .  }..  /* First
1dbe0 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78   call xBestIndex
1dbf0 28 29 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73  () with all cons
1dc00 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2e 20  traints usable. 
1dc10 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  */.  WHERETRACE(
1dc20 30 78 38 30 30 2c 20 28 22 42 45 47 49 4e 20 25  0x800, ("BEGIN %
1dc30 73 2e 61 64 64 56 69 72 74 75 61 6c 28 29 5c 6e  s.addVirtual()\n
1dc40 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  ", pSrc->pTab->z
1dc50 4e 61 6d 65 29 29 3b 0a 20 20 57 48 45 52 45 54  Name));.  WHERET
1dc60 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1dc70 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75  irtualOne: all u
1dc80 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63  sable\n"));.  rc
1dc90 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1dca0 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64  irtualOne(pBuild
1dcb0 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c  er, mPrereq, ALL
1dcc0 42 49 54 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f  BITS, 0, p, mNoO
1dcd0 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f  mit, &bIn);..  /
1dce0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
1dcf0 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77 69   xBestIndex() wi
1dd00 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61  th all terms ena
1dd10 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20 61 20  bled produced a 
1dd20 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64  plan.  ** that d
1dd30 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
1dd40 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62 6c 65  any source table
1dd50 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77  s (IOW: a plan w
1dd60 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c 0a 20  ith mBest==0),. 
1dd70 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
1dd80 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 6d 61  s no point in ma
1dd90 6b 69 6e 67 20 61 6e 79 20 66 75 72 74 68 65 72  king any further
1dda0 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1ddb0 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20 73 69 6e  ndex() .  ** sin
1ddc0 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c  ce they will all
1ddd0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
1dde0 20 72 65 73 75 6c 74 20 28 69 66 20 74 68 65 20   result (if the 
1ddf0 78 42 65 73 74 49 6e 64 65 78 28 29 0a 20 20 2a  xBestIndex().  *
1de00 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1de10 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a 20 20   is sane). */.  
1de20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1de30 4b 20 26 26 20 28 6d 42 65 73 74 20 3d 20 28 70  K && (mBest = (p
1de40 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d  New->prereq & ~m
1de50 50 72 65 72 65 71 29 29 21 3d 30 20 29 7b 0a 20  Prereq))!=0 ){. 
1de60 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 20     int seenZero 
1de70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1de80 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70 6c   /* True if a pl
1de90 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65  an with no prere
1dea0 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69  qs seen */.    i
1deb0 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20  nt seenZeroNoIN 
1dec0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1ded0 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65  Plan with no pre
1dee0 72 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e 28 2e  reqs and no IN(.
1def0 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20  ..) seen */.    
1df00 42 69 74 6d 61 73 6b 20 6d 50 72 65 76 20 3d 20  Bitmask mPrev = 
1df10 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  0;.    Bitmask m
1df20 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20  BestNoIn = 0;.. 
1df30 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 6c 61     /* If the pla
1df40 6e 20 70 72 6f 64 75 63 65 64 20 62 79 20 74 68  n produced by th
1df50 65 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 75  e earlier call u
1df60 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 74  ses an IN(...) t
1df70 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  erm, call.    **
1df80 20 78 42 65 73 74 49 6e 64 65 78 20 61 67 61 69   xBestIndex agai
1df90 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69 74  n, this time wit
1dfa0 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 73 20  h IN(...) terms 
1dfb0 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20  disabled. */.   
1dfc0 20 69 66 28 20 62 49 6e 20 29 7b 0a 20 20 20 20   if( bIn ){.    
1dfd0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34    WHERETRACE(0x4
1dfe0 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e  0, ("  VirtualOn
1dff0 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20 77 2f  e: all usable w/
1e000 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  o IN\n"));.     
1e010 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1e020 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1e030 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1e040 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49  , mPrereq, ALLBI
1e050 54 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e  TS, WO_IN, p, mN
1e060 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1e070 20 20 20 20 61 73 73 65 72 74 28 20 62 49 6e 3d      assert( bIn=
1e080 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 42 65 73  =0 );.      mBes
1e090 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72  tNoIn = pNew->pr
1e0a0 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 3b  ereq & ~mPrereq;
1e0b0 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65 73 74  .      if( mBest
1e0c0 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NoIn==0 ){.     
1e0d0 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b     seenZero = 1;
1e0e0 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1e0f0 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20  oNoIN = 1;.     
1e100 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1e110 20 43 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78   Call xBestIndex
1e120 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 64   once for each d
1e130 69 73 74 69 6e 63 74 20 76 61 6c 75 65 20 6f 66  istinct value of
1e140 20 28 70 72 65 72 65 71 52 69 67 68 74 20 26 20   (prereqRight & 
1e150 7e 6d 50 72 65 72 65 71 29 20 0a 20 20 20 20 2a  ~mPrereq) .    *
1e160 2a 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  * in the set of 
1e170 74 65 72 6d 73 20 74 68 61 74 20 61 70 70 6c 79  terms that apply
1e180 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1e190 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
1e1a0 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  */.    while( rc
1e1b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e1c0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1e1d0 20 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20    Bitmask mNext 
1e1e0 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20  = ALLBITS;.     
1e1f0 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74 3e 30   assert( mNext>0
1e200 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
1e210 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1e220 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1e230 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20  Bitmask mThis = 
1e240 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57  (.            pW
1e250 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61  C->a[p->aConstra
1e260 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
1e270 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74 20  et].prereqRight 
1e280 26 20 7e 6d 50 72 65 72 65 71 0a 20 20 20 20 20  & ~mPrereq.     
1e290 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1e2a0 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26 26  ( mThis>mPrev &&
1e2b0 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d   mThis<mNext ) m
1e2c0 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20  Next = mThis;.  
1e2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72 65      }.      mPre
1e2e0 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20  v = mNext;.     
1e2f0 20 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42   if( mNext==ALLB
1e300 49 54 53 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ITS ) break;.   
1e310 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42     if( mNext==mB
1e320 65 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42  est || mNext==mB
1e330 65 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e  estNoIn ) contin
1e340 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ue;.      WHERET
1e350 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1e360 69 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76  irtualOne: mPrev
1e370 3d 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30  =%04llx mNext=%0
1e380 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  4llx\n",.       
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1e3b0 6d 50 72 65 76 2c 20 28 73 71 6c 69 74 65 33 5f  mPrev, (sqlite3_
1e3c0 75 69 6e 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a  uint64)mNext));.
1e3d0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1e3e0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e  LoopAddVirtualOn
1e3f0 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  e(.          pBu
1e400 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1e410 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c 20 30  mNext|mPrereq, 0
1e420 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1e430 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  In);.      if( p
1e440 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d 50 72  New->prereq==mPr
1e450 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  ereq ){.        
1e460 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20  seenZero = 1;.  
1e470 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30        if( bIn==0
1e480 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20   ) seenZeroNoIN 
1e490 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1e4a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1e4b0 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  e calls to xBest
1e4c0 49 6e 64 65 78 28 29 20 69 6e 20 74 68 65 20 61  Index() in the a
1e4d0 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20 6e 6f  bove loop did no
1e4e0 74 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20  t find a plan.  
1e4f0 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72    ** that requir
1e500 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62  es no source tab
1e510 6c 65 73 20 61 74 20 61 6c 6c 20 28 69 2e 65 2e  les at all (i.e.
1e520 20 6f 6e 65 20 67 75 61 72 61 6e 74 65 65 64 20   one guaranteed 
1e530 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 73 61  to be.    ** usa
1e540 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63 61 6c  ble), make a cal
1e550 6c 20 68 65 72 65 20 77 69 74 68 20 61 6c 6c 20  l here with all 
1e560 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 64 69  source tables di
1e570 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66  sabled */.    if
1e580 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e590 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30 20 29  && seenZero==0 )
1e5a0 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
1e5b0 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72  CE(0x40, ("  Vir
1e5c0 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73  tualOne: all dis
1e5d0 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20 20 20  abled\n"));.    
1e5e0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1e5f0 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20  AddVirtualOne(. 
1e600 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65           pBuilde
1e610 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65  r, mPrereq, mPre
1e620 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d  req, 0, p, mNoOm
1e630 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20  it, &bIn);.     
1e640 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65   if( bIn==0 ) se
1e650 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a  enZeroNoIN = 1;.
1e660 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1e670 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42   the calls to xB
1e680 65 73 74 49 6e 64 65 78 28 29 20 68 61 76 65 20  estIndex() have 
1e690 73 6f 20 66 61 72 20 66 61 69 6c 65 64 20 74 6f  so far failed to
1e6a0 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20   find a plan.   
1e6b0 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72 65   ** that require
1e6c0 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c  s no source tabl
1e6d0 65 73 20 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f  es at all and do
1e6e0 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e  es not use an IN
1e6f0 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65  (...).    ** ope
1e700 72 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69  rator, make a fi
1e710 6e 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61  nal call to obta
1e720 69 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f  in one here.  */
1e730 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e740 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65  ITE_OK && seenZe
1e750 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20  roNoIN==0 ){.   
1e760 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1e770 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1e780 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64  ne: all disabled
1e790 20 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29   and w/o IN\n"))
1e7a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
1e7b0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1e7c0 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  One(.          p
1e7d0 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1e7e0 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f 49 4e  , mPrereq, WO_IN
1e7f0 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1e800 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  In);.    }.  }..
1e810 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46    if( p->needToF
1e820 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
1e830 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53  te3_free(p->idxS
1e840 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  tr);.  sqlite3Db
1e850 46 72 65 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64  FreeNN(pParse->d
1e860 62 2c 20 70 29 3b 0a 20 20 57 48 45 52 45 54 52  b, p);.  WHERETR
1e870 41 43 45 28 30 78 38 30 30 2c 20 28 22 45 4e 44  ACE(0x800, ("END
1e880 20 25 73 2e 61 64 64 56 69 72 74 75 61 6c 28 29   %s.addVirtual()
1e890 2c 20 72 63 3d 25 64 5c 6e 22 2c 20 70 53 72 63  , rc=%d\n", pSrc
1e8a0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 72  ->pTab->zName, r
1e8b0 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  c));.  return rc
1e8c0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1e8d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1e8e0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
1e8f0 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65   Add WhereLoop e
1e900 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65  ntries to handle
1e910 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73   OR terms.  This
1e920 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65   works for eithe
1e930 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76  r.** btrees or v
1e940 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a  irtual tables..*
1e950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
1e960 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57  reLoopAddOr(.  W
1e970 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1e980 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42 69  *pBuilder, .  Bi
1e990 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 0a  tmask mPrereq, .
1e9a0 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61    Bitmask mUnusa
1e9b0 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e  ble.){.  WhereIn
1e9c0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
1e9d0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
1e9e0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1e9f0 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  C;.  WhereLoop *
1ea00 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72  pNew;.  WhereTer
1ea10 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e  m *pTerm, *pWCEn
1ea20 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1ea30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
1ea40 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  Cur;.  WhereClau
1ea50 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65  se tempWC;.  Whe
1ea60 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53  reLoopBuilder sS
1ea70 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65  ubBuild;.  Where
1ea80 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72  OrSet sSum, sCur
1ea90 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1eaa0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1eab0 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c    .  pWC = pBuil
1eac0 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45  der->pWC;.  pWCE
1ead0 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
1eae0 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77  C->nTerm;.  pNew
1eaf0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1eb00 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75  w;.  memset(&sSu
1eb10 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75  m, 0, sizeof(sSu
1eb20 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  m));.  pItem = p
1eb30 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1eb40 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
1eb50 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
1eb60 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72  >iCursor;..  for
1eb70 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
1eb80 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72  Term<pWCEnd && r
1eb90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54  c==SQLITE_OK; pT
1eba0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
1ebb0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
1ebc0 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20  r & WO_OR)!=0.  
1ebd0 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
1ebe0 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
1ebf0 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  le & pNew->maskS
1ec00 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  elf)!=0 .    ){.
1ec10 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
1ec20 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20  e * const pOrWC 
1ec30 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
1ec40 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57  nfo->wc;.      W
1ec50 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74  hereTerm * const
1ec60 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72   pOrWCEnd = &pOr
1ec70 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65  WC->a[pOrWC->nTe
1ec80 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65  rm];.      Where
1ec90 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20  Term *pOrTerm;. 
1eca0 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20       int once = 
1ecb0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  1;.      int i, 
1ecc0 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53  j;.    .      sS
1ecd0 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c  ubBuild = *pBuil
1ece0 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42  der;.      sSubB
1ecf0 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20  uild.pOrderBy = 
1ed00 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  0;.      sSubBui
1ed10 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75  ld.pOrSet = &sCu
1ed20 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54  r;..      WHERET
1ed30 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 42 65  RACE(0x200, ("Be
1ed40 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f  gin processing O
1ed50 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20  R-clause %p\n", 
1ed60 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66  pTerm));.      f
1ed70 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43  or(pOrTerm=pOrWC
1ed80 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72  ->a; pOrTerm<pOr
1ed90 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b  WCEnd; pOrTerm++
1eda0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
1edb0 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
1edc0 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
1edd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
1ede0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f  bBuild.pWC = &pO
1edf0 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
1ee00 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d  o->wc;.        }
1ee10 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
1ee20 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
1ee30 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ur ){.          
1ee40 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20  tempWC.pWInfo = 
1ee50 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20  pWC->pWInfo;.   
1ee60 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f         tempWC.pO
1ee70 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
1ee80 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20        tempWC.op 
1ee90 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
1eea0 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d      tempWC.nTerm
1eeb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1eec0 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65  tempWC.a = pOrTe
1eed0 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  rm;.          sS
1eee0 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74  ubBuild.pWC = &t
1eef0 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d  empWC;.        }
1ef00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ef10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ef20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72    }.        sCur
1ef30 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57  .n = 0;.#ifdef W
1ef40 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
1ef50 44 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  D.        WHERET
1ef60 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52  RACE(0x200, ("OR
1ef70 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68  -term %d of %p h
1ef80 61 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c  as %d subterms:\
1ef90 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
1efa0 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f          (int)(pO
1efb0 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c  rTerm-pOrWC->a),
1efc0 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c   pTerm, sSubBuil
1efd0 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a  d.pWC->nTerm));.
1efe0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1eff0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
1f000 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20  0x400 ){.       
1f010 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
1f020 6c 61 75 73 65 50 72 69 6e 74 28 73 53 75 62 42  lausePrint(sSubB
1f030 75 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20 20 20  uild.pWC);.     
1f040 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e     }.#endif.#ifn
1f050 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f060 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1f070 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
1f080 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
1f090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1f0a0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1f0b0 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64  rtual(&sSubBuild
1f0c0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
1f0d0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  able);.        }
1f0e0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
1f0f0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
1f100 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1f110 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c  dBtree(&sSubBuil
1f120 64 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20  d, mPrereq);.   
1f130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1f140 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1f160 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f   = whereLoopAddO
1f170 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50  r(&sSubBuild, mP
1f180 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65  rereq, mUnusable
1f190 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f1a0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
1f1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43  =SQLITE_OK || sC
1f1c0 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ur.n==0 );.     
1f1d0 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30     if( sCur.n==0
1f1e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
1f1f0 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
1f200 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1f210 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63     }else if( onc
1f220 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
1f230 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d  hereOrMove(&sSum
1f240 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20  , &sCur);.      
1f250 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
1f260 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f270 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65         WhereOrSe
1f280 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20  t sPrev;.       
1f290 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
1f2a0 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20  sPrev, &sSum);. 
1f2b0 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
1f2c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
1f2d0 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e  or(i=0; i<sPrev.
1f2e0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1f2f0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1f300 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  sCur.n; j++){.  
1f310 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
1f320 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c  eOrInsert(&sSum,
1f330 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72   sPrev.a[i].prer
1f340 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70  eq | sCur.a[j].p
1f350 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f370 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
1f380 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72  Add(sPrev.a[i].r
1f390 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72  Run, sCur.a[j].r
1f3a0 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Run),.          
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1f3d0 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f  dd(sPrev.a[i].nO
1f3e0 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f  ut, sCur.a[j].nO
1f3f0 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ut));.          
1f400 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1f410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f420 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  }.      pNew->nL
1f430 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
1f440 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
1f450 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
1f460 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1f470 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
1f480 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
1f490 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
1f4a0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
1f4b0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1f4c0 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
1f4d0 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
1f4e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
1f4f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
1f500 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Sum.n; i++){.   
1f510 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
1f520 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61  Currently sSum.a
1f530 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20  [i].rRun is set 
1f540 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  to the sum of th
1f550 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20  e costs.        
1f560 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63  ** of all sub-sc
1f570 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20  ans required by 
1f580 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77  the OR-scan. How
1f590 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75  ever, due to rou
1f5a0 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nding.        **
1f5b0 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20   errors, it may 
1f5c0 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  be that the cost
1f5d0 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20   of the OR-scan 
1f5e0 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a  is equal to its.
1f5f0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20          ** most 
1f600 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63  expensive sub-sc
1f610 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c  an. Add the smal
1f620 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65  lest possible pe
1f630 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a  nalty .        *
1f640 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  * (equivalent to
1f650 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65   multiplying the
1f660 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74   cost by 1.07) t
1f670 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20  o ensure that . 
1f680 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64         ** this d
1f690 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20  oes not happen. 
1f6a0 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57  Otherwise, for W
1f6b0 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63  HERE clauses suc
1f6c0 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  h as the.       
1f6d0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68   ** following wh
1f6e0 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
1f6f0 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20  index on "y":.  
1f700 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1f710 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69   **     WHERE li
1f720 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e  kelihood(x=?, 0.
1f730 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20  99) OR y=?.     
1f740 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1f750 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79   the planner may
1f760 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74   elect to "OR" t
1f770 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74  ogether a full-t
1f780 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e  able scan and an
1f790 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
1f7a0 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74  x lookup. And ot
1f7b0 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64  her similarly od
1f7c0 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20  d results.  */. 
1f7d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
1f7e0 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
1f7f0 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  un + 1;.        
1f800 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
1f810 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
1f820 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
1f830 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
1f840 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
1f850 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1f860 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1f870 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
1f880 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1f890 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73  00, ("End proces
1f8a0 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
1f8b0 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
1f8c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1f8d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1f8e0 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
1f8f0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
1f900 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74   tables .*/.stat
1f910 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1f920 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70  AddAll(WhereLoop
1f930 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1f940 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
1f950 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
1f960 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69  er->pWInfo;.  Bi
1f970 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 3d 20  tmask mPrereq = 
1f980 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  0;.  Bitmask mPr
1f990 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ior = 0;.  int i
1f9a0 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Tab;.  SrcList *
1f9b0 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
1f9c0 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
1f9d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1f9e0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72  em *pItem;.  str
1f9f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1fa00 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69   *pEnd = &pTabLi
1fa10 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  st->a[pWInfo->nL
1fa20 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33  evel];.  sqlite3
1fa30 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
1fa40 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
1fa50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fa60 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
1fa70 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f  ew;.  u8 priorJo
1fa80 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f  intype = 0;..  /
1fa90 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  * Loop over the 
1faa0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
1fab0 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  in, from left to
1fac0 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77   right */.  pNew
1fad0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1fae0 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  w;.  whereLoopIn
1faf0 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28  it(pNew);.  for(
1fb00 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54  iTab=0, pItem=pT
1fb10 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d  abList->a; pItem
1fb20 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70  <pEnd; iTab++, p
1fb30 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74  Item++){.    Bit
1fb40 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d  mask mUnusable =
1fb50 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54   0;.    pNew->iT
1fb60 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  ab = iTab;.    p
1fb70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  New->maskSelf = 
1fb80 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
1fb90 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
1fba0 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43  skSet, pItem->iC
1fbb0 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
1fbc0 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  ((pItem->fg.join
1fbd0 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79  type|priorJointy
1fbe0 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  pe) & (JT_LEFT|J
1fbf0 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a  T_CROSS))!=0 ){.
1fc00 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
1fc10 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
1fc20 77 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68  when pItem is th
1fc30 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1fc40 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20  rm on the.      
1fc50 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69  ** right-hand-si
1fc60 64 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20  de of a LEFT or 
1fc70 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a  CROSS JOIN.  */.
1fc80 20 20 20 20 20 20 6d 50 72 65 72 65 71 20 3d 20        mPrereq = 
1fc90 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  mPrior;.    }.  
1fca0 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20    priorJointype 
1fcb0 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  = pItem->fg.join
1fcc0 74 79 70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  type;.#ifndef SQ
1fcd0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1fce0 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49  LTABLE.    if( I
1fcf0 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
1fd00 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73  pTab) ){.      s
1fd10 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1fd20 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  em *p;.      for
1fd30 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c  (p=&pItem[1]; p<
1fd40 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
1fd50 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c      if( mUnusabl
1fd60 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e  e || (p->fg.join
1fd70 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1fd80 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20  JT_CROSS)) ){.  
1fd90 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c          mUnusabl
1fda0 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  e |= sqlite3Wher
1fdb0 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
1fdc0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69  ->sMaskSet, p->i
1fdd0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
1fde0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1fdf0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1fe00 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
1fe10 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e  er, mPrereq, mUn
1fe20 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c  usable);.    }el
1fe30 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
1fe40 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1fe50 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a 20  TABLE */.    {. 
1fe60 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1fe70 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69  oopAddBtree(pBui
1fe80 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 29 3b 0a  lder, mPrereq);.
1fe90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1fea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1feb0 42 75 69 6c 64 65 72 2d 3e 70 57 43 2d 3e 68 61  Builder->pWC->ha
1fec0 73 4f 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  sOr ){.      rc 
1fed0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1fee0 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1fef0 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1ff00 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
1ff10 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
1ff20 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
1ff30 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1ff40 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
1ff50 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
1ff60 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72  r(db, pNew);.  r
1ff70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ff80 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65  ** Examine a Whe
1ff90 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65  rePath (with the
1ffa0 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
1ffb0 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70   extra WhereLoop
1ffc0 20 6f 66 20 74 68 65 20 36 74 68 0a 2a 2a 20 70   of the 6th.** p
1ffd0 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65  arameters) to se
1ffe0 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
1fff0 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
20000 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
20010 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
20020 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
20030 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  g a separate sor
20040 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65  t operation.  Re
20050 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20  turn N:.** .**  
20060 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20   N>0:   N terms 
20070 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
20080 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73  clause are satis
20090 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20  fied.**   N==0: 
200a0 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65   No terms of the
200b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
200c0 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
200d0 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f  *   N<0:   Unkno
200e0 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20  wn yet how many 
200f0 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42  terms of ORDER B
20100 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73  Y might be satis
20110 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e  fied.   .**.** N
20120 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
20130 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
20140 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
20150 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
20160 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
20170 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
20180 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
20190 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
201a0 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
201b0 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
201c0 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
201d0 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
201e0 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
201f0 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43  Y.** and DISTINC
20200 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  T do not require
20210 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20   rows to appear 
20220 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  in any particula
20230 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a  r order as long.
20240 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74  ** as equivalent
20250 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65   rows are groupe
20260 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75  d together.  Thu
20270 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61  s for GROUP BY a
20280 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74  nd DISTINCT.** t
20290 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  he pOrderBy term
202a0 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64  s can be matched
202b0 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20   in any order.  
202c0 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74  With ORDER BY, t
202d0 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  he .** pOrderBy 
202e0 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61  terms must be ma
202f0 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20  tched in strict 
20300 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72  left-to-right or
20310 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
20320 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  8 wherePathSatis
20330 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
20340 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
20350 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
20360 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
20370 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
20380 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
20390 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
203a0 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
203b0 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
203c0 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
203d0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
203e0 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
203f0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
20400 2c 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45  ,       /* WHERE
20410 5f 47 52 4f 55 50 42 59 20 6f 72 20 5f 44 49 53  _GROUPBY or _DIS
20420 54 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44 45  TINCTBY or _ORDE
20430 52 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 75  RBY_LIMIT */.  u
20440 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  16 nLoop,       
20450 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20460 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
20470 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
20480 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
20490 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  t,     /* Add th
204a0 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
204b0 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
204c0 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42  ->aLoop[] */.  B
204d0 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b  itmask *pRevMask
204e0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73       /* OUT: Mas
204f0 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  k of WhereLoops 
20500 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73  to run in revers
20510 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  e order */.){.  
20520 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20  u8 revSet;      
20530 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20540 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f   rev is known */
20550 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20  .  u8 rev;      
20560 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
20570 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72  osite sort order
20580 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b   */.  u8 revIdx;
20590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
205a0 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20  ndex sort order 
205b0 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44  */.  u8 isOrderD
205c0 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c  istinct;   /* Al
205d0 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  l prior WhereLoo
205e0 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73  ps are order-dis
205f0 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69  tinct */.  u8 di
20600 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20  stinctColumns;  
20610 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
20620 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20  loop has UNIQUE 
20630 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
20640 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68   */.  u8 isMatch
20650 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
20660 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61  Column matches a
20670 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
20680 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
20690 20 20 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b 20    u16 eqOpMask; 
206a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77          /* Allow
206b0 65 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  ed equality oper
206c0 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20 6e  ators */.  u16 n
206d0 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
206e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65   /* Number of ke
206f0 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e  y columns in pIn
20700 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f  dex */.  u16 nCo
20710 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
20720 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
20730 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e  f ordered column
20740 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
20750 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79  /.  u16 nOrderBy
20760 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
20770 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ber terms in the
20780 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20790 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
207a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
207b0 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ndex of WhereLoo
207c0 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67  p in pPath being
207d0 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
207e0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
207f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
20800 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
20810 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
20820 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
20830 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57  er for current W
20840 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  hereLoop */.  in
20850 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
20860 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
20870 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61  number within ta
20880 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68  ble iCur */.  Wh
20890 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
208a0 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57   0; /* Current W
208b0 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70  hereLoop being p
208c0 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57  rocessed. */.  W
208d0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
208e0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
208f0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
20900 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
20910 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
20920 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65       /* An expre
20930 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
20940 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
20950 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
20960 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c  ll;       /* COL
20970 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72  LATE function fr
20980 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  om an ORDER BY c
20990 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
209a0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
209b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
209c0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
209d0 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71  th pLoop */.  sq
209e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
209f0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20  fo->pParse->db; 
20a00 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
20a10 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  nection */.  Bit
20a20 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20  mask obSat = 0; 
20a30 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
20a40 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
20a50 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f  isfied so far */
20a60 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e  .  Bitmask obDon
20a70 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  e;       /* Mask
20a80 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   of all ORDER BY
20a90 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
20aa0 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ask orderDistinc
20ab0 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20  tMask;  /* Mask 
20ac0 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65  of all well-orde
20ad0 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42  red loops */.  B
20ae0 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20  itmask ready;   
20af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20b00 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70  sk of inner loop
20b10 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  s */..  /*.  ** 
20b20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
20b30 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77  Loop is "one-row
20b40 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65  " if it generate
20b50 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
20b60 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f  ne.  ** row of o
20b70 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c  utput.  A WhereL
20b80 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69  oop is one-row i
20b90 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
20ba0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
20bb0 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69  .  **  (a) All i
20bc0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74  ndex columns mat
20bd0 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f  ch with WHERE_CO
20be0 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28  LUMN_EQ..  **  (
20bf0 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  b) The index is 
20c00 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20  unique.  ** Any 
20c10 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
20c20 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  n WHERE_COLUMN_E
20c30 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  Q constraint on 
20c40 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65  the rowid is one
20c50 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79  -row..  ** Every
20c60 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
20c70 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65  op will have the
20c80 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69   WHERE_ONEROW bi
20c90 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73  t set in wsFlags
20ca0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  **.  ** We s
20cb0 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
20cc0 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69   is "order-disti
20cd0 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20  nct" if the set 
20ce0 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a  of columns from.
20cf0 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c    ** that WhereL
20d00 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20  oop that are in 
20d10 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
20d20 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  use are differen
20d30 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a  t for every.  **
20d40 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72   row of the Wher
20d50 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e  eLoop.  Every on
20d60 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
20d70 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
20d80 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74  .  ** order-dist
20d90 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c  inct.   A WhereL
20da0 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20  oop that has no 
20db0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f  columns in the O
20dc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
20dd0 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72   ** is not order
20de0 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65  -distinct. To be
20df0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
20e00 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65  is not quite the
20e10 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20   same as being. 
20e20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65   ** UNIQUE since
20e30 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e   a UNIQUE column
20e40 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61   or index can ha
20e50 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ve multiple rows
20e60 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20   that .  ** are 
20e70 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61  NULL and NULL va
20e80 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c  lues are equival
20e90 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70  ent for the purp
20ea0 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73  ose of order-dis
20eb0 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62  tinct..  ** To b
20ec0 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
20ed0 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75  , the columns mu
20ee0 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64  st be UNIQUE and
20ef0 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   NOT NULL..  **.
20f00 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
20f10 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c  or a table is al
20f20 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20  ways UNIQUE and 
20f30 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e  NOT NULL so when
20f40 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f  ever the.  ** ro
20f50 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74  wid appears in t
20f60 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
20f70 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  se, the correspo
20f80 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  nding WhereLoop 
20f90 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  is.  ** automati
20fa0 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74  cally order-dist
20fb0 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73  inct..  */..  as
20fc0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
20fd0 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70  0 );.  if( nLoop
20fe0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
20ff0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
21000 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
21010 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
21020 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
21030 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
21040 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65   testcase( nOrde
21050 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  rBy==BMS-1 );.  
21060 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53  if( nOrderBy>BMS
21070 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  -1 ) return 0;  
21080 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69  /* Cannot optimi
21090 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20  ze overly large 
210a0 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69  ORDER BYs */.  i
210b0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
210c0 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d   1;.  obDone = M
210d0 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29  ASKBIT(nOrderBy)
210e0 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69  -1;.  orderDisti
210f0 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72  nctMask = 0;.  r
21100 65 61 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f 70  eady = 0;.  eqOp
21110 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20 57  Mask = WO_EQ | W
21120 4f 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c  O_IS | WO_ISNULL
21130 3b 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ;.  if( wctrlFla
21140 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
21150 42 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70 4d  BY_LIMIT ) eqOpM
21160 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20  ask |= WO_IN;.  
21170 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f  for(iLoop=0; isO
21180 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20  rderDistinct && 
21190 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20  obSat<obDone && 
211a0 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c  iLoop<=nLoop; iL
211b0 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  oop++){.    if( 
211c0 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20  iLoop>0 ) ready 
211d0 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
211e0 6c 66 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  lf;.    if( iLoo
211f0 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20  p<nLoop ){.     
21200 20 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d 3e   pLoop = pPath->
21210 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20  aLoop[iLoop];.  
21220 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
21230 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
21240 42 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74 69  BY_LIMIT ) conti
21250 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nue;.    }else{.
21260 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c        pLoop = pL
21270 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ast;.    }.    i
21280 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
21290 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
212a0 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  LTABLE ){.      
212b0 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  if( pLoop->u.vta
212c0 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62  b.isOrdered ) ob
212d0 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20  Sat = obDone;.  
212e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
212f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 6f  else{.      pLoo
21300 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43  p->u.btree.nIdxC
21310 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ol = 0;.    }.  
21320 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d    iCur = pWInfo-
21330 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
21340 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f  op->iTab].iCurso
21350 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  r;..    /* Mark 
21360 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59  off any ORDER BY
21370 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20   term X that is 
21380 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
21390 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20  table of.    ** 
213a0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
213b0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65   for which there
213c0 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20   is term in the 
213d0 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61  WHERE.    ** cla
213e0 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
213f0 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f  X IS NULL or X=?
21400 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
21410 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a  only outer.    *
21420 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a  * loops..    */.
21430 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
21440 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
21450 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
21460 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
21470 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f  ntinue;.      pO
21480 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
21490 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
214a0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
214b0 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
214c0 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
214d0 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
214e0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  e;.      if( pOB
214f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
21500 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
21510 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c       pTerm = sql
21520 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
21530 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  m(&pWInfo->sWC, 
21540 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69  iCur, pOBExpr->i
21550 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e                 ~
21570 72 65 61 64 79 2c 20 65 71 4f 70 4d 61 73 6b 2c  ready, eqOpMask,
21580 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
21590 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
215a0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
215b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
215c0 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
215d0 20 2f 2a 20 49 4e 20 74 65 72 6d 73 20 61 72 65   /* IN terms are
215e0 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20   only valid for 
215f0 73 6f 72 74 69 6e 67 20 69 6e 20 74 68 65 20 4f  sorting in the O
21600 52 44 45 52 20 42 59 20 4c 49 4d 49 54 20 0a 20  RDER BY LIMIT . 
21610 20 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69         ** optimi
21620 7a 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 6e  zation, and then
21630 20 6f 6e 6c 79 20 69 66 20 74 68 65 79 20 61 72   only if they ar
21640 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 0a  e actually used.
21650 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 74 68          ** by th
21660 65 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  e query plan */.
21670 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21680 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
21690 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  RE_ORDERBY_LIMIT
216a0 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
216b0 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c  j=0; j<pLoop->nL
216c0 54 65 72 6d 20 26 26 20 70 54 65 72 6d 21 3d 70  Term && pTerm!=p
216d0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
216e0 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   j++){}.        
216f0 69 66 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c  if( j>=pLoop->nL
21700 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Term ) continue;
21710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21720 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
21730 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49  ator&(WO_EQ|WO_I
21740 53 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70  S))!=0 && pOBExp
21750 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  r->iColumn>=0 ){
21760 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
21770 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d  ite3ExprCollSeqM
21780 61 74 63 68 28 70 57 49 6e 66 6f 2d 3e 70 50 61  atch(pWInfo->pPa
21790 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
217a0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
217b0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 54  ->a[i].pExpr, pT
217c0 65 72 6d 2d 3e 70 45 78 70 72 29 3d 3d 30 20 29  erm->pExpr)==0 )
217d0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
217e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
217f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
21800 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
21810 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
21820 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
21830 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
21840 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
21850 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
21860 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
21870 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
21880 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
21890 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
218a0 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
218b0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
218c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
218d0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
218e0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
218f0 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
21900 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
21910 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
21920 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
21930 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
21940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
21950 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
21960 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
21970 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
21980 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
21990 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
219a0 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
219b0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
219c0 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
219d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
219e0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
219f0 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f  [nColumn-1]==XN_
21a00 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 20  ROWID.          
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
21a30 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20  dex->pTable));. 
21a40 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
21a50 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75  stinct = IsUniqu
21a60 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
21a70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
21a80 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
21a90 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
21aa0 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c  e index and deal
21ab0 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20   with the ones. 
21ac0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
21ad0 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
21ae0 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20   by == or IN..  
21af0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76      */.      rev
21b00 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20   = revSet = 0;. 
21b10 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
21b20 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  umns = 0;.      
21b30 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75  for(j=0; j<nColu
21b40 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
21b50 20 20 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b 20    u8 bOnce = 1; 
21b60 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
21b70 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
21b80 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
21b90 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 70      assert( j>=p
21ba0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
21bb0 71 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  q .            |
21bc0 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  | (pLoop->aLTerm
21bd0 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f 6f  [j]==0)==(j<pLoo
21be0 70 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20 20  p->nSkip).      
21bf0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
21c00 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
21c10 65 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f 6f  e.nEq && j>=pLoo
21c20 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  p->nSkip ){.    
21c30 20 20 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20        u16 eOp = 
21c40 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
21c50 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20 20  ->eOperator;..  
21c60 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
21c70 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 61  over == and IS a
21c80 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73 2e  nd ISNULL terms.
21c90 20 20 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e 20    (Also skip IN 
21ca0 74 65 72 6d 73 20 77 68 65 6e 0a 20 20 20 20 20  terms when.     
21cb0 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57 48       ** doing WH
21cc0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
21cd0 54 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 20 0a  T processing). .
21ce0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
21cf0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
21d00 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
21d10 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20   a column of an 
21d20 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43  ((?,?) IN (SELEC
21d30 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20 20 20  T...)) .        
21d40 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
21d50 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 53 45  for which the SE
21d60 4c 45 43 54 20 72 65 74 75 72 6e 73 20 6d 6f 72  LECT returns mor
21d70 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d  e than one colum
21d80 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  n,.          ** 
21d90 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73  check that it is
21da0 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e   the only column
21db0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6c 6f   used by this lo
21dc0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  op. Otherwise,. 
21dd0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69           ** if i
21de0 74 20 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f 20  t is one of two 
21df0 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f 66  or more, none of
21e00 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61 6e   the columns can
21e10 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
21e20 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 6d   considered to m
21e30 61 74 63 68 20 61 6e 20 4f 52 44 45 52 20 42 59  atch an ORDER BY
21e40 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 20   term.  */.     
21e50 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
21e60 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a  eqOpMask)!=0 ){.
21e70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21e80 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
21e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21ea0 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
21eb0 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  erDistinct );.  
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
21ed0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
21ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21ef0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
21f00 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 20  nue;  .         
21f10 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
21f20 53 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 29  S(eOp & WO_IN) )
21f30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
21f40 20 41 4c 57 41 59 53 28 29 20 6a 75 73 74 69 66   ALWAYS() justif
21f50 69 63 61 74 69 6f 6e 3a 20 65 4f 70 20 69 73 20  ication: eOp is 
21f60 61 6e 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  an equality oper
21f70 61 74 6f 72 20 64 75 65 20 74 6f 20 74 68 65 0a  ator due to the.
21f80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6a              ** j
21f90 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
21fa0 6e 45 71 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  nEq constraint a
21fb0 62 6f 76 65 2e 20 20 41 6e 79 20 65 71 75 61 6c  bove.  Any equal
21fc0 69 74 79 20 6f 74 68 65 72 0a 20 20 20 20 20 20  ity other.      
21fd0 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 57 4f        ** than WO
21fe0 5f 49 4e 20 69 73 20 63 61 70 74 75 72 65 64 20  _IN is captured 
21ff0 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
22000 22 69 66 22 2e 20 20 53 6f 20 74 68 69 73 20 6f  "if".  So this o
22010 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ne.            *
22020 2a 20 61 6c 77 61 79 73 20 68 61 73 20 74 6f 20  * always has to 
22030 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20 20  be WO_IN. */.   
22040 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
22050 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  X = pLoop->aLTer
22060 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  m[j]->pExpr;.   
22070 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a           for(i=j
22080 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62  +1; i<pLoop->u.b
22090 74 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a  tree.nEq; i++){.
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
220b0 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  ( pLoop->aLTerm[
220c0 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29 7b  i]->pExpr==pX ){
220d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
220e0 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
220f0 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70 65  >aLTerm[i]->eOpe
22100 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20 29  rator & WO_IN) )
22110 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22120 20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20    bOnce = 0;.   
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
22140 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
22150 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22160 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
22170 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
22180 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
22190 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
221a0 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
221b0 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
221c0 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
221d0 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
221e0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
221f0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
22200 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
22210 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dex ){.         
22220 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   iColumn = pInde
22230 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
22240 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
22250 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
22260 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
22270 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
22280 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
22290 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e  >iPKey ) iColumn
222a0 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
222b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
222c0 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
222d0 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  XN_ROWID;.      
222e0 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
222f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
22300 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
22310 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
22320 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
22330 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
22340 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
22350 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
22360 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20  l-ordered.      
22370 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
22380 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
22390 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
223a0 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
223b0 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
223c0 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
223d0 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
223e0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
223f0 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
22400 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
22410 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
22420 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
22430 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
22440 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
22450 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
22460 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
22470 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
22480 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
22490 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20  x and mark that 
224a0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66  ORDER BY term of
224b0 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  f .        */.  
224c0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
224d0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
224e0 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e  =0; bOnce && i<n
224f0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
22500 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53           if( MAS
22510 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
22520 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22530 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
22540 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
22550 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
22560 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
22570 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22580 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
22590 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
225a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
225b0 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
225c0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
225d0 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Y );.          i
225e0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
225f0 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c   (WHERE_GROUPBY|
22600 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
22610 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20  ))==0 ) bOnce = 
22620 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
22630 20 69 43 6f 6c 75 6d 6e 3e 3d 58 4e 5f 52 4f 57   iColumn>=XN_ROW
22640 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ID ){.          
22650 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
22660 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
22670 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
22680 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
22690 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
226a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
226b0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
226c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
226d0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
226e0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
226f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
22700 70 72 20 2a 70 49 64 78 45 78 70 72 20 3d 20 70  pr *pIdxExpr = p
22710 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d  Index->aColExpr-
22720 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[j].pExpr;.   
22730 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
22740 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53  ite3ExprCompareS
22750 6b 69 70 28 70 4f 42 45 78 70 72 2c 20 70 49 64  kip(pOBExpr, pId
22760 78 45 78 70 72 2c 20 69 43 75 72 29 20 29 7b 0a  xExpr, iCur) ){.
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
22780 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
22790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
227a0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
227b0 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 52 4f 57 49  iColumn!=XN_ROWI
227c0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
227d0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
227e0 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57  ExprNNCollSeq(pW
227f0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
22800 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
22810 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
22820 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
22830 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
22840 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
22850 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
22860 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
22870 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
22880 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c  >u.btree.nIdxCol
22890 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20   = j+1;.        
228a0 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
228b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
228c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
228d0 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26    if( isMatch &&
228e0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
228f0 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
22900 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
22910 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
22920 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
22930 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
22940 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
22950 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
22960 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
22970 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
22980 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
22990 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
229a0 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
229b0 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
229c0 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
229d0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
229e0 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20  ) isMatch = 0;. 
229f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
22a00 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
22a10 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
22a20 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
22a30 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
22a40 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76   if( rev ) *pRev
22a50 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28  Mask |= MASKBIT(
22a60 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
22a70 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
22a80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22a90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
22aa0 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20  ( isMatch ){.   
22ab0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
22ac0 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a  mn==XN_ROWID ){.
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
22ae0 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
22af0 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
22b00 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
22b10 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
22b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22b30 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
22b40 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
22b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22b60 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75   /* No match fou
22b70 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
22b80 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b  if( j==0 || j<nK
22b90 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
22ba0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
22bb0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d  sOrderDistinct!=
22bc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
22bd0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
22be0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22bf0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
22c00 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
22c10 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70     } /* end Loop
22c20 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20   over all index 
22c30 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
22c40 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c   if( distinctCol
22c50 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20  umns ){.        
22c60 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
22c70 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  rDistinct==0 );.
22c80 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
22c90 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
22ca0 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
22cb0 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  d-if not one-row
22cc0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b   */..    /* Mark
22cd0 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f   off any other O
22ce0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
22cf0 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f  at reference pLo
22d00 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  op */.    if( is
22d10 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
22d20 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74  .      orderDist
22d30 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f  inctMask |= pLoo
22d40 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
22d50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
22d60 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
22d70 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
22d80 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
22d90 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
22da0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
22db0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
22dc0 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
22dd0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
22de0 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d  r;.        mTerm
22df0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
22e00 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f  xprUsage(&pWInfo
22e10 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20  ->sMaskSet,p);. 
22e20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d         if( mTerm
22e30 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  ==0 && !sqlite3E
22e40 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29  xprIsConstant(p)
22e50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22e60 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26       if( (mTerm&
22e70 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
22e80 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
22e90 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
22ea0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
22eb0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
22ec0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
22ed0 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
22ee0 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
22ef0 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
22f00 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
22f10 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
22f20 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29  ne ) return (i8)
22f30 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
22f40 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
22f50 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f   ){.    for(i=nO
22f60 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69  rderBy-1; i>0; i
22f70 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  --){.      Bitma
22f80 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69  sk m = MASKBIT(i
22f90 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  ) - 1;.      if(
22fa0 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20   (obSat&m)==m ) 
22fb0 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a  return i;.    }.
22fc0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
22fd0 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
22fe0 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
22ff0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
23000 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  ag is set in the
23010 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20   mask passed to 
23020 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
23030 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e  n(),.** the plan
23040 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74  ner assumes that
23050 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
23060 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20  OrderBy list is 
23070 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50  actually a GROUP
23080 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20  .** BY clause - 
23090 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72  and so any order
230a0 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77   that groups row
230b0 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61  s as required sa
230c0 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72  tisfies the.** r
230d0 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  equest..**.** No
230e0 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20  rmally, in this 
230f0 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
23100 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
23110 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d  caller to determ
23120 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
23130 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61  r not the rows a
23140 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20  re really being 
23150 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72  delivered in sor
23160 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a  ted order, or.**
23170 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74   just in some ot
23180 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70  her order that p
23190 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75  rovides the requ
231a0 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48  ired grouping. H
231b0 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68  owever,.** if th
231c0 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  e WHERE_SORTBYGR
231d0 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  OUP flag is also
231e0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
231f0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20  e3WhereBegin(), 
23200 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  then.** this fun
23210 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
23220 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72  led on the retur
23230 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62  ned WhereInfo ob
23240 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73  ject. It returns
23250 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
23260 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c  rows really will
23270 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68   be sorted in th
23280 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65  e specified orde
23290 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f  r, or false.** o
232a0 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
232b0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
232c0 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  uming:.**.**   C
232d0 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
232e0 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a  N t1(x, Y);.**.*
232f0 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53  * then.**.**   S
23300 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
23310 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44  GROUP BY x,y ORD
23320 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20  ER BY x,y;   -- 
23330 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a  IsSorted()==1.**
23340 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
23350 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78   t1 GROUP BY y,x
23360 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20   ORDER BY y,x;  
23370 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
23380 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  0.*/.int sqlite3
23390 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68  WhereIsSorted(Wh
233a0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
233b0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
233c0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
233d0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
233e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
233f0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
23400 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
23410 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  UP );.  return p
23420 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d  WInfo->sorted;.}
23430 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
23440 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
23450 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
23460 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
23470 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
23480 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
23490 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
234a0 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
234b0 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
234c0 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
234d0 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
234e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
234f0 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
23500 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
23510 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
23520 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
23530 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
23540 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
23550 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
23560 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
23570 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74   Return the cost
23580 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
23590 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20   rows, assuming 
235a0 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68 61  that the keys ha
235b0 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20  ve .** nOrderby 
235c0 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74  columns and that
235d0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74   the first nSort
235e0 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61  ed columns are a
235f0 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64  lready in.** ord
23600 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  er..*/.static Lo
23610 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e  gEst whereSortin
23620 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e  gCost(.  WhereIn
23630 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f  fo *pWInfo,.  Lo
23640 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74  gEst nRow,.  int
23650 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74   nOrderBy,.  int
23660 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a   nSorted.){.  /*
23670 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74   TUNING: Estimat
23680 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c  ed cost of a ful
23690 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c  l external sort,
236a0 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a   where N is .  *
236b0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
236c0 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a  rows to sort is:
236d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73  .  **.  **   cos
236e0 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
236f0 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20  og(N))..  ** .  
23700 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72  ** Or, if the or
23710 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61  der-by clause ha
23720 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e  s X terms but on
23730 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20  ly the last Y . 
23740 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75   ** terms are ou
23750 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e  t of order, then
23760 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77   block-sorting w
23770 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a  ill reduce the .
23780 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73    ** sorting cos
23790 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
237a0 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
237b0 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59  N * log(N)) * (Y
237c0 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  /X).  **.  ** Th
237d0 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20  e (Y/X) term is 
237e0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
237f0 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  g stack variable
23800 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c   rScale.  ** bel
23810 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ow.  */.  LogEst
23820 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f   rScale, rSortCo
23830 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
23840 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d  rderBy>0 && 66==
23850 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
23860 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d  0) );.  rScale =
23870 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
23880 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64  nOrderBy-nSorted
23890 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20  )*100/nOrderBy) 
238a0 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73  - 66;.  rSortCos
238b0 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c  t = nRow + rScal
238c0 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75  e + 16;..  /* Mu
238d0 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29  ltiple by log(M)
238e0 20 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20   where M is the 
238f0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
23900 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20   rows..  ** Use 
23910 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20  the LIMIT for M 
23920 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72  if it is smaller
23930 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66   */.  if( (pWInf
23940 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
23950 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
23960 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69  !=0 && pWInfo->i
23970 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20  Limit<nRow ){.  
23980 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d    nRow = pWInfo-
23990 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  >iLimit;.  }.  r
239a0 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c  SortCost += estL
239b0 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75  og(nRow);.  retu
239c0 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a  rn rSortCost;.}.
239d0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
239e0 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   list of WhereLo
239f0 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57  op objects at pW
23a00 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68  Info->pLoops, th
23a10 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74  is routine.** at
23a20 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74  tempts to find t
23a30 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
23a40 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20  ath that visits 
23a50 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a  each WhereLoop.*
23a60 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61  * once.  This pa
23a70 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65  th is then loade
23a80 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66  d into the pWInf
23a90 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69  o->a[].pWLoop fi
23aa0 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75  elds..**.** Assu
23ab0 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61  me that the tota
23ac0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  l number of outp
23ad0 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  ut rows that wil
23ae0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72  l need to be sor
23af0 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e  ted.** will be n
23b00 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31  RowEst (in the 1
23b10 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74  0*log2 represent
23b20 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e  ation).  Or, ign
23b30 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63  ore sorting.** c
23b40 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d  osts if nRowEst=
23b50 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =0..**.** Return
23b60 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
23b70 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f  ccess or SQLITE_
23b80 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72  NOMEM of a memor
23b90 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
23ba0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
23bb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
23bc0 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72  ePathSolver(Wher
23bd0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c  eInfo *pWInfo, L
23be0 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a  ogEst nRowEst){.
23bf0 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20    int mxChoice; 
23c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
23c10 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
23c20 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61   simultaneous pa
23c30 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20  ths tracked */. 
23c40 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20   int nLoop;     
23c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23c60 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
23c70 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50   the join */.  P
23c80 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
23c90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
23ca0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
23cb0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
23cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23cd0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
23ce0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
23cf0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
23d00 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
23d10 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65  nter over the te
23d20 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  rms of the join 
23d30 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  */.  int ii, jj;
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d50 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
23d60 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30  */.  int mxI = 0
23d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23d80 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
23d90 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65  entry to replace
23da0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
23db0 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
23dc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
23dd0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
23de0 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  ms */.  LogEst m
23df0 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20  xCost = 0;      
23e00 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73    /* Maximum cos
23e10 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
23e20 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ths */.  LogEst 
23e30 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20  mxUnsorted = 0; 
23e40 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e     /* Maximum un
23e50 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61  sorted cost of a
23e60 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a   set of path */.
23e70 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
23e80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
23e90 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
23ea0 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
23eb0 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
23ec0 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
23ed0 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
23ee0 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
23ef0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
23f00 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
23f10 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
23f20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
23f30 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
23f40 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
23f50 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
23f60 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
23f70 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
23f80 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
23f90 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
23fa0 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
23fb0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
23fc0 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
23fd0 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
23fe0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
23ff0 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
24000 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
24010 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
24020 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
24030 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
24040 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
24050 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
24060 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
24070 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43    LogEst *aSortC
24080 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ost = 0;    /* S
24090 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69  orting and parti
240a0 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73  al sorting costs
240b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
240c0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
240d0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
240e0 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
240f0 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e   routine */.  in
24100 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20  t nSpace;       
24110 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
24120 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
24130 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f  ted at pSpace */
24140 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
24150 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
24160 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24170 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
24180 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54  ->nLevel;.  /* T
24190 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c  UNING: For simpl
241a0 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20  e queries, only 
241b0 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73  the best path is
241c0 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46   tracked..  ** F
241d0 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20  or 2-way joins, 
241e0 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73  the 5 best paths
241f0 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20   are followed.. 
24200 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66   ** For joins of
24210 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65   3 or more table
24220 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20  s, track the 10 
24230 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20  best paths */.  
24240 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
24250 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p<=1) ? 1 : (nLo
24260 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
24270 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
24280 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
24290 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48  st->nSrc );.  WH
242a0 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20  ERETRACE(0x002, 
242b0 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c  ("---- begin sol
242c0 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25  ver.  (nRowEst=%
242d0 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  d)\n", nRowEst))
242e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45  ;..  /* If nRowE
242f0 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74  st is zero and t
24300 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
24310 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f   BY clause, igno
24320 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20  re it. In this. 
24330 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75 72   ** case the pur
24340 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
24350 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65  l is to estimate
24360 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
24370 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a  ows returned.  *
24380 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c  * by the overall
24390 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69   query. Once thi
243a0 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20 62  s estimate has b
243b0 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
243c0 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69  e caller.  ** wi
243d0 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  ll invoke this f
243e0 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64  unction a second
243f0 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74   time, passing t
24400 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20 74  he estimate as t
24410 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20  he.  ** nRowEst 
24420 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20  parameter.  */. 
24430 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
24440 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77  derBy==0 || nRow
24450 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f  Est==0 ){.    nO
24460 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
24470 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  lse{.    nOrderB
24480 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  y = pWInfo->pOrd
24490 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  erBy->nExpr;.  }
244a0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
244b0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
244c0 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46  pace for aTo, aF
244d0 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73  rom and aSortCos
244e0 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20  t[] */.  nSpace 
244f0 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
24500 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
24510 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
24520 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70  xChoice*2;.  nSp
24530 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  ace += sizeof(Lo
24540 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79  gEst) * nOrderBy
24550 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
24560 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
24570 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20  N(db, nSpace);. 
24580 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
24590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
245a0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f  OMEM_BKPT;.  aTo
245b0 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70   = (WherePath*)p
245c0 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d  Space;.  aFrom =
245d0 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20   aTo+mxChoice;. 
245e0 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30   memset(aFrom, 0
245f0 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30  , sizeof(aFrom[0
24600 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65  ]));.  pX = (Whe
24610 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b  reLoop**)(aFrom+
24620 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72  mxChoice);.  for
24630 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20  (ii=mxChoice*2, 
24640 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b  pFrom=aTo; ii>0;
24650 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20   ii--, pFrom++, 
24660 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20  pX += nLoop){.  
24670 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d    pFrom->aLoop =
24680 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   pX;.  }.  if( n
24690 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
246a0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
246b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
246c0 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62   and it is not b
246d0 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65  eing ignored, se
246e0 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63  t up.    ** spac
246f0 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43  e for the aSortC
24700 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63  ost[] array. Eac
24710 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
24720 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79   aSortCost array
24730 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
24740 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67  r zero - meaning
24750 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
24760 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
24770 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a   - or the.    **
24780 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
24790 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66   nRowEst rows of
247a0 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20   data where the 
247b0 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66  first X terms of
247c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  .    ** the ORDE
247d0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
247e0 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72  already in order
247f0 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65  , where X is the
24800 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69   array .    ** i
24810 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53  ndex.  */.    aS
24820 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73  ortCost = (LogEs
24830 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65  t*)pX;.    memse
24840 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20  t(aSortCost, 0, 
24850 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
24860 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   nOrderBy);.  }.
24870 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
24880 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost==0 || &pSpac
24890 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
248a0 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72  *)&aSortCost[nOr
248b0 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65  derBy] );.  asse
248c0 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30  rt( aSortCost!=0
248d0 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
248e0 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29  ce]==(char*)pX )
248f0 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  ;..  /* Seed the
24900 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
24910 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
24920 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
24930 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a  WhereLoops..  **
24940 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f  .  ** TUNING: Do
24950 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d   not let the num
24960 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
24970 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20  s go above 28.  
24980 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  If the cost.  **
24990 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
249a0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
249b0 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63   is not paid bac
249c0 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  k within the fir
249d0 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c  st 28.  ** rows,
249e0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65   then do not use
249f0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
24a00 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d  ndex. */.  aFrom
24a10 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70  [0].nRow = MIN(p
24a20 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
24a30 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28  p, 48);  assert(
24a40 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   48==sqlite3LogE
24a50 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f  st(28) );.  nFro
24a60 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  m = 1;.  assert(
24a70 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
24a80 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  red==0 );.  if( 
24a90 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
24aa0 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a  /* If nLoop is z
24ab0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ero, then there 
24ac0 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d  are no FROM term
24ad0 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  s in the query. 
24ae0 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20  Since.    ** in 
24af0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75  this case the qu
24b00 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61  ery may return a
24b10 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   maximum of one 
24b20 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73  row, the results
24b30 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65  .    ** are alre
24b40 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65  ady in the reque
24b50 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20  sted order. Set 
24b60 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72  isOrdered to nOr
24b70 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20  derBy to.    ** 
24b80 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f  indicate this. O
24b90 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67  r, if nLoop is g
24ba0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
24bb0 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20  , set isOrdered 
24bc0 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e  to.    ** -1, in
24bd0 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
24be0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79  e result set may
24bf0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
24c00 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20  rdered, .    ** 
24c10 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
24c20 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20   loops added to 
24c30 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e  the current plan
24c40 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b  .  */.    aFrom[
24c50 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e  0].isOrdered = n
24c60 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f  Loop>0 ? -1 : nO
24c70 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f  rderBy;.  }..  /
24c80 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73  * Compute succes
24c90 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68  sively longer Wh
24ca0 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74  erePaths using t
24cb0 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  he previous gene
24cc0 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57  ration.  ** of W
24cd0 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65  herePaths as the
24ce0 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e   basis for the n
24cf0 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ext.  Keep track
24d00 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
24d10 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73  .  ** best paths
24d20 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74   at each generat
24d30 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  ion */.  for(iLo
24d40 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
24d50 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
24d60 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f   nTo = 0;.    fo
24d70 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46  r(ii=0, pFrom=aF
24d80 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  rom; ii<nFrom; i
24d90 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
24da0 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d       for(pWLoop=
24db0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
24dc0 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70  pWLoop; pWLoop=p
24dd0 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  WLoop->pNextLoop
24de0 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  ){.        LogEs
24df0 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  t nOut;         
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24e10 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  Rows visited by 
24e20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
24e30 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
24e40 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
24e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
24e60 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72  ost of path (pFr
24e70 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
24e80 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e        LogEst rUn
24e90 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  sorted;         
24ea0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72          /* Unsor
24eb0 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72  ted cost of (pFr
24ec0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
24ed0 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72        i8 isOrder
24ee0 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
24ef0 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64  dered;  /* isOrd
24f00 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b  ered for (pFrom+
24f10 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
24f20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e     Bitmask maskN
24f30 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
24f40 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
24f50 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28  src visited by (
24f60 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  ..) */.        B
24f70 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
24f80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24f90 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d   /* Mask of rev-
24fa0 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20  order loops for 
24fb0 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20  (..) */..       
24fc0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
24fd0 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
24fe0 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
24ff0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
25000 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
25010 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
25020 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
25030 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
25040 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46  if( (pWLoop->wsF
25050 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
25060 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
25070 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 33 20 29 7b 0a  From->nRow<3 ){.
25080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
25090 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74 6f 6d  not use an autom
250a0 61 74 69 63 20 69 6e 64 65 78 20 69 66 20 74 68  atic index if th
250b0 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 65  e this loop is e
250c0 78 70 65 63 74 65 64 0a 20 20 20 20 20 20 20 20  xpected.        
250d0 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73 73    ** to run less
250e0 20 74 68 61 6e 20 31 2e 32 35 20 74 69 6d 65 73   than 1.25 times
250f0 2e 20 20 49 74 20 69 73 20 74 65 6d 70 74 69 6e  .  It is temptin
25100 67 20 74 6f 20 61 6c 73 6f 20 65 78 63 6c 75 64  g to also exclud
25110 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  e.          ** a
25120 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 75  utomatic index u
25130 73 61 67 65 20 6f 6e 20 61 6e 20 6f 75 74 65 72  sage on an outer
25140 20 6c 6f 6f 70 2c 20 62 75 74 20 73 6f 6d 65 74   loop, but somet
25150 69 6d 65 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  imes an automati
25160 63 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  c.          ** i
25170 6e 64 65 78 20 69 73 20 75 73 65 66 75 6c 20 69  ndex is useful i
25180 6e 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  n the outer loop
25190 20 6f 66 20 61 20 63 6f 72 72 65 6c 61 74 65 64   of a correlated
251a0 20 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20   subquery. */.  
251b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
251c0 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  10==sqlite3LogEs
251d0 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(2) );.        
251e0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
251f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
25200 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
25210 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
25220 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
25230 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
25240 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
25250 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
25260 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
25270 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
25280 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
25290 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
252a0 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
252b0 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
252c0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
252d0 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72  d(rUnsorted, pFr
252e0 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a  om->rUnsorted);.
252f0 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
25300 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
25310 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
25320 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
25330 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
25340 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
25350 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
25360 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20  rdered<0 ){.    
25370 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
25380 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
25390 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
253a0 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
253b0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
253c0 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
253d0 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
253e0 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
25400 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
25410 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  evMask);.       
25420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25430 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
25440 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
25450 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
25460 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26  ( isOrdered>=0 &
25470 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64  & isOrdered<nOrd
25480 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
25490 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b    if( aSortCost[
254a0 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b  isOrdered]==0 ){
254b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f  .            aSo
254c0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
254d0 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67  ] = whereSorting
254e0 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Cost(.          
254f0 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52        pWInfo, nR
25500 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  owEst, nOrderBy,
25510 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
25520 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
25530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25540 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
25550 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
25560 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  ed, aSortCost[is
25570 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20  Ordered]);..    
25580 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
25590 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20  (0x002,.        
255a0 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72        ("---- sor
255b0 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f  t cost=%-3d (%d/
255c0 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f  %d) increases co
255d0 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e  st %3d to %-3d\n
255e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
255f0 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
25600 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42  dered], (nOrderB
25610 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
25620 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
25630 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
25640 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20  d, rCost));.    
25650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25660 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e       rCost = rUn
25670 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
25680 20 20 72 55 6e 73 6f 72 74 65 64 20 2d 3d 20 32    rUnsorted -= 2
25690 3b 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 53  ;  /* TUNING:  S
256a0 6c 69 67 68 74 20 62 69 61 73 20 69 6e 20 66 61  light bias in fa
256b0 76 6f 72 20 6f 66 20 6e 6f 2d 73 6f 72 74 20 70  vor of no-sort p
256c0 6c 61 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  lans */.        
256d0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  }..        /* Ch
256e0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
256f0 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
25700 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
25710 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78  of.        ** mx
25720 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66  Choice best-so-f
25730 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20  ar paths..      
25740 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
25750 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61  First look for a
25760 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  n existing path 
25770 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  among best-so-fa
25780 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20 20  r paths.        
25790 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20 74  ** that covers t
257a0 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  he same set of l
257b0 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
257c0 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a   same isOrdered.
257d0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69          ** setti
257e0 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65 6e  ng as the curren
257f0 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74 65  t path candidate
25800 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
25810 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d       ** The term
25820 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   "((pTo->isOrder
25830 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
25840 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76  80)==0" is equiv
25850 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  alent.        **
25860 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65   to (pTo->isOrde
25870 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f  red==(-1))==(isO
25880 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66  rdered==(-1))" f
25890 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20  or the range.   
258a0 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c       ** of legal
258b0 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72   values for isOr
258c0 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20  dered, -1..64.. 
258d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
258e0 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d    for(jj=0, pTo=
258f0 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b  aTo; jj<nTo; jj+
25900 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
25910 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61       if( pTo->ma
25920 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a  skLoop==maskNew.
25930 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
25940 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
25950 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
25960 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
25970 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
25980 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20  case( jj==nTo-1 
25990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
259a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
259b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
259c0 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20      if( jj>=nTo 
259d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
259e0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73  None of the exis
259f0 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72  ting best-so-far
25a00 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68 65   paths match the
25a10 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20   candidate. */. 
25a20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
25a30 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20  >=mxChoice.     
25a40 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e        && (rCost>
25a50 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74  mxCost || (rCost
25a60 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73  ==mxCost && rUns
25a70 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65  orted>=mxUnsorte
25a80 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  d)).          ){
25a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
25aa0 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64  The current cand
25ab0 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74  idate is no bett
25ac0 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74  er than any of t
25ad0 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  he mxChoice.    
25ae0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73          ** paths
25af0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
25b00 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75  e best-so-far bu
25b10 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72  ffer.  So discar
25b20 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
25b30 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65 20   this candidate 
25b40 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a  as not viable. *
25b50 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
25b60 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
25b70 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
25b80 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25b90 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
25ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
25bb0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25bc0 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
25bd0 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
25be0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
25c00 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
25c10 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
25c20 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55   rCost, nOut, rU
25c30 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nsorted,.       
25c40 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
25c50 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
25c60 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
25c70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
25c80 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
25c90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
25ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25cb0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
25cc0 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d  this points it m
25cd0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
25ce0 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  w candidate path
25cf0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  .          ** ne
25d00 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64 20  eds to be added 
25d10 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
25d20 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e  st-so-far paths.
25d30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
25d40 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29  ( nTo<mxChoice )
25d50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
25d60 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   Increase the si
25d70 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65  ze of the aTo se
25d80 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20  t by one */.    
25d90 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f          jj = nTo
25da0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
25db0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
25dc0 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70   /* New path rep
25dd0 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20  laces the prior 
25de0 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f  worst to keep co
25df0 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69  unt below mxChoi
25e00 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ce */.          
25e10 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20    jj = mxI;.    
25e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25e30 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d    pTo = &aTo[jj]
25e40 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
25e50 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
25e60 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
25e70 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25e80 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
25e90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25ea0 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77  DebugPrintf("New
25eb0 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64      %s cost=%-3d
25ec0 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  ,%3d,%3d order=%
25ed0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
25ee0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
25ef0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
25f00 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
25f10 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65  , nOut, rUnsorte
25f20 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
25f30 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
25f40 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
25f50 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
25f60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
25f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25f80 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72      /* Control r
25f90 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20 62  eaches here if b
25fa0 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20  est-so-far path 
25fb0 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65  pTo=aTo[jj] cove
25fc0 72 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  rs the.         
25fd0 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20   ** same set of 
25fe0 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68  loops and has th
25ff0 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64  e same isOrdered
26000 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a   setting as the.
26010 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e            ** can
26020 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43 68  didate path.  Ch
26030 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
26040 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75  e candidate shou
26050 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20  ld replace.     
26060 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69       ** pTo or i
26070 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  f the candidate 
26080 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65  should be skippe
26090 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d..          ** 
260a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
260b0 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 69 73  e conditional is
260c0 20 61 6e 20 65 78 70 61 6e 64 65 64 20 76 65 63   an expanded vec
260d0 74 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65  tor comparison e
260e0 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20  quivalent to:.  
260f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 70 54          **   (pT
26100 6f 2d 3e 72 43 6f 73 74 2c 70 54 6f 2d 3e 6e 52  o->rCost,pTo->nR
26110 6f 77 2c 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65  ow,pTo->rUnsorte
26120 64 29 20 3c 3d 20 28 72 43 6f 73 74 2c 6e 4f 75  d) <= (rCost,nOu
26130 74 2c 72 55 6e 73 6f 72 74 65 64 29 0a 20 20 20  t,rUnsorted).   
26140 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26150 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
26160 73 74 3c 72 43 6f 73 74 20 0a 20 20 20 20 20 20  st<rCost .      
26170 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43       || (pTo->rC
26180 6f 73 74 3d 3d 72 43 6f 73 74 0a 20 20 20 20 20  ost==rCost.     
26190 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54            && (pT
261a0 6f 2d 3e 6e 52 6f 77 3c 6e 4f 75 74 0a 20 20 20  o->nRow<nOut.   
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261c0 7c 7c 20 28 70 54 6f 2d 3e 6e 52 6f 77 3d 3d 6e  || (pTo->nRow==n
261d0 4f 75 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73  Out && pTo->rUns
261e0 6f 72 74 65 64 3c 3d 72 55 6e 73 6f 72 74 65 64  orted<=rUnsorted
261f0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
26200 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 20 20      ).          
26210 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 20 20      ).          
26220 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ){.#ifdef WHERET
26230 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
26240 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
26250 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
26260 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26280 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26290 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
262a0 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63      "Skip   %s c
262b0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64  ost=%-3d,%3d,%3d
262c0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
262e0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
262f0 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
26300 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20  ), rCost, nOut, 
26310 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20  rUnsorted,.     
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
26330 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
26340 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
26350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26360 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26370 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
26380 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
26390 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
263b0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
263c0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
263d0 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
263e0 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
263f0 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73         pTo->rUns
26400 6f 72 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72  orted, pTo->isOr
26410 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e  dered>=0 ? pTo->
26420 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
26430 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
26440 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
26450 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72         /* Discar
26460 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  d the candidate 
26470 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65  path from furthe
26480 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
26490 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  */.            t
264a0 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
264b0 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
264c0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
264d0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
264e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
264f0 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
26500 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
26510 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
26520 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20  reaches here if 
26530 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61  the candidate pa
26540 74 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61  th is better tha
26550 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
26560 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65  ** pTo path.  Re
26570 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74  place pTo with t
26580 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f  he candidate. */
26590 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
265a0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
265b0 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
265c0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
265d0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
265e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
265f0 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
26600 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64              "Upd
26610 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  ate %s cost=%-3d
26620 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  ,%3d,%3d order=%
26630 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
26640 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
26650 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
26660 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
26670 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c  nOut, rUnsorted,
26680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26690 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
266a0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
266b0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
266c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
266d0 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63  intf("  was %s c
266e0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64  ost=%-3d,%3d,%3d
266f0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
26710 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
26720 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
26730 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
26740 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
26750 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
26760 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65  ted, pTo->isOrde
26770 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73  red>=0 ? pTo->is
26780 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
26790 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
267a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
267b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f  .        /* pWLo
267c0 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20  op is a winner. 
267d0 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73   Add it to the s
267e0 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61  et of best so fa
267f0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  r */.        pTo
26800 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72  ->maskLoop = pFr
26810 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
26820 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
26830 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65  .        pTo->re
26840 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b  vLoop = revMask;
26850 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52  .        pTo->nR
26860 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20  ow = nOut;.     
26870 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20     pTo->rCost = 
26880 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70  rCost;.        p
26890 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20  To->rUnsorted = 
268a0 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20  rUnsorted;.     
268b0 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
268c0 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20  d = isOrdered;. 
268d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
268e0 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d  o->aLoop, pFrom-
268f0 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57  >aLoop, sizeof(W
26900 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70  hereLoop*)*iLoop
26910 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  );.        pTo->
26920 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70  aLoop[iLoop] = p
26930 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  WLoop;.        i
26940 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
26950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   ){.          mx
26960 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  I = 0;.         
26970 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d   mxCost = aTo[0]
26980 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  .rCost;.        
26990 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61    mxUnsorted = a
269a0 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20  To[0].nRow;.    
269b0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20        for(jj=1, 
269c0 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c  pTo=&aTo[1]; jj<
269d0 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20  mxChoice; jj++, 
269e0 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
269f0 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
26a00 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20  st>mxCost .     
26a10 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d          || (pTo-
26a20 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26  >rCost==mxCost &
26a30 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64  & pTo->rUnsorted
26a40 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20  >mxUnsorted) .  
26a50 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
26a60 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73             mxCos
26a70 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a  t = pTo->rCost;.
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
26a90 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e  Unsorted = pTo->
26aa0 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20  rUnsorted;.     
26ab0 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a           mxI = j
26ac0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  j;.            }
26ad0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26af0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45     }..#ifdef WHE
26b00 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
26b10 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69   /* >=2 */.    i
26b20 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
26b30 72 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20  race & 0x02 ){. 
26b40 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
26b50 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66  gPrintf("---- af
26b60 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d  ter round %d ---
26b70 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20  -\n", iLoop);.  
26b80 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54      for(ii=0, pT
26b90 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69  o=aTo; ii<nTo; i
26ba0 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  i++, pTo++){.   
26bb0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
26bc0 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73  gPrintf(" %s cos
26bd0 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64  t=%-3d nrow=%-3d
26be0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
26bf0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
26c00 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
26c10 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
26c20 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
26c30 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
26c40 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54  Ordered>=0 ? (pT
26c50 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
26c60 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
26c70 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64    if( pTo->isOrd
26c80 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  ered>0 ){.      
26c90 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26ca0 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25  Printf(" rev=0x%
26cb0 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76  llx\n", pTo->rev
26cc0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  Loop);.        }
26cd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26ce0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26cf0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  tf("\n");.      
26d00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
26d10 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
26d20 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20   Swap the roles 
26d30 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f  of aFrom and aTo
26d40 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65   for the next ge
26d50 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
26d60 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20  pFrom = aTo;.   
26d70 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20   aTo = aFrom;.  
26d80 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b    aFrom = pFrom;
26d90 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f  .    nFrom = nTo
26da0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72  ;.  }..  if( nFr
26db0 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  om==0 ){.    sql
26dc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
26dd0 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73  rse, "no query s
26de0 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73  olution");.    s
26df0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
26e00 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20  b, pSpace);.    
26e10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
26e20 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ROR;.  }.  .  /*
26e30 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   Find the lowest
26e40 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72   cost path.  pFr
26e50 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  om will be left 
26e60 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74  pointing to that
26e70 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d   path */.  pFrom
26e80 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28   = aFrom;.  for(
26e90 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  ii=1; ii<nFrom; 
26ea0 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
26eb0 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f  From->rCost>aFro
26ec0 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46  m[ii].rCost ) pF
26ed0 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d  rom = &aFrom[ii]
26ee0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
26ef0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
26f00 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f  nLoop );.  /* Lo
26f10 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ad the lowest co
26f20 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49  st path into pWI
26f30 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  nfo */.  for(iLo
26f40 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
26f50 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
26f60 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
26f70 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20  vel = pWInfo->a 
26f80 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65  + iLoop;.    pLe
26f90 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57  vel->pWLoop = pW
26fa0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c  Loop = pFrom->aL
26fb0 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
26fc0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
26fd0 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20  pWLoop->iTab;.  
26fe0 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
26ff0 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
27000 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
27010 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a  iFrom].iCursor;.
27020 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66    }.  if( (pWInf
27030 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
27040 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
27050 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70  NCT)!=0.   && (p
27060 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
27070 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
27080 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70  CTBY)==0.   && p
27090 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
270a0 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
270b0 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77  _NOOP.   && nRow
270c0 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  Est.  ){.    Bit
270d0 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20  mask notUsed;.  
270e0 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65    int rc = where
270f0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
27100 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
27110 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c  nfo->pResultSet,
27120 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20   pFrom,.        
27130 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44           WHERE_D
27140 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70  ISTINCTBY, nLoop
27150 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
27160 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55  [nLoop-1], &notU
27170 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
27180 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c  ==pWInfo->pResul
27190 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  tSet->nExpr ){. 
271a0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
271b0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
271c0 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
271d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
271e0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
271f0 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49  y ){.    if( pWI
27200 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
27210 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
27220 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  BY ){.      if( 
27230 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
27240 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
27250 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
27260 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
27270 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
27280 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
27290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
272a0 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  se{.      pWInfo
272b0 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d  ->nOBSat = pFrom
272c0 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  ->isOrdered;.   
272d0 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
272e0 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
272f0 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  oop;.      if( p
27300 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30  WInfo->nOBSat<=0
27310 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
27320 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a  fo->nOBSat = 0;.
27330 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f          if( nLoo
27340 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p>0 ){.         
27350 20 75 33 32 20 77 73 46 6c 61 67 73 20 3d 20 70   u32 wsFlags = p
27360 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
27370 70 2d 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  p-1]->wsFlags;. 
27380 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77 73           if( (ws
27390 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
273a0 45 52 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20 20  EROW)==0 .      
273b0 20 20 20 20 20 26 26 20 28 77 73 46 6c 61 67 73       && (wsFlags
273c0 26 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52  &(WHERE_IPK|WHER
273d0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28  E_COLUMN_IN))!=(
273e0 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
273f0 43 4f 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20 20  COLUMN_IN).     
27400 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27410 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
27420 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
27430 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74  nt rc = wherePat
27440 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
27450 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
27460 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f  ->pOrderBy, pFro
27470 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
27480 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
27490 52 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c  RDERBY_LIMIT, nL
274a0 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
274b0 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d  oop[nLoop-1], &m
274c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
274d0 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73  estcase( wsFlags
274e0 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 3b 0a   & WHERE_IPK );.
274f0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
27500 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20  case( wsFlags & 
27510 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20  WHERE_COLUMN_IN 
27520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
27530 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70  f( rc==pWInfo->p
27540 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
27550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27560 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64  pWInfo->bOrdered
27570 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20  InnerLoop = 1;. 
27580 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
27590 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d  nfo->revMask = m
275a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
275b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
275c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
275d0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49    }.    if( (pWI
275e0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
275f0 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  & WHERE_SORTBYGR
27600 4f 55 50 29 0a 20 20 20 20 20 20 20 20 26 26 20  OUP).        && 
27610 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d  pWInfo->nOBSat==
27620 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
27630 2d 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70  ->nExpr && nLoop
27640 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  >0.    ){.      
27650 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
27660 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
27670 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50 61 74  Order = wherePat
27680 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
27690 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
276a0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  ->pOrderBy, .   
276b0 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c         pFrom, 0,
276c0 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
276d0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
276e0 20 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20   &revMask.      
276f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27700 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d   pWInfo->sorted=
27710 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
27720 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e  nOrder==pWInfo->
27730 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
27740 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
27750 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20  o->sorted = 1;. 
27760 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72         pWInfo->r
27770 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b  evMask = revMask
27780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27790 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e    }...  pWInfo->
277a0 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d  nRowOut = pFrom-
277b0 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65  >nRow;..  /* Fre
277c0 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f  e temporary memo
277d0 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75  ry and return su
277e0 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ccess */.  sqlit
277f0 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
27800 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e  Space);.  return
27810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27820 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65  *.** Most querie
27830 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e  s use only a sin
27840 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20  gle table (they 
27850 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61  are not joins) a
27860 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c  nd have.** simpl
27870 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
27880 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64   against indexed
27890 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72   fields.  This r
278a0 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a  outine attempts.
278b0 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65  ** to plan those
278c0 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73   simple cases us
278d0 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65  ing much less ce
278e0 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a  remony than the.
278f0 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
27900 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
27910 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69  , and thereby yi
27920 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74  eld faster sqlit
27930 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20  e3_prepare().** 
27940 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f  times for the co
27950 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  mmon case..**.**
27960 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
27970 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20   on success, if 
27980 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
27990 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69  e handled by thi
279a0 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71  s.** no-frills q
279b0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52  uery planner.  R
279c0 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68  eturn zero if th
279d0 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74  is query needs t
279e0 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70  he .** general-p
279f0 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61  urpose query pla
27a00 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nner..*/.static 
27a10 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75  int whereShortCu
27a20 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t(WhereLoopBuild
27a30 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
27a40 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
27a50 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  fo;.  struct Src
27a60 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
27a70 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
27a80 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72  *pWC;.  WhereTer
27a90 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72  m *pTerm;.  Wher
27aa0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
27ab0 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20  int iCur;.  int 
27ac0 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  j;.  Table *pTab
27ad0 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
27ae0 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ..  pWInfo = pBu
27af0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
27b00 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
27b10 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
27b20 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 29 20 72  OR_SUBCLAUSE ) r
27b30 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
27b40 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  t( pWInfo->pTabL
27b50 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a  ist->nSrc>=1 );.
27b60 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
27b70 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
27b80 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
27b90 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72  Tab;.  if( IsVir
27ba0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
27bb0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74  urn 0;.  if( pIt
27bc0 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
27bd0 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  By ) return 0;. 
27be0 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69   iCur = pItem->i
27bf0 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20  Cursor;.  pWC = 
27c00 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
27c10 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72  pLoop = pBuilder
27c20 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d  ->pNew;.  pLoop-
27c30 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  >wsFlags = 0;.  
27c40 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30  pLoop->nSkip = 0
27c50 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69  ;.  pTerm = sqli
27c60 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d  te3WhereFindTerm
27c70 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
27c80 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20  0, WO_EQ|WO_IS, 
27c90 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  0);.  if( pTerm 
27ca0 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
27cb0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
27cc0 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
27cd0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
27ce0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
27cf0 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52  Q|WHERE_IPK|WHER
27d00 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c  E_ONEROW;.    pL
27d10 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  oop->aLTerm[0] =
27d20 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f   pTerm;.    pLoo
27d30 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  p->nLTerm = 1;. 
27d40 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
27d50 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f  e.nEq = 1;.    /
27d60 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
27d70 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70  f a rowid lookup
27d80 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c   is 10 */.    pL
27d90 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20  oop->rRun = 33; 
27da0 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c   /* 33==sqlite3L
27db0 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d  ogEst(10) */.  }
27dc0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
27dd0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
27de0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
27df0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
27e00 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  int opMask;.    
27e10 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
27e20 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c  >aLTermSpace==pL
27e30 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20  oop->aLTerm );. 
27e40 20 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71       if( !IsUniq
27e50 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20  ueIndex(pIdx).  
27e60 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50       || pIdx->pP
27e70 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a  artIdxWhere!=0 .
27e80 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e         || pIdx->
27e90 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a  nKeyCol>ArraySiz
27ea0 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53  e(pLoop->aLTermS
27eb0 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20 63  pace) .      ) c
27ec0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f  ontinue;.      o
27ed0 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e  pMask = pIdx->un
27ee0 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f  iqNotNull ? (WO_
27ef0 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45  EQ|WO_IS) : WO_E
27f00 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  Q;.      for(j=0
27f10 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; j<pIdx->nKeyCo
27f20 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
27f30 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
27f40 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
27f50 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f  C, iCur, j, 0, o
27f60 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20  pMask, pIdx);.  
27f70 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
27f80 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
27f90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
27fa0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
27fb0 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
27fc0 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
27fd0 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  j] = pTerm;.    
27fe0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21    }.      if( j!
27ff0 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
28000 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28010 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
28020 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
28030 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57  Q|WHERE_ONEROW|W
28040 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
28050 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73      if( pIdx->is
28060 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74  Covering || (pIt
28070 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 70 49  em->colUsed & pI
28080 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 29  dx->colNotIdxed)
28090 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
280a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
280b0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
280c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
280d0 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a  Loop->nLTerm = j
280e0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
280f0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a  .btree.nEq = j;.
28100 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
28110 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
28120 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  dx;.      /* TUN
28130 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75  ING: Cost of a u
28140 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b  nique index look
28150 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20  up is 15 */.    
28160 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
28170 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69  39;  /* 39==sqli
28180 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f  te3LogEst(15) */
28190 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
281a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c    }.  }.  if( pL
281b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a  oop->wsFlags ){.
281c0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
281d0 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20  = (LogEst)1;.   
281e0 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
281f0 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  Loop = pLoop;.  
28200 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
28210 2d 3e 73 4d 61 73 6b 53 65 74 2e 6e 3d 3d 31 20  ->sMaskSet.n==1 
28220 26 26 20 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d  && iCur==pWInfo-
28230 3e 73 4d 61 73 6b 53 65 74 2e 69 78 5b 30 5d 20  >sMaskSet.ix[0] 
28240 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61  );.    pLoop->ma
28250 73 6b 53 65 6c 66 20 3d 20 31 3b 20 2f 2a 20 73  skSelf = 1; /* s
28260 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
28270 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
28280 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 2a 2f 0a  kSet, iCur); */.
28290 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
282a0 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b  .iTabCur = iCur;
282b0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
282c0 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  wOut = 1;.    if
282d0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
282e0 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  By ) pWInfo->nOB
282f0 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70  Sat =  pWInfo->p
28300 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
28310 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
28320 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
28330 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
28340 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
28350 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
28360 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
28370 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  QUE;.    }.#ifde
28380 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
28390 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20     pLoop->cId = 
283a0 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  '0';.#endif.    
283b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
283c0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
283d0 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
283e0 6f 6e 20 66 6f 72 20 65 78 70 72 49 73 44 65 74  on for exprIsDet
283f0 65 72 6d 69 6e 69 73 74 69 63 28 29 2e 0a 2a 2f  erministic()..*/
28400 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
28410 4e 6f 64 65 49 73 44 65 74 65 72 6d 69 6e 69 73  NodeIsDeterminis
28420 74 69 63 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  tic(Walker *pWal
28430 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
28440 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
28450 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
28460 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
28470 74 79 28 70 45 78 70 72 2c 20 45 50 5f 43 6f 6e  ty(pExpr, EP_Con
28480 73 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a 20 20  stFunc)==0 ){.  
28490 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
284a0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
284b0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
284c0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
284d0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
284e0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
284f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  he expression co
28500 6e 74 61 69 6e 73 20 6e 6f 20 6e 6f 6e 2d 64 65  ntains no non-de
28510 74 65 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20  terministic SQL 
28520 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20 44  .** functions. D
28530 6f 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 6e  o not consider n
28540 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
28550 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 74   SQL functions t
28560 68 61 74 20 61 72 65 20 0a 2a 2a 20 70 61 72 74  hat are .** part
28570 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 20 73   of sub-select s
28580 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
28590 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 44  atic int exprIsD
285a0 65 74 65 72 6d 69 6e 69 73 74 69 63 28 45 78 70  eterministic(Exp
285b0 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20  r *p){.  Walker 
285c0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
285d0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
285e0 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20   w.eCode = 1;.  
285f0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
28600 3d 20 65 78 70 72 4e 6f 64 65 49 73 44 65 74 65  = exprNodeIsDete
28610 72 6d 69 6e 69 73 74 69 63 3b 0a 20 20 77 2e 78  rministic;.  w.x
28620 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
28630 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
28640 6c 6b 46 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65  lkFail;.  sqlite
28650 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
28660 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
28670 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  de;.}../*.** Gen
28680 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
28690 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
286a0 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
286b0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
286c0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
286d0 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
286e0 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
286f0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
28700 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
28710 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
28720 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
28730 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
28740 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
28750 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
28760 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
28770 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
28780 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
28790 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
287a0 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
287b0 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
287c0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
287d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
287e0 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
287f0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
28800 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
28810 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
28820 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
28830 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
28840 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
28850 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
28860 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
28870 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
28880 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
28890 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
288a0 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
288b0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
288c0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
288d0 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
288e0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
288f0 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
28900 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
28910 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
28920 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
28930 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
28940 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
28950 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
28960 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
28970 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
28980 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
28990 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
289a0 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
289b0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
289c0 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
289d0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
289e0 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
289f0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
28a00 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
28a10 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
28a20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a40 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
28a50 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
28a60 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
28a80 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
28a90 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
28aa0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
28ab0 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
28ac0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
28ad0 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
28ae0 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
28af0 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
28b00 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
28b10 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28b20 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
28b30 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
28b40 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
28b50 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
28b60 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
28b70 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
28b80 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
28b90 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
28ba0 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
28bb0 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
28bc0 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
28bd0 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
28be0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
28bf0 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
28c00 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
28c10 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
28c20 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
28c30 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
28c40 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
28c50 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
28c60 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
28c70 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
28c80 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
28c90 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
28ca0 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
28cb0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
28cc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
28cd0 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
28ce0 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
28cf0 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
28d00 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
28d10 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
28d20 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
28d30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
28d40 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
28d50 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
28d60 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
28d70 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
28d80 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
28d90 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
28da0 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
28db0 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
28dc0 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
28dd0 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
28de0 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
28df0 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
28e00 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
28e10 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
28e20 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
28e30 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
28e40 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
28e50 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
28e60 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
28e70 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
28e80 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
28e90 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
28ea0 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
28eb0 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
28ec0 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
28ed0 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
28ee0 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
28ef0 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
28f00 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
28f10 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
28f20 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
28f30 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
28f40 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
28f50 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
28f60 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
28f70 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
28f80 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
28f90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
28fa0 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
28fb0 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
28fc0 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
28fd0 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
28fe0 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
28ff0 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
29000 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
29010 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
29020 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
29030 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
29040 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
29050 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
29060 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
29070 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
29080 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
29090 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
290a0 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
290b0 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
290c0 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
290d0 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
290e0 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
290f0 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
29100 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
29110 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
29120 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
29130 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
29140 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
29150 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
29160 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
29170 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
29180 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
29190 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
291a0 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
291b0 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
291c0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
291d0 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
291e0 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
291f0 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
29200 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
29210 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
29220 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
29230 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
29240 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
29250 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
29260 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
29270 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
29280 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
29290 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
292a0 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
292b0 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
292c0 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
292d0 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
292e0 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72  ING.**.** pOrder
292f0 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
29300 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
29310 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47  clause (or the G
29320 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a  ROUP BY clause.*
29330 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47  * if the WHERE_G
29340 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
29350 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73  et in wctrlFlags
29360 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  ) of a SELECT st
29370 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68  atement.** if th
29380 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
29390 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
293a0 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
293b0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
293c0 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
293d0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
293e0 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
293f0 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73  then pOrderBy is
29400 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
29410 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74   iIdxCur paramet
29420 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  er is the cursor
29430 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e   number of an in
29440 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45  dex.  If .** WHE
29450 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
29460 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20  is set, iIdxCur 
29470 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
29480 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
29490 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f  .** to use for O
294a0 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R clause process
294b0 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20  ing.  The WHERE 
294c0 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73  clause should us
294d0 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66  e this.** specif
294e0 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57  ic cursor.  If W
294f0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
29500 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65  IRED is set, the
29510 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20  n iIdxCur is.** 
29520 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  the first cursor
29530 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
29540 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20  cursors for all 
29550 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75  indices.  iIdxCu
29560 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75  r should.** be u
29570 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
29580 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
29590 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20  ursor depending 
295a0 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69  on which index i
295b0 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68  s.** used..*/.Wh
295c0 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
295d0 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
295e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
295f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
29600 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
29610 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
29620 73 74 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  st,      /* FROM
29630 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20   clause: A list 
29640 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
29650 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
29660 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
29670 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29680 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
29690 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
296a0 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 41 6e 20  erBy,     /* An 
296b0 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
296c0 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f  UP BY) clause, o
296d0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
296e0 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
296f0 2c 20 20 20 2f 2a 20 51 75 65 72 79 20 72 65 73  ,   /* Query res
29700 75 6c 74 20 73 65 74 2e 20 20 52 65 71 27 64 20  ult set.  Req'd 
29710 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  for DISTINCT */.
29720 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
29730 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
29740 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
29750 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
29760 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69  Int.h */.  int i
29770 41 75 78 41 72 67 20 20 20 20 20 20 20 20 20 20  AuxArg          
29780 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
29790 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73  R_SUBCLAUSE is s
297a0 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72  et, index cursor
297b0 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20   number.        
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297d0 20 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53    ** If WHERE_US
297e0 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68  E_LIMIT, then th
297f0 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a  e limit amount *
29800 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  /.){.  int nByte
29810 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
29820 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20    /* Num. bytes 
29830 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68  allocated for Wh
29840 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a  ereInfo struct *
29850 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74  /.  int nTabList
29860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29870 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
29880 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74  ents in pTabList
29890 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
298a0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
298b0 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20   /* Will become 
298c0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
298d0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
298e0 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  n */.  Vdbe *v =
298f0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
29900 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
29910 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
29920 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
29930 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
29940 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74   /* Cursors that
29950 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73   are not yet pos
29960 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65  itioned */.  Whe
29970 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57  reLoopBuilder sW
29980 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57  LB;     /* The W
29990 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72  hereLoop builder
299a0 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
299b0 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
299c0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
299d0 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
299e0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
299f0 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  vel;        /* A
29a00 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e   single level in
29a10 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a   pWInfo->a[] */.
29a20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
29a30 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
29a40 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e  Pointer to a sin
29a50 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  gle WhereLoop ob
29a60 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69  ject */.  int ii
29a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29a80 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
29a90 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nter */.  sqlite
29aa0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
29ab0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
29ac0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
29ad0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29af0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
29b00 75 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20  u8 bFordelete = 
29b10 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50  0;         /* OP
29b20 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f  FLAG_FORDELETE o
29b30 72 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f  r zero, as appro
29b40 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73  priate */..  ass
29b50 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
29b60 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
29b70 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c  _MULTIROW)==0 ||
29b80 20 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72   (.        (wctr
29b90 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
29ba0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
29bb0 3d 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74  =0 .     && (wct
29bc0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
29bd0 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
29be0 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e   .  ));..  /* On
29bf0 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f  ly one of WHERE_
29c00 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20  OR_SUBCLAUSE or 
29c10 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20  WHERE_USE_LIMIT 
29c20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
29c30 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
29c40 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
29c50 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
29c60 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
29c70 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d  HERE_USE_LIMIT)=
29c80 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69  =0 );..  /* Vari
29c90 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
29ca0 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ion */.  db = pP
29cb0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73  arse->db;.  mems
29cc0 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a  et(&sWLB, 0, siz
29cd0 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f  eof(sWLB));..  /
29ce0 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50  * An ORDER/GROUP
29cf0 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f   BY clause of mo
29d00 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73  re than 63 terms
29d10 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
29d20 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61  ized */.  testca
29d30 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  se( pOrderBy && 
29d40 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
29d50 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
29d60 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64  pOrderBy && pOrd
29d70 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53  erBy->nExpr>=BMS
29d80 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   ) pOrderBy = 0;
29d90 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  .  sWLB.pOrderBy
29da0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
29db0 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44  /* Disable the D
29dc0 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61  ISTINCT optimiza
29dd0 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44  tion if SQLITE_D
29de0 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65  istinctOpt is se
29df0 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74  t via.  ** sqlit
29e00 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c  e3_test_ctrl(SQL
29e10 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
29e20 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20  IMIZATIONS,...) 
29e30 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
29e40 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
29e50 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  , SQLITE_Distinc
29e60 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74  tOpt) ){.    wct
29e70 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  rlFlags &= ~WHER
29e80 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b  E_WANT_DISTINCT;
29e90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  .  }..  /* The n
29ea0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
29eb0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
29ec0 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
29ed0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
29ee0 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
29ef0 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
29f00 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
29f10 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
29f20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
29f30 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
29f40 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
29f50 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
29f60 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
29f70 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
29f80 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
29f90 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
29fa0 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
29fb0 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
29fc0 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
29fd0 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
29fe0 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
29ff0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
2a000 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  USE flag is set,
2a010 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
2a020 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
2a030 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
2a040 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
2a050 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
2a060 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
2a070 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
2a080 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
2a090 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
2a0a0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
2a0b0 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
2a0c0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2a0d0 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2a0e0 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
2a0f0 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
2a100 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2a110 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
2a120 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
2a130 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
2a140 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
2a150 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
2a160 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
2a170 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
2a180 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
2a190 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
2a1a0 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
2a1b0 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
2a1c0 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
2a1d0 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
2a1e0 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
2a1f0 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
2a200 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
2a210 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
2a220 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
2a230 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
2a240 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
2a250 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
2a260 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
2a270 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
2a280 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
2a290 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49  ..  */.  nByteWI
2a2a0 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
2a2b0 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
2a2c0 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
2a2d0 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
2a2e0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
2a2f0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
2a300 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
2a310 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
2a320 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
2a330 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2a340 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2a350 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
2a360 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
2a370 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
2a380 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
2a390 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
2a3a0 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
2a3b0 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
2a3c0 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
2a3d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
2a3e0 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  erBy;.  pWInfo->
2a3f0 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
2a400 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  .  pWInfo->pResu
2a410 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53  ltSet = pResultS
2a420 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69  et;.  pWInfo->ai
2a430 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20  CurOnePass[0] = 
2a440 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
2a450 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Pass[1] = -1;.  
2a460 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d  pWInfo->nLevel =
2a470 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   nTabList;.  pWI
2a480 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57  nfo->iBreak = pW
2a490 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
2a4a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2a4b0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49  eLabel(v);.  pWI
2a4c0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2a4d0 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20  = wctrlFlags;.  
2a4e0 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20 3d  pWInfo->iLimit =
2a4f0 20 69 41 75 78 41 72 67 3b 0a 20 20 70 57 49 6e   iAuxArg;.  pWIn
2a500 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
2a510 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
2a520 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d 65 6d 73  ueryLoop;.  mems
2a530 65 74 28 26 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  et(&pWInfo->nOBS
2a540 61 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  at, 0, .        
2a550 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72 65 49   offsetof(WhereI
2a560 6e 66 6f 2c 73 57 43 29 20 2d 20 6f 66 66 73 65  nfo,sWC) - offse
2a570 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 6e 4f  tof(WhereInfo,nO
2a580 42 53 61 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74  BSat));.  memset
2a590 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  (&pWInfo->a[0], 
2a5a0 30 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  0, sizeof(WhereL
2a5b0 6f 6f 70 29 2b 6e 54 61 62 4c 69 73 74 2a 73 69  oop)+nTabList*si
2a5c0 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
2a5d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  );.  assert( pWI
2a5e0 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
2a5f0 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f  NEPASS_OFF );  /
2a600 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c  * ONEPASS defaul
2a610 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70  ts to OFF */.  p
2a620 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
2a630 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73  o->sMaskSet;.  s
2a640 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WLB.pWInfo = pWI
2a650 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20  nfo;.  sWLB.pWC 
2a660 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
2a670 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57    sWLB.pNew = (W
2a680 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61  hereLoop*)(((cha
2a690 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65  r*)pWInfo)+nByte
2a6a0 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  WInfo);.  assert
2a6b0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2a6c0 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77  GNMENT(sWLB.pNew
2a6d0 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  ) );.  whereLoop
2a6e0 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b  Init(sWLB.pNew);
2a6f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2a700 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77  EBUG.  sWLB.pNew
2a710 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e  ->cId = '*';.#en
2a720 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20  dif..  /* Split 
2a730 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2a740 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
2a750 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
2a760 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
2a770 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
2a780 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
2a790 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
2a7a0 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
2a7b0 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c  pMaskSet);.  sql
2a7c0 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49  ite3WhereClauseI
2a7d0 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  nit(&pWInfo->sWC
2a7e0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c  , pWInfo);.  sql
2a7f0 69 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 26  ite3WhereSplit(&
2a800 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68  pWInfo->sWC, pWh
2a810 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20  ere, TK_AND);.  
2a820 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20    .  /* Special 
2a830 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c  case: No FROM cl
2a840 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ause.  */.  if( 
2a850 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  nTabList==0 ){. 
2a860 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
2a870 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ) pWInfo->nOBSat
2a880 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
2a890 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72  pr;.    if( wctr
2a8a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
2a8b0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
2a8c0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
2a8d0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
2a8e0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
2a8f0 0a 20 20 20 20 7d 0a 20 20 20 20 45 78 70 6c 61  .    }.    Expla
2a900 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
2a910 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 43 4f  rse, 0, "SCAN CO
2a920 4e 53 54 41 4e 54 20 52 4f 57 22 29 29 3b 0a 20  NSTANT ROW"));. 
2a930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
2a940 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d  ssign a bit from
2a950 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20   the bitmask to 
2a960 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
2a970 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
2a980 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2a990 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68   N-th term of th
2a9a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2a9b0 20 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d   assigned a bitm
2a9c0 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 20  ask of 1<<N..   
2a9d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
2a9e0 75 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76 69  ule of the previ
2a9f0 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e 73  ous sentence ens
2aa00 75 72 65 73 20 74 68 74 61 20 69 66 20 58 20 69  ures thta if X i
2aa10 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
2aa20 72 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65  r.    ** a table
2aa30 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69 73 20   T, then X-1 is 
2aa40 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
2aa50 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 73  all other tables
2aa60 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2aa70 54 2e 0a 20 20 20 20 2a 2a 20 4b 6e 6f 77 69 6e  T..    ** Knowin
2aa80 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  g the bitmask fo
2aa90 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
2aaa0 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
2aab0 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 20 20 2a  ft join is.    *
2aac0 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  * important.  Ti
2aad0 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 20 20  cket #3015..    
2aae0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
2aaf0 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65  hat bitmasks are
2ab00 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
2ab10 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
2ab20 74 61 62 6c 65 73 20 69 6e 0a 20 20 20 20 2a 2a  tables in.    **
2ab30 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
2ab40 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
2ab50 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
2ab60 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
2ab70 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 65 71 75 61  ally.    ** equa
2ab80 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e  l to pTabList->n
2ab90 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65  Src but might be
2aba0 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20   shortened to 1 
2abb0 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 57 48  if the.    ** WH
2abc0 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2abd0 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
2abe0 20 20 2a 2f 0a 20 20 20 20 69 69 20 3d 20 30 3b    */.    ii = 0;
2abf0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 63  .    do{.      c
2ac00 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53  reateMask(pMaskS
2ac10 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2ac20 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
2ac30 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2ac40 54 61 62 46 75 6e 63 41 72 67 73 28 70 50 61 72  TabFuncArgs(pPar
2ac50 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  se, &pTabList->a
2ac60 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  [ii], &pWInfo->s
2ac70 57 43 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  WC);.    }while(
2ac80 20 28 2b 2b 69 69 29 3c 70 54 61 62 4c 69 73 74   (++ii)<pTabList
2ac90 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 23 69 66 64  ->nSrc );.  #ifd
2aca0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2acb0 20 20 20 20 7b 0a 20 20 20 20 20 20 42 69 74 6d      {.      Bitm
2acc0 61 73 6b 20 6d 78 20 3d 20 30 3b 0a 20 20 20 20  ask mx = 0;.    
2acd0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2ace0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2acf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69  i++){.        Bi
2ad00 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65  tmask m = sqlite
2ad10 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d  3WhereGetMask(pM
2ad20 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
2ad30 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
2ad40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2ad50 28 20 6d 3e 3d 6d 78 20 29 3b 0a 20 20 20 20 20  ( m>=mx );.     
2ad60 20 20 20 6d 78 20 3d 20 6d 3b 0a 20 20 20 20 20     mx = m;.     
2ad70 20 7d 0a 20 20 20 20 7d 0a 20 20 23 65 6e 64 69   }.    }.  #endi
2ad80 66 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 41 6e  f.  }.  .  /* An
2ad90 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
2ada0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
2adb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
2adc0 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54  reExprAnalyze(pT
2add0 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d  abList, &pWInfo-
2ade0 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d  >sWC);.  if( db-
2adf0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2ae00 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2ae10 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 70 65 63  rror;..  /* Spec
2ae20 69 61 6c 20 63 61 73 65 3a 20 57 48 45 52 45 20  ial case: WHERE 
2ae30 74 65 72 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f  terms that do no
2ae40 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 74  t refer to any t
2ae50 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
2ae60 6e 0a 20 20 2a 2a 20 28 63 6f 6e 73 74 61 6e 74  n.  ** (constant
2ae70 20 65 78 70 72 65 73 73 69 6f 6e 73 29 2e 20 45   expressions). E
2ae80 76 61 6c 75 61 74 65 20 65 61 63 68 20 73 75 63  valuate each suc
2ae90 68 20 74 65 72 6d 2c 20 61 6e 64 20 6a 75 6d 70  h term, and jump
2aea0 20 6f 76 65 72 20 61 6c 6c 20 74 68 65 0a 20 20   over all the.  
2aeb0 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  ** generated cod
2aec0 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  e if the result 
2aed0 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 20 0a 20  is not true.  . 
2aee0 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20   **.  ** Do not 
2aef0 64 6f 20 74 68 69 73 20 69 66 20 74 68 65 20 65  do this if the e
2af00 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
2af10 6e 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  ns non-determini
2af20 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 0a 20  stic functions. 
2af30 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
2af40 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d 73 65   within a sub-se
2af50 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  lect. This is no
2af60 74 20 73 74 72 69 63 74 6c 79 20 72 65 71 75 69  t strictly requi
2af70 72 65 64 2c 20 62 75 74 0a 20 20 2a 2a 20 70 72  red, but.  ** pr
2af80 65 73 65 72 76 65 73 20 53 51 4c 69 74 65 27 73  eserves SQLite's
2af90 20 6c 65 67 61 63 79 20 62 65 68 61 76 69 6f 75   legacy behaviou
2afa0 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r in the followi
2afb0 6e 67 20 74 77 6f 20 63 61 73 65 73 3a 0a 20 20  ng two cases:.  
2afc0 2a 2a 0a 20 20 2a 2a 20 20 20 46 52 4f 4d 20 2e  **.  **   FROM .
2afd0 2e 2e 20 57 48 45 52 45 20 72 61 6e 64 6f 6d 28  .. WHERE random(
2afe0 29 3e 30 3b 20 20 20 20 20 20 20 20 20 20 20 2d  )>0;           -
2aff0 2d 20 65 76 61 6c 20 72 61 6e 64 6f 6d 28 29 20  - eval random() 
2b000 6f 6e 63 65 20 70 65 72 20 72 6f 77 0a 20 20 2a  once per row.  *
2b010 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45  *   FROM ... WHE
2b020 52 45 20 28 53 45 4c 45 43 54 20 72 61 6e 64 6f  RE (SELECT rando
2b030 6d 28 29 29 3e 30 3b 20 20 2d 2d 20 65 76 61 6c  m())>0;  -- eval
2b040 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20 6f   random() once o
2b050 76 65 72 61 6c 6c 0a 20 20 2a 2f 0a 20 20 66 6f  verall.  */.  fo
2b060 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e  r(ii=0; ii<sWLB.
2b070 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  pWC->nTerm; ii++
2b080 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
2b090 20 2a 70 54 20 3d 20 26 73 57 4c 42 2e 70 57 43   *pT = &sWLB.pWC
2b0a0 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  ->a[ii];.    if(
2b0b0 20 70 54 2d 3e 77 74 46 6c 61 67 73 20 26 20 54   pT->wtFlags & T
2b0c0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f  ERM_VIRTUAL ) co
2b0d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2b0e0 70 54 2d 3e 70 72 65 72 65 71 41 6c 6c 3d 3d 30  pT->prereqAll==0
2b0f0 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30   && (nTabList==0
2b100 20 7c 7c 20 65 78 70 72 49 73 44 65 74 65 72 6d   || exprIsDeterm
2b110 69 6e 69 73 74 69 63 28 70 54 2d 3e 70 45 78 70  inistic(pT->pExp
2b120 72 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  r)) ){.      sql
2b130 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2b140 70 50 61 72 73 65 2c 20 70 54 2d 3e 70 45 78 70  pParse, pT->pExp
2b150 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  r, pWInfo->iBrea
2b160 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  k, SQLITE_JUMPIF
2b170 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 2d  NULL);.      pT-
2b180 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
2b190 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
2b1a0 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c  }..  if( wctrlFl
2b1b0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
2b1c0 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
2b1d0 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52   if( isDistinctR
2b1e0 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c  edundant(pParse,
2b1f0 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e   pTabList, &pWIn
2b200 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74  fo->sWC, pResult
2b210 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Set) ){.      /*
2b220 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61   The DISTINCT ma
2b230 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65  rking is pointle
2b240 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20  ss.  Ignore it. 
2b250 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
2b260 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
2b270 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
2b280 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  UE;.    }else if
2b290 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
2b2a0 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  .      /* Try to
2b2b0 20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65   ORDER BY the re
2b2c0 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65  sult set to make
2b2d0 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73   distinct proces
2b2e0 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20  sing easier */. 
2b2f0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74       pWInfo->wct
2b300 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  rlFlags |= WHERE
2b310 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20  _DISTINCTBY;.   
2b320 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
2b330 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74  rBy = pResultSet
2b340 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2b350 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
2b360 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2b370 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  s */.#if defined
2b380 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
2b390 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74  LED).  if( sqlit
2b3a0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
2b3b0 78 66 66 66 66 20 29 7b 0a 20 20 20 20 73 71 6c  xffff ){.    sql
2b3c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2b3d0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
2b3e0 74 61 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46  tart *** (wctrlF
2b3f0 6c 61 67 73 3a 20 30 78 25 78 22 2c 77 63 74 72  lags: 0x%x",wctr
2b400 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  lFlags);.    if(
2b410 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
2b420 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b  ERE_USE_LIMIT ){
2b430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
2b440 62 75 67 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d  bugPrintf(", lim
2b450 69 74 3a 20 25 64 22 2c 20 69 41 75 78 41 72 67  it: %d", iAuxArg
2b460 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2b470 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2b480 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ")\n");.  }.  if
2b490 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2b4a0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f  ace & 0x100 ){ /
2b4b0 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65  * Display all te
2b4c0 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
2b4d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 73   clause */.    s
2b4e0 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
2b4f0 65 50 72 69 6e 74 28 73 57 4c 42 2e 70 57 43 29  ePrint(sWLB.pWC)
2b500 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2b510 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20  if( nTabList!=1 
2b520 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  || whereShortCut
2b530 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20  (&sWLB)==0 ){.  
2b540 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2b550 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20  AddAll(&sWLB);. 
2b560 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2b570 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2b580 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45 52  ;.  .#ifdef WHER
2b590 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
2b5a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2b5b0 65 72 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f  ereTrace ){    /
2b5c0 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66  * Display all of
2b5d0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
2b5e0 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  bjects */.      
2b5f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20  WhereLoop *p;.  
2b600 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2b610 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
2b620 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30  ar zLabel[] = "0
2b630 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67  123456789abcdefg
2b640 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
2b650 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20  yxz".           
2b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b680 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
2b690 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a  NOPQRSTUVWYXZ";.
2b6a0 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e        for(p=pWIn
2b6b0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b  fo->pLoops, i=0;
2b6c0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
2b6d0 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  op, i++){.      
2b6e0 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65    p->cId = zLabe
2b6f0 6c 5b 69 25 28 73 69 7a 65 6f 66 28 7a 4c 61 62  l[i%(sizeof(zLab
2b700 65 6c 29 2d 31 29 5d 3b 0a 20 20 20 20 20 20 20  el)-1)];.       
2b710 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
2b720 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  p, sWLB.pWC);.  
2b730 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
2b740 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50  if.  .    whereP
2b750 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
2b760 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
2b770 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2b780 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2b790 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  Error;.    if( p
2b7a0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
2b7b0 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50  ){.       whereP
2b7c0 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
2b7d0 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
2b7e0 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28  t+1);.       if(
2b7f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2b800 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
2b810 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
2b820 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f    }.  if( pWInfo
2b830 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
2b840 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
2b850 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
2b860 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57  r)!=0 ){.     pW
2b870 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
2b880 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69  ALLBITS;.  }.  i
2b890 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2b8a0 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c  || NEVER(db->mal
2b8b0 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20  locFailed) ){.  
2b8c0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2b8d0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64  nError;.  }.#ifd
2b8e0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2b8f0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2b900 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
2b910 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
2b920 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f  gPrintf("---- So
2b930 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c  lution nRow=%d",
2b940 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2b950 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
2b960 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  o->nOBSat>0 ){. 
2b970 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2b980 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42  gPrintf(" ORDERB
2b990 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57  Y=%d,0x%llx", pW
2b9a0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57  Info->nOBSat, pW
2b9b0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a  Info->revMask);.
2b9c0 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
2b9d0 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
2b9e0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  nct ){.      cas
2b9f0 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
2ba00 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
2ba10 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2ba20 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
2ba30 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20  T=unique");.    
2ba40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2ba50 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
2ba60 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
2ba70 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
2ba80 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2ba90 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f  tf("  DISTINCT=o
2baa0 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
2bab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2bac0 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
2bad0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
2bae0 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
2baf0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2bb00 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
2bb10 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  nordered");.    
2bb20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2bb30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2bb40 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2bb50 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  "\n");.    for(i
2bb60 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e  i=0; ii<pWInfo->
2bb70 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20  nLevel; ii++){. 
2bb80 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
2bb90 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69  int(pWInfo->a[ii
2bba0 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70  ].pWLoop, sWLB.p
2bbb0 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  WC);.    }.  }.#
2bbc0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 74 65  endif..  /* Atte
2bbd0 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c  mpt to omit tabl
2bbe0 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e  es from the join
2bbf0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61 66 66   that do not aff
2bc00 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  ect the result..
2bc10 20 20 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65    ** For a table
2bc20 20 74 6f 20 6e 6f 74 20 61 66 66 65 63 74 20 74   to not affect t
2bc30 68 65 20 72 65 73 75 6c 74 2c 20 74 68 65 20 66  he result, the f
2bc40 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62 65  ollowing must be
2bc50 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
2bc60 20 20 20 31 29 20 54 68 65 20 71 75 65 72 79 20     1) The query 
2bc70 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 6e 20 61  must not be an a
2bc80 67 67 72 65 67 61 74 65 2e 0a 20 20 2a 2a 20 20  ggregate..  **  
2bc90 20 32 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75   2) The table mu
2bca0 73 74 20 62 65 20 74 68 65 20 52 48 53 20 6f 66  st be the RHS of
2bcb0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20   a LEFT JOIN..  
2bcc0 2a 2a 20 20 20 33 29 20 45 69 74 68 65 72 20 74  **   3) Either t
2bcd0 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 62 65  he query must be
2bce0 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 20 65 6c   DISTINCT, or el
2bcf0 73 65 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  se the ON or USI
2bd00 4e 47 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 20  NG clause.  **  
2bd10 20 20 20 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e      must contain
2bd20 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68   a constraint th
2bd30 61 74 20 6c 69 6d 69 74 73 20 74 68 65 20 73 63  at limits the sc
2bd40 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  an of the table 
2bd50 74 6f 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 74  to .  **      at
2bd60 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65 20 72   most a single r
2bd70 6f 77 2e 0a 20 20 2a 2a 20 20 20 34 29 20 54 68  ow..  **   4) Th
2bd80 65 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74  e table must not
2bd90 20 62 65 20 72 65 66 65 72 65 6e 63 65 64 20 62   be referenced b
2bda0 79 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  y any part of th
2bdb0 65 20 71 75 65 72 79 20 61 70 61 72 74 0a 20 20  e query apart.  
2bdc0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 69 74 73  **      from its
2bdd0 20 6f 77 6e 20 55 53 49 4e 47 20 6f 72 20 4f 4e   own USING or ON
2bde0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
2bdf0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
2be00 67 69 76 65 6e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  given:.  **.  **
2be10 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
2be20 45 20 74 31 28 69 70 6b 20 49 4e 54 45 47 45 52  E t1(ipk INTEGER
2be30 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 31   PRIMARY KEY, v1
2be40 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
2be50 54 45 20 54 41 42 4c 45 20 74 32 28 69 70 6b 20  TE TABLE t2(ipk 
2be60 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2be70 4b 45 59 2c 20 76 32 29 3b 0a 20 20 2a 2a 20 20  KEY, v2);.  **  
2be80 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2be90 74 33 28 69 70 6b 20 49 4e 54 45 47 45 52 20 50  t3(ipk INTEGER P
2bea0 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 33 29 3b  RIMARY KEY, v3);
2beb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 74 68 65 6e 20  .  **.  ** then 
2bec0 74 61 62 6c 65 20 74 32 20 63 61 6e 20 62 65 20  table t2 can be 
2bed0 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
2bee0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a   following:.  **
2bef0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
2bf00 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31 20   v1, v3 FROM t1 
2bf10 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54  .  **       LEFT
2bf20 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 20 28   JOIN t2 USING (
2bf30 74 31 2e 69 70 6b 3d 74 32 2e 69 70 6b 29 0a 20  t1.ipk=t2.ipk). 
2bf40 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a   **       LEFT J
2bf50 4f 49 4e 20 74 33 20 55 53 49 4e 47 20 28 74 31  OIN t3 USING (t1
2bf60 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20 20 2a  .ipk=t3.ipk).  *
2bf70 2a 0a 20 20 2a 2a 20 6f 72 20 66 72 6f 6d 3a 0a  *.  ** or from:.
2bf80 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
2bf90 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 76 31  LECT DISTINCT v1
2bfa0 2c 20 76 33 20 46 52 4f 4d 20 74 31 20 0a 20 20  , v3 FROM t1 .  
2bfb0 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f  **       LEFT JO
2bfc0 49 4e 20 74 32 0a 20 20 2a 2a 20 20 20 20 20 20  IN t2.  **      
2bfd0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20 55 53   LEFT JOIN t3 US
2bfe0 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33 2e 69  ING (t1.ipk=t3.i
2bff0 70 6b 29 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  pk).  */.  notRe
2c000 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
2c010 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  0;.  if( pWInfo-
2c020 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26  >nLevel>=2.   &&
2c030 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 20 20   pResultSet!=0  
2c040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c050 67 75 61 72 61 6e 74 65 65 73 20 63 6f 6e 64 69  guarantees condi
2c060 74 69 6f 6e 20 28 31 29 20 61 62 6f 76 65 20 2a  tion (1) above *
2c070 2f 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  /.   && Optimiza
2c080 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
2c090 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a  SQLITE_OmitNoopJ
2c0a0 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  oin).  ){.    in
2c0b0 74 20 69 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b  t i;.    Bitmask
2c0c0 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74   tabUsed = sqlit
2c0d0 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55  e3WhereExprListU
2c0e0 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2c0f0 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20  ResultSet);.    
2c100 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  if( sWLB.pOrderB
2c110 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73  y ){.      tabUs
2c120 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  ed |= sqlite3Whe
2c130 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
2c140 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70  pMaskSet, sWLB.p
2c150 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a  OrderBy);.    }.
2c160 20 20 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f      for(i=pWInfo
2c170 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 31  ->nLevel-1; i>=1
2c180 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 57 68  ; i--){.      Wh
2c190 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
2c1a0 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 73 74 72  *pEnd;.      str
2c1b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2c1c0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 70   *pItem;.      p
2c1d0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  Loop = pWInfo->a
2c1e0 5b 69 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  [i].pWLoop;.    
2c1f0 20 20 70 49 74 65 6d 20 3d 20 26 70 57 49 6e 66    pItem = &pWInf
2c200 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2c210 4c 6f 6f 70 2d 3e 69 54 61 62 5d 3b 0a 20 20 20  Loop->iTab];.   
2c220 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66     if( (pItem->f
2c230 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
2c240 4c 45 46 54 29 3d 3d 30 20 29 20 63 6f 6e 74 69  LEFT)==0 ) conti
2c250 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
2c260 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2c270 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
2c280 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )==0.       && (
2c290 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2c2a0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
2c2b0 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
2c2c0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c2d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
2c2e0 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d  tabUsed & pLoop-
2c2f0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20  >maskSelf)!=0 ) 
2c300 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c310 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d  pEnd = sWLB.pWC-
2c320 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e  >a + sWLB.pWC->n
2c330 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Term;.      for(
2c340 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e  pTerm=sWLB.pWC->
2c350 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70  a; pTerm<pEnd; p
2c360 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
2c370 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
2c380 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
2c390 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 7b 0a  maskSelf)!=0 ){.
2c3a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 45            if( !E
2c3b0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2c3c0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
2c3d0 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20  FromJoin).      
2c3e0 20 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d 3e 70       || pTerm->p
2c3f0 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
2c400 54 61 62 6c 65 21 3d 70 49 74 65 6d 2d 3e 69 43  Table!=pItem->iC
2c410 75 72 73 6f 72 0a 20 20 20 20 20 20 20 20 20 20  ursor.          
2c420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
2c430 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2c440 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2c450 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
2c460 65 72 6d 3c 70 45 6e 64 20 29 20 63 6f 6e 74 69  erm<pEnd ) conti
2c470 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45  nue;.      WHERE
2c480 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
2c490 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20  -> drop loop %c 
2c4a0 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f  not used\n", pLo
2c4b0 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20  op->cId));.     
2c4c0 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 70 4c   notReady &= ~pL
2c4d0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2c4e0 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73       for(pTerm=s
2c4f0 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72  WLB.pWC->a; pTer
2c500 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  m<pEnd; pTerm++)
2c510 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2c520 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2c530 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
2c540 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f)!=0 ){.       
2c550 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
2c560 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
2c570 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c580 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d   }.      if( i!=
2c590 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
2c5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2c5b0 6e 42 79 74 65 20 3d 20 28 70 57 49 6e 66 6f 2d  nByte = (pWInfo-
2c5c0 3e 6e 4c 65 76 65 6c 2d 31 2d 69 29 20 2a 20 73  >nLevel-1-i) * s
2c5d0 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
2c5e0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
2c5f0 76 65 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d  ve(&pWInfo->a[i]
2c600 2c 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 2b 31  , &pWInfo->a[i+1
2c610 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
2c620 20 7d 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d   }.      pWInfo-
2c630 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20  >nLevel--;.     
2c640 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20   nTabList--;.   
2c650 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52   }.  }.  WHERETR
2c660 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
2c670 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73   Optimizer Finis
2c680 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  hed ***\n"));.  
2c690 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2c6a0 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57  nQueryLoop += pW
2c6b0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a  Info->nRowOut;..
2c6c0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
2c6d0 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  er is an UPDATE 
2c6e0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
2c6f0 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75  ent that is requ
2c700 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75  esting.  ** to u
2c710 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c  se a one-pass al
2c720 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69  gorithm, determi
2c730 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70  ne if this is ap
2c740 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 0a  propriate..  **.
2c750 20 20 2a 2a 20 41 20 6f 6e 65 2d 70 61 73 73 20    ** A one-pass 
2c760 61 70 70 72 6f 61 63 68 20 63 61 6e 20 62 65 20  approach can be 
2c770 75 73 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c  used if the call
2c780 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
2c790 20 6f 6e 65 0a 20 20 2a 2a 20 61 6e 64 20 65 69   one.  ** and ei
2c7a0 74 68 65 72 20 28 61 29 20 74 68 65 20 73 63 61  ther (a) the sca
2c7b0 6e 20 76 69 73 69 74 73 20 61 74 20 6d 6f 73 74  n visits at most
2c7c0 20 6f 6e 65 20 72 6f 77 20 6f 72 20 28 62 29 20   one row or (b) 
2c7d0 65 61 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65  each.  ** of the
2c7e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
2c7f0 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
2c800 20 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61   * the caller ha
2c810 73 20 69 6e 64 69 63 61 74 65 64 20 74 68 61 74  s indicated that
2c820 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72   a one-pass appr
2c830 6f 61 63 68 20 63 61 6e 20 62 65 20 75 73 65 64  oach can be used
2c840 0a 20 20 2a 2a 20 20 20 20 20 77 69 74 68 20 6d  .  **     with m
2c850 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 28 62 79  ultiple rows (by
2c860 20 73 65 74 74 69 6e 67 20 57 48 45 52 45 5f 4f   setting WHERE_O
2c870 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29  NEPASS_MULTIROW)
2c880 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 74  , and.  **   * t
2c890 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  he table is not 
2c8a0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
2c8b0 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 65 69   and.  **   * ei
2c8c0 74 68 65 72 20 74 68 65 20 73 63 61 6e 20 64 6f  ther the scan do
2c8d0 65 73 20 6e 6f 74 20 75 73 65 20 74 68 65 20 4f  es not use the O
2c8e0 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  R optimization o
2c8f0 72 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a  r the caller.  *
2c900 2a 20 20 20 20 20 69 73 20 61 20 44 45 4c 45 54  *     is a DELET
2c910 45 20 6f 70 65 72 61 74 69 6f 6e 20 28 57 48 45  E operation (WHE
2c920 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
2c930 20 69 73 20 6f 6e 6c 79 20 73 70 65 63 69 66 69   is only specifi
2c940 65 64 0a 20 20 2a 2a 20 20 20 20 20 66 6f 72 20  ed.  **     for 
2c950 44 45 4c 45 54 45 29 2e 0a 20 20 2a 2a 0a 20 20  DELETE)..  **.  
2c960 2a 2a 20 54 68 65 20 6c 61 73 74 20 71 75 61 6c  ** The last qual
2c970 69 66 69 63 61 74 69 6f 6e 20 69 73 20 62 65 63  ification is bec
2c980 61 75 73 65 20 61 6e 20 55 50 44 41 54 45 20 73  ause an UPDATE s
2c990 74 61 74 65 6d 65 6e 74 20 75 73 65 73 0a 20 20  tatement uses.  
2c9a0 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61 69 43  ** WhereInfo.aiC
2c9b0 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 74 6f 20  urOnePass[1] to 
2c9c0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
2c9d0 72 20 6f 72 20 6e 6f 74 20 69 74 20 72 65 61 6c  r or not it real
2c9e0 6c 79 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20  ly can.  ** use 
2c9f0 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f  a one-pass appro
2ca00 61 63 68 2c 20 61 6e 64 20 74 68 69 73 20 69 73  ach, and this is
2ca10 20 6e 6f 74 20 73 65 74 20 61 63 63 75 72 61 74   not set accurat
2ca20 65 6c 79 20 66 6f 72 20 73 63 61 6e 73 0a 20 20  ely for scans.  
2ca30 2a 2a 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ** that use the 
2ca40 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  OR optimization.
2ca50 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ca60 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2ca70 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2ca80 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
2ca90 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
2caa0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
2cab0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2cac0 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b  S_DESIRED)!=0 ){
2cad0 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73  .    int wsFlags
2cae0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e   = pWInfo->a[0].
2caf0 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b  pWLoop->wsFlags;
2cb00 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77  .    int bOnerow
2cb10 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57 48   = (wsFlags & WH
2cb20 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a  ERE_ONEROW)!=0;.
2cb30 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 20      if( bOnerow 
2cb40 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 30 21 3d  || (.        0!=
2cb50 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2cb60 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
2cb70 49 52 4f 57 29 0a 20 20 20 20 20 26 26 20 30 3d  IROW).     && 0=
2cb80 3d 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  =(wsFlags & WHER
2cb90 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  E_VIRTUALTABLE).
2cba0 20 20 20 20 20 26 26 20 28 30 3d 3d 28 77 73 46       && (0==(wsF
2cbb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
2cbc0 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c  TI_OR) || (wctrl
2cbd0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
2cbe0 50 4c 49 43 41 54 45 53 5f 4f 4b 29 29 0a 20 20  PLICATES_OK)).  
2cbf0 20 20 29 29 7b 0a 20 20 20 20 20 20 70 57 49 6e    )){.      pWIn
2cc00 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62  fo->eOnePass = b
2cc10 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53  Onerow ? ONEPASS
2cc20 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53  _SINGLE : ONEPAS
2cc30 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20 69  S_MULTI;.      i
2cc40 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
2cc50 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29  List->a[0].pTab)
2cc60 20 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57   && (wsFlags & W
2cc70 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
2cc80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 63  {.        if( wc
2cc90 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2cca0 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f  _ONEPASS_MULTIRO
2ccb0 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  W ){.          b
2ccc0 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c  Fordelete = OPFL
2ccd0 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20  AG_FORDELETE;.  
2cce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ccf0 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
2cd00 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28  oop->wsFlags = (
2cd10 77 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52 45  wsFlags & ~WHERE
2cd20 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  _IDX_ONLY);.    
2cd30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2cd40 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62   /* Open all tab
2cd50 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c  les in the pTabL
2cd60 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69  ist and any indi
2cd70 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72  ces selected for
2cd80 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20  .  ** searching 
2cd90 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
2cda0 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  */.  for(ii=0, p
2cdb0 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
2cdc0 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
2cdd0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
2cde0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
2cdf0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
2ce00 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  open */.    int 
2ce10 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
2ce20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73  Index of databas
2ce30 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
2ce40 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  le/index */.    
2ce50 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2ce60 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a  tem *pTabItem;..
2ce70 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
2ce80 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2ce90 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
2cea0 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
2ceb0 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d  >pTab;.    iDb =
2cec0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
2ced0 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
2cee0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c  pSchema);.    pL
2cef0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
2cf00 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70  Loop;.    if( (p
2cf10 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
2cf20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
2cf30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
2cf40 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t ){.      /* Do
2cf50 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
2cf60 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  }else.#ifndef SQ
2cf70 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2cf80 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28  LTABLE.    if( (
2cf90 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2cfa0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2cfb0 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
2cfc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54   const char *pVT
2cfd0 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ab = (const char
2cfe0 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61   *)sqlite3GetVTa
2cff0 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
2d000 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20       int iCur = 
2d010 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2d020 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
2d030 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2d040 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c  _VOpen, iCur, 0,
2d050 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54   0, pVTab, P4_VT
2d060 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  AB);.    }else i
2d070 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
2d080 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  b) ){.      /* n
2d090 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  oop */.    }else
2d0a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2d0b0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2d0c0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2d0d0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2d0e0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2d0f0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2d100 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  E)==0 ){.      i
2d110 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
2d120 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ead;.      if( p
2d130 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21  WInfo->eOnePass!
2d140 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a  =ONEPASS_OFF ){.
2d150 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
2d160 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
2d170 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
2d180 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61  OnePass[0] = pTa
2d190 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
2d1a0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73        };.      s
2d1b0 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
2d1c0 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
2d1d0 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
2d1e0 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20  pTab, op);.     
2d1f0 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65   assert( pTabIte
2d200 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76  m->iCursor==pLev
2d210 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20  el->iTabCur );. 
2d220 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2d230 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
2d240 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20  =ONEPASS_OFF && 
2d250 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  pTab->nCol==BMS-
2d260 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
2d270 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e  ase( pWInfo->eOn
2d280 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
2d290 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  FF && pTab->nCol
2d2a0 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
2d2b0 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  f( pWInfo->eOneP
2d2c0 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
2d2d0 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
2d2e0 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64 28 70  MS && HasRowid(p
2d2f0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2d300 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
2d310 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
2d320 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
2d330 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
2d340 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
2d350 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2d360 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
2d370 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f   -1, SQLITE_INT_
2d380 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e  TO_PTR(n), P4_IN
2d390 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  T32);.        as
2d3a0 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
2d3b0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Col );.      }.#
2d3c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2d3d0 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
2d3e0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
2d3f0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2d400 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
2d410 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2d420 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45  P5(v, OPFLAG_SEE
2d430 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b  KEQ|bFordelete);
2d440 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
2d450 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
2d460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2d470 68 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72 64  hangeP5(v, bFord
2d480 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a  elete);.      }.
2d490 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2d4a0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
2d4b0 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c 69  _MASK.      sqli
2d4c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
2d4d0 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55  8(v, OP_ColumnsU
2d4e0 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  sed, pTabItem->i
2d4f0 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20  Cursor, 0, 0,.  
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
2d520 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e   u8*)&pTabItem->
2d530 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36  colUsed, P4_INT6
2d540 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  4);.#endif.    }
2d550 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2d560 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
2d570 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
2d580 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
2d590 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
2d5a0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2d5b0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
2d5c0 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  XED ){.      Ind
2d5d0 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d  ex *pIx = pLoop-
2d5e0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
2d5f0 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65  .      int iInde
2d600 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  xCur;.      int 
2d610 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64  op = OP_OpenRead
2d620 3b 0a 20 20 20 20 20 20 2f 2a 20 69 41 75 78 41  ;.      /* iAuxA
2d630 72 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  rg is always set
2d640 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76   to a positive v
2d650 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20  alue if ONEPASS 
2d660 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  is possible */. 
2d670 20 20 20 20 20 61 73 73 65 72 74 28 20 69 41 75       assert( iAu
2d680 78 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e  xArg!=0 || (pWIn
2d690 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2d6a0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2d6b0 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20  ESIRED)==0 );.  
2d6c0 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
2d6d0 64 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69  d(pTab) && IsPri
2d6e0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78  maryKeyIndex(pIx
2d6f0 29 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74  ).       && (wct
2d700 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d710 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30  OR_SUBCLAUSE)!=0
2d720 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2d730 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65    /* This is one
2d740 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f   term of an OR-o
2d750 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e  ptimization usin
2d760 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
2d770 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a  Y of a.        *
2d780 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  * WITHOUT ROWID 
2d790 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20  table.  No need 
2d7a0 66 6f 72 20 61 20 73 65 70 61 72 61 74 65 20 69  for a separate i
2d7b0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
2d7c0 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76  iIndexCur = pLev
2d7d0 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20  el->iTabCur;.   
2d7e0 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20       op = 0;.   
2d7f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49     }else if( pWI
2d800 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
2d810 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
2d820 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20        Index *pJ 
2d830 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
2d840 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
2d850 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41    iIndexCur = iA
2d860 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 61  uxArg;.        a
2d870 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
2d880 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2d890 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20  S_DESIRED );.   
2d8a0 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
2d8b0 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49  YS(pJ) && pJ!=pI
2d8c0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
2d8d0 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20  IndexCur++;.    
2d8e0 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70        pJ = pJ->p
2d8f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
2d900 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
2d910 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
2d920 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
2d930 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e  OnePass[1] = iIn
2d940 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  dexCur;.      }e
2d950 6c 73 65 20 69 66 28 20 69 41 75 78 41 72 67 20  lse if( iAuxArg 
2d960 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
2d970 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
2d980 55 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  USE)!=0 ){.     
2d990 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69     iIndexCur = i
2d9a0 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20  AuxArg;.        
2d9b0 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64  op = OP_ReopenId
2d9c0 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  x;.      }else{.
2d9d0 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2d9e0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2d9f0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
2da00 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
2da10 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  r = iIndexCur;. 
2da20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
2da30 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
2da40 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
2da50 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
2da60 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Cur>=0 );.      
2da70 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20  if( op ){.      
2da80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2da90 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65  Op3(v, op, iInde
2daa0 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
2dab0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
2dac0 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
2dad0 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
2dae0 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ix);.        if(
2daf0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2db00 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
2db10 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20  INT)!=0.        
2db20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
2db30 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
2db40 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
2db50 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20  SKIPSCAN))==0.  
2db60 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
2db70 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
2db80 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
2db90 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2dba0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2dbb0 74 21 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t!=WHERE_DISTINC
2dbc0 54 5f 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20  T_ORDERED.      
2dbd0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
2dbe0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2dbf0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45  P5(v, OPFLAG_SEE
2dc00 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f  KEQ); /* Hint to
2dc10 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20   COMDB2 */.     
2dc20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62     }.        Vdb
2dc30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2dc40 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ", pIx->zName));
2dc50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2dc60 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
2dc70 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b  D_MASK.        {
2dc80 0a 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63  .          u64 c
2dc90 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20  olUsed = 0;.    
2dca0 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a        int ii, jj
2dcb0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2dcc0 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43  ii=0; ii<pIx->nC
2dcd0 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20  olumn; ii++){.  
2dce0 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70            jj = p
2dcf0 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d  Ix->aiColumn[ii]
2dd00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2dd10 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75  ( jj<0 ) continu
2dd20 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
2dd30 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20  f( jj>63 ) jj = 
2dd40 36 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  63;.            
2dd50 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63  if( (pTabItem->c
2dd60 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
2dd70 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  (jj))==0 ) conti
2dd80 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2dd90 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36   colUsed |= ((u6
2dda0 34 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69  4)1)<<(ii<63 ? i
2ddb0 69 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20  i : 63);.       
2ddc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2ddd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2dde0 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  Dup8(v, OP_Colum
2ddf0 6e 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75  nsUsed, iIndexCu
2de00 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
2de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de20 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63           (u8*)&c
2de30 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34  olUsed, P4_INT64
2de40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
2de50 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
2de60 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
2de70 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d  _MASK */.      }
2de80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2de90 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43  Db>=0 ) sqlite3C
2dea0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
2deb0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
2dec0 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
2ded0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2dee0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2def0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2df00 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
2df10 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
2df20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
2df30 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73  code to do the s
2df40 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65  earch.  Each ite
2df50 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  ration of the fo
2df60 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f  r.  ** loop belo
2df70 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  w generates code
2df80 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65   for a single ne
2df90 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
2dfa0 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d   VM.  ** program
2dfb0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
2dfc0 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
2dfd0 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61  ii++){.    int a
2dfe0 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  ddrExplain;.    
2dff0 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20  int wsFlags;.   
2e000 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
2e010 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73  o->a[ii];.    ws
2e020 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e  Flags = pLevel->
2e030 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b  pWLoop->wsFlags;
2e040 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e050 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
2e060 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c  NDEX.    if( (pL
2e070 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73  evel->pWLoop->ws
2e080 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
2e090 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a  TO_INDEX)!=0 ){.
2e0a0 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41        constructA
2e0b0 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50  utomaticIndex(pP
2e0c0 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  arse, &pWInfo->s
2e0d0 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  WC,.            
2e0e0 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61      &pTabList->a
2e0f0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c  [pLevel->iFrom],
2e100 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
2e110 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  l);.      if( db
2e120 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e130 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2e140 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e  Error;.    }.#en
2e150 64 69 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c  dif.    addrExpl
2e160 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ain = sqlite3Whe
2e170 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  reExplainOneScan
2e180 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
2e190 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
2e1a0 65 6c 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20  el, wctrlFlags. 
2e1b0 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c     );.    pLevel
2e1c0 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c  ->addrBody = sql
2e1d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2e1e0 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52  ddr(v);.    notR
2e1f0 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68  eady = sqlite3Wh
2e200 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  ereCodeOneLoopSt
2e210 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20  art(pWInfo, ii, 
2e220 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
2e230 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
2e240 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
2e250 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73  ont;.    if( (ws
2e260 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54  Flags&WHERE_MULT
2e270 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74  I_OR)==0 && (wct
2e280 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
2e290 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29  _SUBCLAUSE)==0 )
2e2a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  {.      sqlite3W
2e2b0 68 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75  hereAddScanStatu
2e2c0 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  s(v, pTabList, p
2e2d0 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61  Level, addrExpla
2e2e0 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  in);.    }.  }..
2e2f0 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20    /* Done. */.  
2e300 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
2e310 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45  t((v, "Begin WHE
2e320 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65  RE-core"));.  re
2e330 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20  turn pWInfo;..  
2e340 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
2e350 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
2e360 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a  whereBeginError:
2e370 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b  .  if( pWInfo ){
2e380 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
2e390 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
2e3a0 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2e3b0 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f  p;.    whereInfo
2e3c0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2e3d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2e3e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 74 20  ;.}../*.** Part 
2e3f0 6f 66 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  of sqlite3WhereE
2e400 6e 64 28 29 20 77 69 6c 6c 20 72 65 77 72 69 74  nd() will rewrit
2e410 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 72 65 66  e opcodes to ref
2e420 65 72 65 6e 63 65 20 74 68 65 0a 2a 2a 20 69 6e  erence the.** in
2e430 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 20  dex rather than 
2e440 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20  the main table. 
2e450 20 49 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47   In SQLITE_DEBUG
2e460 20 6d 6f 64 65 2c 20 77 65 20 77 61 6e 74 0a 2a   mode, we want.*
2e470 2a 20 74 6f 20 74 72 61 63 65 20 74 68 6f 73 65  * to trace those
2e480 20 63 68 61 6e 67 65 73 20 69 66 20 50 52 41 47   changes if PRAG
2e490 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61  MA vdbe_addoptra
2e4a0 63 65 3d 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ce=on.  This rou
2e4b0 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 74 68 61  tine.** does tha
2e4c0 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
2e4d0 4c 49 54 45 5f 44 45 42 55 47 0a 23 20 64 65 66  LITE_DEBUG.# def
2e4e0 69 6e 65 20 4f 70 63 6f 64 65 52 65 77 72 69 74  ine OpcodeRewrit
2e4f0 65 54 72 61 63 65 28 44 2c 4b 2c 50 29 20 2f 2a  eTrace(D,K,P) /*
2e500 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6c 73 65 0a   no-op */.#else.
2e510 23 20 64 65 66 69 6e 65 20 4f 70 63 6f 64 65 52  # define OpcodeR
2e520 65 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b 2c  ewriteTrace(D,K,
2e530 50 29 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  P) sqlite3WhereO
2e540 70 63 6f 64 65 52 65 77 72 69 74 65 54 72 61 63  pcodeRewriteTrac
2e550 65 28 44 2c 4b 2c 50 29 0a 20 20 73 74 61 74 69  e(D,K,P).  stati
2e560 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  c void sqlite3Wh
2e570 65 72 65 4f 70 63 6f 64 65 52 65 77 72 69 74 65  ereOpcodeRewrite
2e580 54 72 61 63 65 28 0a 20 20 20 20 73 71 6c 69 74  Trace(.    sqlit
2e590 65 33 20 2a 64 62 2c 0a 20 20 20 20 69 6e 74 20  e3 *db,.    int 
2e5a0 70 63 2c 0a 20 20 20 20 56 64 62 65 4f 70 20 2a  pc,.    VdbeOp *
2e5b0 70 4f 70 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  pOp.  ){.    if(
2e5c0 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
2e5d0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
2e5e0 61 63 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ace)==0 ) return
2e5f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2e600 65 50 72 69 6e 74 4f 70 28 30 2c 20 70 63 2c 20  ePrintOp(0, pc, 
2e610 70 4f 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pOp);.  }.#endif
2e620 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2e630 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2e640 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
2e650 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
2e660 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2e670 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
2e680 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
2e690 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2e6a0 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
2e6b0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
2e6c0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
2e6d0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
2e6e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2e6f0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2e700 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
2e710 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65  *pLevel;.  Where
2e720 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53  Loop *pLoop;.  S
2e730 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2e740 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2e750 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
2e760 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2e770 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
2e780 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
2e790 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64   code..  */.  Vd
2e7a0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
2e7b0 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63  (v, "End WHERE-c
2e7c0 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  ore"));.  sqlite
2e7d0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2e7e0 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
2e7f0 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
2e800 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
2e810 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
2e820 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
2e830 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
2e840 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
2e850 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  oop;.    if( pLe
2e860 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
2e870 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
2e880 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41  TE_DISABLE_SKIPA
2e890 48 45 41 44 5f 44 49 53 54 49 4e 43 54 0a 20 20  HEAD_DISTINCT.  
2e8a0 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 65 6b      int addrSeek
2e8b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65   = 0;.      Inde
2e8c0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 69  x *pIdx;.      i
2e8d0 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nt n;.      if( 
2e8e0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2e8f0 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
2e900 54 5f 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20  T_ORDERED.      
2e910 20 26 26 20 69 3d 3d 70 57 49 6e 66 6f 2d 3e 6e   && i==pWInfo->n
2e920 4c 65 76 65 6c 2d 31 20 20 2f 2a 20 54 69 63 6b  Level-1  /* Tick
2e930 65 74 20 5b 65 66 39 33 31 38 37 35 37 62 31 35  et [ef9318757b15
2e940 32 65 33 5d 20 32 30 31 37 2d 31 30 2d 32 31 20  2e3] 2017-10-21 
2e950 2a 2f 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c  */.       && (pL
2e960 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2e970 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
2e980 0a 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78  .       && (pIdx
2e990 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
2e9a0 65 2e 70 49 6e 64 65 78 29 2d 3e 68 61 73 53 74  e.pIndex)->hasSt
2e9b0 61 74 31 0a 20 20 20 20 20 20 20 26 26 20 28 6e  at1.       && (n
2e9c0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
2e9d0 65 2e 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20 20  e.nIdxCol)>0.   
2e9e0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 61 69 52      && pIdx->aiR
2e9f0 6f 77 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a  owLogEst[n]>=36.
2ea00 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2ea10 20 69 6e 74 20 72 31 20 3d 20 70 50 61 72 73 65   int r1 = pParse
2ea20 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
2ea30 20 20 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20    int j, op;.   
2ea40 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2ea50 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
2ea60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ea70 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
2ea80 6e 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  n, pLevel->iIdxC
2ea90 75 72 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20  ur, j, r1+j);.  
2eaa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2eab0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2eac0 6e 2b 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  n+1;.        op 
2ead0 3d 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  = pLevel->op==OP
2eae0 5f 50 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c  _Prev ? OP_SeekL
2eaf0 54 20 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20  T : OP_SeekGT;. 
2eb00 20 20 20 20 20 20 20 61 64 64 72 53 65 65 6b 20         addrSeek 
2eb10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2eb20 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c  Op4Int(v, op, pL
2eb30 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30  evel->iIdxCur, 0
2eb40 2c 20 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20  , r1, n);.      
2eb50 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2eb60 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  (v, op==OP_SeekL
2eb70 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  T);.        Vdbe
2eb80 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
2eb90 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20  ==OP_SeekGT);.  
2eba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ebb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2ebc0 74 6f 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  to, 1, pLevel->p
2ebd0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  2);.      }.#end
2ebe0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53  if /* SQLITE_DIS
2ebf0 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44  ABLE_SKIPAHEAD_D
2ec00 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20  ISTINCT */.     
2ec10 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
2ec20 61 73 65 3a 20 41 64 76 61 6e 63 65 20 74 6f 20  ase: Advance to 
2ec30 74 68 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  the next row */.
2ec40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ec50 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2ec60 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
2ec70 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2ec80 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70  3VdbeAddOp3(v, p
2ec90 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
2eca0 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
2ecb0 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a  2, pLevel->p3);.
2ecc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ecd0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65  eChangeP5(v, pLe
2ece0 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20  vel->p5);.      
2ecf0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2ed00 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
2ed10 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
2ed20 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20  >op==OP_Next);. 
2ed30 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2ed40 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2ed50 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20  p==OP_Prev);.   
2ed60 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2ed70 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
2ed80 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66 6e  =OP_VNext);.#ifn
2ed90 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2eda0 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53  LE_SKIPAHEAD_DIS
2edb0 54 49 4e 43 54 0a 20 20 20 20 20 20 69 66 28 20  TINCT.      if( 
2edc0 61 64 64 72 53 65 65 6b 20 29 20 73 71 6c 69 74  addrSeek ) sqlit
2edd0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2ede0 2c 20 61 64 64 72 53 65 65 6b 29 3b 0a 23 65 6e  , addrSeek);.#en
2edf0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
2ee00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ee10 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2ee20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
2ee30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2ee40 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
2ee50 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
2ee60 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
2ee70 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
2ee80 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
2ee90 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
2eea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2eeb0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2eec0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
2eed0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
2eee0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
2eef0 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
2ef00 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
2ef10 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
2ef20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2ef30 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2ef40 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
2ef50 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
2ef60 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2ef70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
2ef80 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e         if( pIn->
2ef90 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20  nPrefix ){.     
2efa0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2efb0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2efc0 57 48 45 52 45 5f 49 4e 5f 45 41 52 4c 59 4f 55  WHERE_IN_EARLYOU
2efd0 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  T );.           
2efe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2eff0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 66 4e 6f  p4Int(v, OP_IfNo
2f000 48 6f 70 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  Hope, pLevel->iI
2f010 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  dxCur,.         
2f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f040 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
2f050 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f070 70 49 6e 2d 3e 69 42 61 73 65 2c 20 70 49 6e 2d  pIn->iBase, pIn-
2f080 3e 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20  >nPrefix);.     
2f090 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
2f0a0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2f0b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2f0c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f0d0 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
2f0e0 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  Op, pIn->iCur, p
2f0f0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
2f100 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2f110 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2f120 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2f130 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64  eIf(v, pIn->eEnd
2f140 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 29  LoopOp==OP_Prev)
2f150 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
2f160 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
2f170 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
2f180 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20  P_Next);.       
2f190 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2f1a0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2f1b0 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
2f1c0 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
2f1d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2f1e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2f1f0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
2f200 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  k);.    if( pLev
2f210 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a  el->addrSkip ){.
2f220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f230 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d  eGoto(v, pLevel-
2f240 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20  >addrSkip);.    
2f250 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2f260 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61  , "next skip-sca
2f270 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d  n on %s", pLoop-
2f280 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
2f290 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2f2a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2f2b0 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
2f2c0 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  ddrSkip);.      
2f2d0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2f2e0 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
2f2f0 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20  ddrSkip-2);.    
2f300 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2f310 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54  _LIKE_DOESNT_MAT
2f320 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66 28  CH_BLOBS.    if(
2f330 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b   pLevel->addrLik
2f340 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20 73 71  eRep ){.      sq
2f350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f360 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65  v, OP_DecrJumpZe
2f370 72 6f 2c 20 28 69 6e 74 29 28 70 4c 65 76 65 6c  ro, (int)(pLevel
2f380 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e  ->iLikeRepCntr>>
2f390 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1),.            
2f3a0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76              pLev
2f3b0 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29  el->addrLikeRep)
2f3c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2f3d0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23  rage(v);.    }.#
2f3e0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c  endif.    if( pL
2f3f0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
2f400 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20  ){.      int ws 
2f410 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
2f420 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
2f430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2f440 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c  (v, OP_IfPos, pL
2f450 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
2f460 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2f470 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f480 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58   (ws & WHERE_IDX
2f490 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 28 77 73  _ONLY)==0 || (ws
2f4a0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2f4b0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
2f4c0 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44  ( (ws & WHERE_ID
2f4d0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
2f4e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
2f4f0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3d 3d 70  evel->iTabCur==p
2f500 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2f510 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
2f520 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
2f530 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2f540 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
2f550 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a  evel->iTabCur);.
2f560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2f570 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e  ( (ws & WHERE_IN
2f580 44 45 58 45 44 29 20 0a 20 20 20 20 20 20 20 7c  DEXED) .       |
2f590 7c 20 28 28 77 73 20 26 20 57 48 45 52 45 5f 4d  | ((ws & WHERE_M
2f5a0 55 4c 54 49 5f 4f 52 29 20 26 26 20 70 4c 65 76  ULTI_OR) && pLev
2f5b0 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 29 20 0a  el->u.pCovidx) .
2f5c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2f5d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f5e0 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
2f5f0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
2f600 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2f610 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
2f620 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20  ==OP_Return ){. 
2f630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2f640 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2f650 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  osub, pLevel->p1
2f660 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
2f670 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rst);.      }els
2f680 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2f690 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c  e3VdbeGoto(v, pL
2f6a0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
2f6b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f6c0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2f6d0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
2f6e0 20 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75    }.    VdbeModu
2f6f0 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
2f700 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a  nd WHERE-loop%d:
2f710 20 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20   %s", i,.       
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
2f730 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2f740 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2f750 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  .pTab->zName));.
2f760 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
2f770 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
2f780 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
2f790 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
2f7a0 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
2f7b0 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
2f7c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2f7d0 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
2f7e0 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73  >iBreak);..  ass
2f7f0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
2f800 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  vel<=pTabList->n
2f810 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Src );.  for(i=0
2f820 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
2f830 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  >a; i<pWInfo->nL
2f840 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  evel; i++, pLeve
2f850 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c  l++){.    int k,
2f860 20 6c 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f   last;.    VdbeO
2f870 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65  p *pOp;.    Inde
2f880 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
2f890 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2f8a0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
2f8b0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
2f8c0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
2f8d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2f8e0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
2f8f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2f900 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  !=0 );.    pLoop
2f910 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2f920 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  p;..    /* For a
2f930 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61   co-routine, cha
2f940 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d  nge all OP_Colum
2f950 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  n references to 
2f960 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
2f970 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   ** the co-routi
2f980 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20  ne into OP_Copy 
2f990 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  of result contai
2f9a0 6e 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65  ned in a registe
2f9b0 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77  r..    ** OP_Row
2f9c0 69 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75  id becomes OP_Nu
2f9d0 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ll..    */.    i
2f9e0 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
2f9f0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
2fa00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2fa10 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2fa20 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
2fa30 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d    translateColum
2fa40 6e 54 6f 43 6f 70 79 28 70 50 61 72 73 65 2c 20  nToCopy(pParse, 
2fa50 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
2fa60 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
2fa70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2fa90 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75  TabItem->regResu
2faa0 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f  lt, 0);.      co
2fab0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
2fac0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
2fad0 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
2fae0 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65  , make VDBE code
2faf0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74   substitutions t
2fb00 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20  o read data.    
2fb10 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ** from the inde
2fb20 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f  x instead of fro
2fb30 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72  m the table wher
2fb40 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20  e possible.  In 
2fb50 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a  some cases.    *
2fb60 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * this optimizat
2fb70 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65  ion prevents the
2fb80 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72   table from ever
2fb90 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69   being read, whi
2fba0 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69  ch can.    ** yi
2fbb0 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e  eld a significan
2fbc0 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  t performance bo
2fbd0 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ost..    ** .   
2fbe0 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65   ** Calls to the
2fbf0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
2fc00 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74  in between sqlit
2fc10 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64  e3WhereBegin and
2fc20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  .    ** sqlite3W
2fc30 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76  hereEnd will hav
2fc40 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74  e created code t
2fc50 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
2fc60 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
2fc70 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
2fc80 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74  loop scans all t
2fc90 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67  hat code looking
2fca0 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20   for opcodes.   
2fcb0 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e   ** that referen
2fcc0 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  ce the table and
2fcd0 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69   converts them i
2fce0 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74  nto opcodes that
2fcf0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
2fd00 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  e the index..   
2fd10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
2fd20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
2fd30 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52  ERE_INDEXED|WHER
2fd40 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20  E_IDX_ONLY) ){. 
2fd50 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f       pIdx = pLoo
2fd60 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2fd70 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  x;.    }else if(
2fd80 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
2fd90 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
2fda0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
2fdb0 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
2fdc0 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  dx;.    }.    if
2fdd0 28 20 70 49 64 78 0a 20 20 20 20 20 26 26 20 28  ( pIdx.     && (
2fde0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2fdf0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c  ==ONEPASS_OFF ||
2fe00 20 21 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d   !HasRowid(pIdx-
2fe10 3e 70 54 61 62 6c 65 29 29 0a 20 20 20 20 20 26  >pTable)).     &
2fe20 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
2fe30 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  led.    ){.     
2fe40 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
2fe50 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2fe60 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65  );.      k = pLe
2fe70 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 23  vel->addrBody;.#
2fe80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2fe90 55 47 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  UG.      if( db-
2fea0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2feb0 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
2fec0 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
2fed0 28 22 54 52 41 4e 53 4c 41 54 45 20 6f 70 63 6f  ("TRANSLATE opco
2fee0 64 65 73 20 69 6e 20 72 61 6e 67 65 20 25 64 2e  des in range %d.
2fef0 2e 25 64 5c 6e 22 2c 20 6b 2c 20 6c 61 73 74 2d  .%d\n", k, last-
2ff00 31 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  1);.      }.#end
2ff10 69 66 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  if.      pOp = s
2ff20 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
2ff30 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72  v, k);.      for
2ff40 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20  (; k<last; k++, 
2ff50 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pOp++){.        
2ff60 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65  if( pOp->p1!=pLe
2ff70 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63  vel->iTabCur ) c
2ff80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2ff90 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2ffa0 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 0a 23 69 66 64  ==OP_Column.#ifd
2ffb0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2ffc0 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
2ffd0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  .         || pOp
2ffe0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 66 66  ->opcode==OP_Off
2fff0 73 65 74 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  set.#endif.     
30000 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
30010 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b  int x = pOp->p2;
30020 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
30030 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d  t( pIdx->pTable=
30040 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  =pTab );.       
30050 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
30060 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
30070 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
30080 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
30090 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
300a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d  .            x =
300b0 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78   pPk->aiColumn[x
300c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ];.            a
300d0 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20  ssert( x>=0 );. 
300e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
300f0 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
30100 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
30110 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  dx, x);.        
30120 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
30130 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
30140 32 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20  2 = x;.         
30150 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
30160 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
30170 20 20 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65            Opcode
30180 52 65 77 72 69 74 65 54 72 61 63 65 28 64 62 2c  RewriteTrace(db,
30190 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20   k, pOp);.      
301a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
301b0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
301c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
301d0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
301e0 78 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  x>=0 .          
301f0 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65      || pWInfo->e
30200 4f 6e 65 50 61 73 73 20 29 3b 0a 20 20 20 20 20  OnePass );.     
30210 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
30220 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
30230 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
30240 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
30250 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
30260 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
30270 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
30280 20 20 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65            Opcode
30290 52 65 77 72 69 74 65 54 72 61 63 65 28 64 62 2c  RewriteTrace(db,
302a0 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20   k, pOp);.      
302b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
302c0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 75  >opcode==OP_IfNu
302d0 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  llRow ){.       
302e0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
302f0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
30300 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65          OpcodeRe
30310 77 72 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b  writeTrace(db, k
30320 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
30330 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  }.      }.#ifdef
30340 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
30350 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
30360 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
30370 64 64 6f 70 54 72 61 63 65 20 29 20 70 72 69 6e  ddopTrace ) prin
30380 74 66 28 22 54 52 41 4e 53 4c 41 54 45 20 63 6f  tf("TRANSLATE co
30390 6d 70 6c 65 74 65 5c 6e 22 29 3b 0a 23 65 6e 64  mplete\n");.#end
303a0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
303b0 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
303c0 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  .  */.  pParse->
303d0 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
303e0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
303f0 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66  Loop;.  whereInf
30400 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
30410 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.