/ Hex Artifact Content
Login

Artifact f24ffd41cd3a186731817bb7f05ea9a6c4f0474235b6b8a718985db5f8cb9822:


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 5c 22   "next row of \"
70e0: 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d  %s\"", pTabItem-
70f0: 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
7100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
7110: 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
7120: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
7130: 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  ewind, pLevel->i
7140: 54 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f 76  TabCur); VdbeCov
7150: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
7160: 69 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a  if( pPartial ){.
7170: 20 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20      iContinue = 
7180: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
7190: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
71a0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
71b0: 70 50 61 72 73 65 2c 20 70 50 61 72 74 69 61 6c  pParse, pPartial
71c0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c  , iContinue, SQL
71d0: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
71e0: 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
71f0: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 50 41 52  ags |= WHERE_PAR
7200: 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72  TIALIDX;.  }.  r
7210: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
7220: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7230: 72 73 65 29 3b 0a 20 20 72 65 67 42 61 73 65 20  rse);.  regBase 
7240: 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  = sqlite3Generat
7250: 65 49 6e 64 65 78 4b 65 79 28 0a 20 20 20 20 20  eIndexKey(.     
7260: 20 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70   pParse, pIdx, p
7270: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
7280: 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c  regRecord, 0, 0,
7290: 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 73 71 6c   0, 0.  );.  sql
72a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
72b0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
72c0: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
72d0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
72e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
72f0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
7300: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69  SEEKRESULT);.  i
7310: 66 28 20 70 50 61 72 74 69 61 6c 20 29 20 73 71  f( pPartial ) sq
7320: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
7330: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
7340: 75 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 49  ue);.  if( pTabI
7350: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
7360: 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tine ){.    sqli
7370: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
7380: 76 2c 20 61 64 64 72 43 6f 75 6e 74 65 72 2c 20  v, addrCounter, 
7390: 72 65 67 42 61 73 65 2b 6e 29 3b 0a 20 20 20 20  regBase+n);.    
73a0: 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
73b0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
73c0: 65 64 20 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c  ed );.    transl
73d0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
73e0: 70 50 61 72 73 65 2c 20 61 64 64 72 54 6f 70 2c  pParse, addrTop,
73f0: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
7400: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7410: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
7420: 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c  Item->regResult,
7430: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
7440: 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
7450: 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49 74  Top);.    pTabIt
7460: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
7470: 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ine = 0;.  }else
7480: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
7490: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
74a0: 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
74b0: 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
74c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
74d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
74e0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
74f0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
7500: 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73  _AUTOINDEX);.  s
7510: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7520: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
7530: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7540: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
7550: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
7560: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
7570: 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20  p(pParse);.  .  
7580: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
7590: 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
75a0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
75b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
75c0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
75d0: 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69  it);..end_auto_i
75e0: 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20 73  ndex_create:.  s
75f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7600: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
7610: 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  rtial);.}.#endif
7620: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7630: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
7640: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7650: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7660: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
7670: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
7680: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
7690: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
76a0: 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
76b0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
76c0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
76d0: 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
76e0: 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
76f0: 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
7700: 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
7710: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
7720: 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
7730: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
7740: 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
7750: 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
7760: 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
7770: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7790: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
77a0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
77b0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
77c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
77d0: 45 52 45 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ERE clause being
77e0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
77f0: 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
7800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7810: 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73 20 77  * Ignore terms w
7820: 69 74 68 20 74 68 65 73 65 20 70 72 65 72 65 71  ith these prereq
7830: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
7840: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
7850: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ,      /* The FR
7860: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
7870: 68 61 74 20 69 73 20 74 68 65 20 76 74 61 62 20  hat is the vtab 
7880: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7890: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
78a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
78b0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
78c0: 20 75 31 36 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20   u16 *pmNoOmit  
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 65 72 6d   /* Mask of term
78f0: 73 20 6e 6f 74 20 74 6f 20 6f 6d 69 74 20 2a 2f  s not to omit */
7900: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
7910: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
7920: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7930: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
7940: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
7950: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7960: 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
7970: 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
7980: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
7990: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
79a0: 70 55 73 61 67 65 3b 0a 20 20 73 74 72 75 63 74  pUsage;.  struct
79b0: 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f   HiddenIndexInfo
79c0: 20 2a 70 48 69 64 64 65 6e 3b 0a 20 20 57 68 65   *pHidden;.  Whe
79d0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
79e0: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
79f0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7a00: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
7a10: 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 20 3d 20 30   u16 mNoOmit = 0
7a20: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
7a30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
7a40: 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
7a50: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
7a60: 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
7a70: 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
7a80: 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
7a90: 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
7aa0: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
7ab0: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
7ac0: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
7ad0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
7ae0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
7af0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7b00: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
7b10: 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20  ght & mUnusable 
7b20: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7b30: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
7b40: 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
7b50: 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
7b60: 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
7b70: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7b80: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
7b90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7ba0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7bb0: 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
7bc0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7bd0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7be0: 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IS );.    test
7bf0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7c00: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
7c10: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
7c20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
7c30: 28 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29  (WO_EQUIV))==0 )
7c40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7c50: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
7c60: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29  s & TERM_VNULL )
7c70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
7c80: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e  ssert( pTerm->u.
7c90: 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29  leftColumn>=(-1)
7ca0: 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b   );.    nTerm++;
7cb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
7cc0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7cd0: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
7ce0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
7cf0: 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
7d00: 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
7d10: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
7d20: 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
7d30: 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
7d40: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7d50: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
7d60: 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
7d70: 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
7d80: 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  By ){.    int n 
7d90: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
7da0: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
7db0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
7dc0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
7dd0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
7de0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
7df0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
7e00: 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
7e10: 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
7e20: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
7e30: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29   }.    if( i==n)
7e40: 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79  {.      nOrderBy
7e50: 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
7e60: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
7e70: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
7e80: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
7e90: 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
7ea0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7eb0: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
7ec0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e  , sizeof(*pIdxIn
7ed0: 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo).            
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
7ef0: 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f   (sizeof(*pIdxCo
7f00: 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55  ns) + sizeof(*pU
7f10: 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20  sage))*nTerm.   
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
7f40: 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e  (*pIdxOrderBy)*n
7f50: 4f 72 64 65 72 42 79 20 2b 20 73 69 7a 65 6f 66  OrderBy + sizeof
7f60: 28 2a 70 48 69 64 64 65 6e 29 20 29 3b 0a 20 20  (*pHidden) );.  
7f70: 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
7f80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
7f90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7fa0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
7fb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7fc0: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
7fd0: 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
7fe0: 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
7ff0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
8000: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
8010: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
8020: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
8030: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
8040: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
8050: 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
8060: 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
8070: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
8080: 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
8090: 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
80a0: 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
80b0: 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 48 69 64 64  ds..  */.  pHidd
80c0: 65 6e 20 3d 20 28 73 74 72 75 63 74 20 48 69 64  en = (struct Hid
80d0: 64 65 6e 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70  denIndexInfo*)&p
80e0: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
80f0: 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
8100: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
8110: 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 48 69 64  onstraint*)&pHid
8120: 64 65 6e 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  den[1];.  pIdxOr
8130: 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
8140: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
8150: 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
8160: 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
8170: 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
8180: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
8190: 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
81a0: 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
81b0: 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
81c0: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
81d0: 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
81e0: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
81f0: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
8200: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
8210: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
8220: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
8230: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
8240: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
8250: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
8260: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
8270: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
8280: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
8290: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
82a0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
82b0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
82c0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
82d0: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
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 20 20                  
8320: 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 70 48 69    pUsage;..  pHi
8330: 64 64 65 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b  dden->pWC = pWC;
8340: 0a 20 20 70 48 69 64 64 65 6e 2d 3e 70 50 61 72  .  pHidden->pPar
8350: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
8360: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
8370: 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
8380: 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
8390: 2b 2b 29 7b 0a 20 20 20 20 75 31 36 20 6f 70 3b  ++){.    u16 op;
83a0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
83b0: 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
83c0: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
83d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
83e0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
83f0: 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29  ht & mUnusable )
8400: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
8410: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
8420: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
8430: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
8440: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
8450: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
8460: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
8470: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
8480: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8490: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73  WO_IS );.    tes
84a0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
84b0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
84c0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
84d0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
84e0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29  rator & WO_ALL )
84f0: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
8500: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28  ->eOperator & ~(
8510: 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20  WO_EQUIV))==0 ) 
8520: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8530: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
8540: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
8550: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
8560: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c  sert( pTerm->u.l
8570: 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20  eftColumn>=(-1) 
8580: 29 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  );.    pIdxCons[
8590: 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65  j].iColumn = pTe
85a0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
85b0: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
85c0: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
85d0: 69 3b 0a 20 20 20 20 6f 70 20 3d 20 70 54 65 72  i;.    op = pTer
85e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
85f0: 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f  O_ALL;.    if( o
8600: 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20  p==WO_IN ) op = 
8610: 57 4f 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 6f  WO_EQ;.    if( o
8620: 70 3d 3d 57 4f 5f 41 55 58 20 29 7b 0a 20 20 20  p==WO_AUX ){.   
8630: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
8640: 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63  p = pTerm->eMatc
8650: 68 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  hOp;.    }else i
8660: 66 28 20 6f 70 20 26 20 28 57 4f 5f 49 53 4e 55  f( op & (WO_ISNU
8670: 4c 4c 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20  LL|WO_IS) ){.   
8680: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 53     if( op==WO_IS
8690: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
86a0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
86b0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
86c0: 4e 53 54 52 41 49 4e 54 5f 49 53 4e 55 4c 4c 3b  NSTRAINT_ISNULL;
86d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
86e0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
86f0: 5d 2e 6f 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ].op = SQLITE_IN
8700: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49  DEX_CONSTRAINT_I
8710: 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  S;.      }.    }
8720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78  else{.      pIdx
8730: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38  Cons[j].op = (u8
8740: 29 6f 70 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  )op;.      /* Th
8750: 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
8760: 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
8770: 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
8780: 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
8790: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 57  e.      ** the W
87a0: 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
87b0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
87c0: 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
87d0: 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20  cal.  The.      
87e0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
87f0: 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73  erts verify this
8800: 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20   fact. */.      
8810: 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53  assert( WO_EQ==S
8820: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8830: 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20  TRAINT_EQ );.   
8840: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54     assert( WO_LT
8850: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
8860: 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a  ONSTRAINT_LT );.
8870: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
8880: 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
8890: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
88a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
88b0: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
88c0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
88d0: 47 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GT );.      asse
88e0: 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
88f0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8900: 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 61  NT_GE );.      a
8910: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
8920: 70 65 72 61 74 6f 72 26 28 57 4f 5f 49 4e 7c 57  perator&(WO_IN|W
8930: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
8940: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
8950: 41 55 58 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  AUX) );..      i
8960: 66 28 20 6f 70 20 26 20 28 57 4f 5f 4c 54 7c 57  f( op & (WO_LT|W
8970: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
8980: 29 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  ).       && sqli
8990: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
89a0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
89b0: 69 67 68 74 29 20 0a 20 20 20 20 20 20 29 7b 0a  ight) .      ){.
89c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 31 36          if( i<16
89d0: 20 29 20 6d 4e 6f 4f 6d 69 74 20 7c 3d 20 28 31   ) mNoOmit |= (1
89e0: 20 3c 3c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   << i);.        
89f0: 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20  if( op==WO_LT ) 
8a00: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
8a10: 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20   WO_LE;.        
8a20: 69 66 28 20 6f 70 3d 3d 57 4f 5f 47 54 20 29 20  if( op==WO_GT ) 
8a30: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
8a40: 20 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 7d 0a   WO_GE;.      }.
8a50: 20 20 20 20 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a      }..    j++;.
8a60: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
8a70: 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
8a80: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
8a90: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8aa0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
8ab0: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
8ac0: 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
8ad0: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
8ae0: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
8af0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
8b00: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
8b10: 20 2a 70 6d 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f   *pmNoOmit = mNo
8b20: 4f 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 20 70  Omit;.  return p
8b30: 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
8b40: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
8b50: 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
8b60: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
8b70: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
8b80: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
8b90: 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
8ba0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
8bb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
8bc0: 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
8bd0: 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
8be0: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
8bf0: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
8c00: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
8c10: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
8c20: 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20  comes in as the 
8c30: 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3rd argument to 
8c40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
8c50: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
8c60: 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
8c70: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
8c80: 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
8c90: 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
8ca0: 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
8cb0: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
8cc0: 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
8cd0: 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
8ce0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
8cf0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8d00: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
8d10: 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
8d20: 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
8d30: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
8d40: 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
8d50: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
8d60: 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
8d70: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
8d80: 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
8d90: 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
8da0: 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
8db0: 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
8dc0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
8dd0: 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
8de0: 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
8df0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
8e00: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
8e10: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
8e20: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
8e30: 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
8e40: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
8e50: 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
8e60: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
8e70: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
8e80: 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
8e90: 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
8ea0: 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
8eb0: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
8ec0: 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
8ed0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8ee0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8ef0: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
8f00: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
8f10: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
8f20: 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
8f30: 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
8f40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8f50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
8f60: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
8f70: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
8f80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8f90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8fa0: 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
8fb0: 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
8fc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8fd0: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
8fe0: 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
8ff0: 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20 2f   = 0;..#if 0.  /
9000: 2a 20 54 68 69 73 20 65 72 72 6f 72 20 69 73 20  * This error is 
9010: 6e 6f 77 20 63 61 75 67 68 74 20 62 79 20 74 68  now caught by th
9020: 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20 53  e caller..  ** S
9030: 65 61 72 63 68 20 66 6f 72 20 22 78 42 65 73 74  earch for "xBest
9040: 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f  Index malfunctio
9050: 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66 6f  n" below */.  fo
9060: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
9070: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
9080: 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73     if( !p->aCons
9090: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
90a0: 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69   && p->aConstrai
90b0: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
90c0: 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
90d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
90e0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
90f0: 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42     "table %s: xB
9100: 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65  estIndex returne
9110: 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61  d an invalid pla
9120: 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
9130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
9140: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61  if..  return pPa
9150: 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e  rse->nErr;.}.#en
9160: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
9170: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9180: 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
9190: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
91a0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
91b0: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
91c0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
91d0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
91e0: 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
91f0: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
9200: 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
9210: 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
9220: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
9230: 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
9240: 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
9250: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52  ows less than pR
9260: 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  ec.**    aStat[1
9270: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
9280: 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
9290: 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52   to pRec.**.** R
92a0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
92b0: 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68  of the sample th
92c0: 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65  at is the smalle
92d0: 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a  st sample that.*
92e0: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
92f0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
9300: 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ec. Note that th
9310: 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  is index is not 
9320: 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f  an index.** into
9330: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9340: 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20  rray - it is an 
9350: 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72  index into a vir
9360: 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70  tual set of samp
9370: 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  les.** based on 
9380: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
9390: 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68  aSample[] and th
93a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
93b0: 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a  ds in record .**
93c0: 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69   pRec. .*/.stati
93d0: 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
93e0: 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
93f0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
9400: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
9410: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
9420: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
9430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9440: 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
9450: 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55  domain of */.  U
9460: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
9470: 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65  Rec,       /* Ve
9480: 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74  ctor of values t
9490: 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
94a0: 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20  int roundUp,    
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
94c0: 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e  ound up if true.
94d0: 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20    Round down if 
94e0: 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63  false */.  tRowc
94f0: 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20  nt *aStat       
9500: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
9510: 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72  tats written her
9520: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53  e */.){.  IndexS
9530: 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d  ample *aSample =
9540: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
9550: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9570: 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72   Index of requir
9580: 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71  ed stats in anEq
9590: 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  [] etc. */.  int
95a0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
95b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
95c0: 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c  x of first sampl
95d0: 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69  e >= pRec */.  i
95e0: 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20  nt iSample;     
95f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
9600: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61  allest sample la
9610: 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
9620: 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
9630: 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20  int iMin = 0;   
9640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9650: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e  mallest sample n
9660: 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f  ot yet tested */
9670: 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20  .  int iTest;   
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9690: 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f  * Next sample to
96a0: 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72   test */.  int r
96b0: 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
96c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
96d0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   of comparison o
96e0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
96f0: 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20  t nField;       
9700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9710: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
9720: 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63   pRec */.  tRowc
9730: 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20  nt iLower = 0;  
9740: 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d         /* anLt[]
9750: 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72   + anEq[] of lar
9760: 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63  gest sample pRec
9770: 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65   is > */..#ifnde
9780: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9790: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
97a0: 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e  R( pParse );.#en
97b0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52  dif.  assert( pR
97c0: 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ec!=0 );.  asser
97d0: 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  t( pIdx->nSample
97e0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
97f0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26  pRec->nField>0 &
9800: 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d  & pRec->nField<=
9810: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
9820: 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62   );..  /* Do a b
9830: 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f 20  inary search to 
9840: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 73  find the first s
9850: 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74 68  ample greater th
9860: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a  an or equal.  **
9870: 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65   to pRec. If pRe
9880: 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  c contains a sin
9890: 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73  gle field, the s
98a0: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f  et of samples to
98b0: 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20   search.  ** is 
98c0: 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70  simply the aSamp
98d0: 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74  le[] array. If t
98e0: 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53  he samples in aS
98f0: 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20  ample[] contain 
9900: 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f  more.  ** than o
9910: 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66  ne fields, all f
9920: 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  ields following 
9930: 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67  the first are ig
9940: 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nored..  **.  **
9950: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
9960: 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72  s N fields, wher
9970: 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  e N is more than
9980: 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65   one, then as we
9990: 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73  ll as the.  ** s
99a0: 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c  amples in aSampl
99b0: 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74  e[] (truncated t
99c0: 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65  o N fields), the
99d0: 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73   search also has
99e0: 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65   to.  ** conside
99f0: 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74 68  r prefixes of th
9a00: 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72  ose samples. For
9a10: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
9a20: 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a   set of samples.
9a30: 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20    ** in aSample 
9a40: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
9a50: 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28    aSample[0] = (
9a60: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
9a70: 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c  aSample[1] = (a,
9a80: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61   10) .  **     a
9a90: 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20  Sample[2] = (b, 
9aa0: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
9ab0: 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30  mple[3] = (c, 10
9ac0: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  0) .  **     aSa
9ad0: 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30  mple[4] = (c, 10
9ae0: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  5).  **.  ** The
9af0: 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  n the search spa
9b00: 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c  ce should ideall
9b10: 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73  y be the samples
9b20: 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a   above and the .
9b30: 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66    ** unique pref
9b40: 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e  ixes [a], [b] an
9b50: 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65  d [c]. But since
9b60: 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74 6f   that is hard to
9b70: 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a   organize, .  **
9b80: 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c   the code actual
9b90: 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69 73  ly searches this
9ba0: 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   set:.  **.  ** 
9bb0: 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a      0: (a) .  **
9bc0: 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a       1: (a, 5) .
9bd0: 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20    **     2: (a, 
9be0: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a  10) .  **     3:
9bf0: 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
9c00: 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20     4: (b) .  ** 
9c10: 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20      5: (b, 5) . 
9c20: 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a   **     6: (c) .
9c30: 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20    **     7: (c, 
9c40: 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38  100) .  **     8
9c50: 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20  : (c, 105).  ** 
9c60: 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a      9: (c, 105).
9c70: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61    **.  ** For ea
9c80: 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65  ch sample in the
9c90: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
9ca0: 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20  , N samples are 
9cb0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20  present in the. 
9cc0: 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73 61   ** effective sa
9cd0: 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74  mple array. In t
9ce0: 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65  he above, sample
9cf0: 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62 61  s 0 and 1 are ba
9d00: 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d  sed on .  ** sam
9d10: 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20  ple aSample[0]. 
9d20: 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20  Samples 2 and 3 
9d30: 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74  on aSample[1] et
9d40: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74  c..  **.  ** Oft
9d50: 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20  en, sample i of 
9d60: 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  each block of N 
9d70: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
9d80: 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c  s has (i+1) fiel
9d90: 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c  ds..  ** Except,
9da0: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79   each sample may
9db0: 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20   be extended to 
9dc0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20 69  ensure that it i
9dd0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
9de0: 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  r.  ** equal to 
9df0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d  the previous sam
9e00: 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61 79  ple in the array
9e10: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
9e20: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20  n the above, .  
9e30: 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74  ** sample 2 is t
9e40: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
9e50: 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  of a block of N 
9e60: 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66  samples, so at f
9e70: 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70  irst it .  ** ap
9e80: 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73 68  pears that it sh
9e90: 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20  ould be 1 field 
9ea0: 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72  in size. However
9eb0: 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  , that would mak
9ec0: 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c  e it .  ** small
9ed0: 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31  er than sample 1
9ee0: 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20  , so the binary 
9ef0: 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74  search would not
9f00: 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75   work. As a resu
9f10: 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  lt, .  ** it is 
9f20: 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20  extended to two 
9f30: 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c  fields. The dupl
9f40: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73  icates that this
9f50: 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20   creates do not 
9f60: 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20  .  ** cause any 
9f70: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
9f80: 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e   nField = pRec->
9f90: 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d  nField;.  iCol =
9fa0: 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20   0;.  iSample = 
9fb0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20  pIdx->nSample * 
9fc0: 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20  nField;.  do{.  
9fd0: 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20    int iSamp;    
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d  /* Index in aSam
a000: 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61  ple[] of test sa
a010: 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  mple */.    int 
a020: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
a030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a040: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
a050: 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a   test sample */.
a060: 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d  .    iTest = (iM
a070: 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20  in+iSample)/2;. 
a080: 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74     iSamp = iTest
a090: 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69   / nField;.    i
a0a0: 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20  f( iSamp>0 ){.  
a0b0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f      /* The propo
a0c0: 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73 61  sed effective sa
a0d0: 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69 78  mple is a prefix
a0e0: 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   of sample aSamp
a0f0: 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20  le[iSamp]..     
a100: 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79   ** Specifically
a110: 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70  , the shortest p
a120: 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73  refix of at leas
a130: 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69  t (1 + iTest%nFi
a140: 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66  eld) .      ** f
a150: 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67 72  ields that is gr
a160: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70  eater than the p
a170: 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69 76  revious effectiv
a180: 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20  e sample.  */.  
a190: 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74      for(n=(iTest
a1a0: 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20   % nField) + 1; 
a1b0: 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a  n<nField; n++){.
a1c0: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
a1d0: 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c  ple[iSamp-1].anL
a1e0: 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b  t[n-1]!=aSample[
a1f0: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
a200: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
a210: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
a220: 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31     n = iTest + 1
a230: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65  ;.    }..    pRe
a240: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20  c->nField = n;. 
a250: 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
a260: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
a270: 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e(aSample[iSamp]
a280: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  .n, aSample[iSam
a290: 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20  p].p, pRec);.   
a2a0: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
a2b0: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
a2c0: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
a2d0: 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b  [n-1] + aSample[
a2e0: 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d  iSamp].anEq[n-1]
a2f0: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
a300: 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
a310: 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20  e if( res==0 && 
a320: 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  n<nField ){.    
a330: 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
a340: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
a350: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
a360: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20  = iTest+1;.     
a370: 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d   res = -1;.    }
a380: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d  else{.      iSam
a390: 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20  ple = iTest;.   
a3a0: 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20     iCol = n-1;. 
a3b0: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
a3c0: 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70  es && iMin<iSamp
a3d0: 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d  le );.  i = iSam
a3e0: 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23  ple / nField;..#
a3f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a400: 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  UG.  /* The foll
a410: 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
a420: 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68  tements check th
a430: 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  at the binary se
a440: 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61  arch code.  ** a
a450: 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72  bove found the r
a460: 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69  ight answer. Thi
a470: 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e  s block serves n
a480: 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a  o purpose other.
a490: 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76    ** than to inv
a4a0: 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e  oke the asserts.
a4b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
a4c0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
a4d0: 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  led==0 ){.    if
a4e0: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
a4f0: 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29    /* If (res==0)
a500: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70   is true, then p
a510: 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75 61  Rec must be equa
a520: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a  l to sample i. *
a530: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
a540: 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  i<pIdx->nSample 
a550: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a560: 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20   iCol==nField-1 
a570: 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  );.      pRec->n
a580: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
a590: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
a5a0: 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  =sqlite3VdbeReco
a5b0: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
a5c0: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
a5d0: 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20  i].p, pRec) .   
a5e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
a5f0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
a600: 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  led .      );.  
a610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
a620: 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78  * Unless i==pIdx
a630: 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63  ->nSample, indic
a640: 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63 20  ating that pRec 
a650: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  is larger than. 
a660: 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70       ** all samp
a670: 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70  les in the aSamp
a680: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63  le[] array, pRec
a690: 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
a6a0: 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
a6b0: 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c  ** (iCol+1) fiel
a6c0: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
a6d0: 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20  le i.  */.      
a6e0: 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d  assert( i<=pIdx-
a6f0: 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30  >nSample && i>=0
a700: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
a710: 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b  nField = iCol+1;
a720: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a730: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  ==pIdx->nSample 
a740: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
a750: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
a760: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
a770: 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
a780: 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20  .p, pRec)>0.    
a790: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
a7a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
a7b0: 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ed );..      /* 
a7c0: 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c  if i==0 and iCol
a7d0: 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  ==0, then record
a7e0: 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72   pRec is smaller
a7f0: 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   than all sample
a800: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  s.      ** in th
a810: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
a820: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
a830: 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70   (iCol>0) then p
a840: 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  Rec must.      *
a850: 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  * be greater tha
a860: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
a870: 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70  e (iCol) field p
a880: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
a890: 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28  i..      ** If (
a8a0: 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20  i>0), then pRec 
a8b0: 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65  must also be gre
a8c0: 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ater than sample
a8d0: 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20   (i-1).  */.    
a8e0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a    if( iCol>0 ){.
a8f0: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
a900: 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  ield = iCol;.   
a910: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
a920: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
a930: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
a940: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
a950: 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20  , pRec)<=0.     
a960: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
a970: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
a980: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
a990: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
a9a0: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
a9b0: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
a9c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
a9d0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
a9e0: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
a9f0: 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  i-1].n, aSample[
aa00: 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a  i-1].p, pRec)<0.
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
aa20: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
aa30: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
aa40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
aa50: 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
aa60: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20  LITE_DEBUG */.. 
aa70: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
aa80: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65     /* Record pRe
aa90: 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61  c is equal to sa
aaa0: 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73  mple i */.    as
aab0: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65  sert( iCol==nFie
aac0: 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61  ld-1 );.    aSta
aad0: 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
aae0: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
aaf0: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
ab00: 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f  mple[i].anEq[iCo
ab10: 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l];.  }else{.   
ab20: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
ab30: 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20  t, the (iCol+1) 
ab40: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
ab50: 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
ab60: 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20  e first .    ** 
ab70: 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
ab80: 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65 63  reater than pRec
ab90: 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78  . Or, if i==pIdx
aba0: 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70  ->nSample then p
abb0: 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61  Rec.    ** is la
abc0: 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  rger than all sa
abd0: 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72  mples in the arr
abe0: 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63  ay. */.    tRowc
abf0: 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  nt iUpper, iGap;
ac00: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78  .    if( i>=pIdx
ac10: 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  ->nSample ){.   
ac20: 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69     iUpper = sqli
ac30: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
ac40: 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
ac50: 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [0]);.    }else{
ac60: 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
ac70: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
ac80: 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  iCol];.    }..  
ac90: 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55    if( iLower>=iU
aca0: 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47  pper ){.      iG
acb0: 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ap = 0;.    }els
acc0: 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
acd0: 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b  iUpper - iLower;
ace0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
acf0: 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20  oundUp ){.      
ad00: 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f  iGap = (iGap*2)/
ad10: 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
ad20: 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f      iGap = iGap/
ad30: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  3;.    }.    aSt
ad40: 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b  at[0] = iLower +
ad50: 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74   iGap;.    aStat
ad60: 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67  [1] = pIdx->aAvg
ad70: 45 71 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20  Eq[nField-1];.  
ad80: 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20  }..  /* Restore 
ad90: 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  the pRec->nField
ada0: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
adb0: 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70  turning.  */.  p
adc0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
add0: 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69  ield;.  return i
ade0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
adf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
ae00: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
ae10: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f  *.** If it is no
ae20: 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73  t NULL, pTerm is
ae30: 20 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f   a term that pro
ae40: 76 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f  vides an upper o
ae50: 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64  r lower.** bound
ae60: 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e   on a range scan
ae70: 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64  . Without consid
ae80: 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20  ering pTerm, it 
ae90: 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a  is estimated .**
aea0: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
aeb0: 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72  ill visit nNew r
aec0: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
aed0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
aee0: 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74  umber.** estimat
aef0: 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64  ed to be visited
af00: 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54   after taking pT
af10: 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  erm into account
af20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75  ..**.** If the u
af30: 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73  ser explicitly s
af40: 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c  pecified a likel
af50: 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f  ihood() value fo
af60: 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20  r this term,.** 
af70: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
af80: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b  value is the lik
af90: 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69  elihood multipli
afa0: 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
afb0: 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77   of.** input row
afc0: 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  s. Otherwise, th
afd0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
afe0: 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20  mes that an "IS 
aff0: 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a  NOT NULL" term.*
b000: 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f  * has a likeliho
b010: 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20  od of 0.50, and 
b020: 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61  any other term a
b030: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30   likelihood of 0
b040: 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  .25..*/.static L
b050: 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65  ogEst whereRange
b060: 41 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d  Adjust(WhereTerm
b070: 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20   *pTerm, LogEst 
b080: 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20  nNew){.  LogEst 
b090: 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69  nRet = nNew;.  i
b0a0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
b0b0: 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
b0c0: 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Prob<=0 ){.     
b0d0: 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e   nRet += pTerm->
b0e0: 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d  truthProb;.    }
b0f0: 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
b100: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
b110: 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
b120: 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20     nRet -= 20;  
b130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30        assert( 20
b140: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
b150: 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  4) );.    }.  }.
b160: 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d    return nRet;.}
b170: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
b180: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
b190: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74  _STAT4./*.** Ret
b1a0: 75 72 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  urn the affinity
b1b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f   for a single co
b1c0: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
b1d0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
b1e0: 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69  3IndexColumnAffi
b1f0: 6e 69 74 79 28 73 71 6c 69 74 65 33 20 2a 64 62  nity(sqlite3 *db
b200: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  , Index *pIdx, i
b210: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65  nt iCol){.  asse
b220: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  rt( iCol>=0 && i
b230: 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  Col<pIdx->nColum
b240: 6e 20 29 3b 0a 20 20 69 66 28 20 21 70 49 64 78  n );.  if( !pIdx
b250: 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20  ->zColAff ){.   
b260: 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
b270: 78 41 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c  xAffinityStr(db,
b280: 20 70 49 64 78 29 3d 3d 30 20 29 20 72 65 74 75   pIdx)==0 ) retu
b290: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  rn SQLITE_AFF_BL
b2a0: 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OB;.  }.  return
b2b0: 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69   pIdx->zColAff[i
b2c0: 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Col];.}.#endif..
b2d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b2e0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
b2f0: 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TAT4./* .** This
b300: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
b310: 6c 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  led to estimate 
b320: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b330: 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61 0a  ws visited by a.
b340: 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e  ** range-scan on
b350: 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64   a skip-scan ind
b360: 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  ex. For example:
b370: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
b380: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
b390: 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45  , b, c);.**   SE
b3a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
b3b0: 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 63 20 42  HERE a=? AND c B
b3c0: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a  ETWEEN ? AND ?;.
b3d0: 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f  **.** Value pLoo
b3e0: 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72 72 65  p->nOut is curre
b3f0: 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20  ntly set to the 
b400: 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
b410: 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73   of rows .** vis
b420: 69 74 65 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e  ited for scannin
b430: 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e  g (a=? AND b=?).
b440: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
b450: 65 64 75 63 65 73 20 74 68 61 74 20 65 73 74 69  educes that esti
b460: 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65  mate .** by some
b470: 20 66 61 63 74 6f 72 20 74 6f 20 61 63 63 6f 75   factor to accou
b480: 6e 74 20 66 6f 72 20 74 68 65 20 28 63 20 42 45  nt for the (c BE
b490: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65  TWEEN ? AND ?) e
b4a0: 78 70 72 65 73 73 69 6f 6e 20 62 61 73 65 64 0a  xpression based.
b4b0: 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 74 34 20  ** on the stat4 
b4c0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e 64  data for the ind
b4d0: 65 78 2e 20 74 68 69 73 20 73 63 61 6e 20 77 69  ex. this scan wi
b4e0: 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65 64 20 6d  ll be peformed m
b4f0: 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
b500: 73 20 28 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  s (once for each
b510: 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69   (a,b) combinati
b520: 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  on that matches 
b530: 61 3d 3f 29 20 69 73 20 64 65 61 6c 74 20 77 69  a=?) is dealt wi
b540: 74 68 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  th .** by the ca
b550: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64  ller..**.** It d
b560: 6f 65 73 20 74 68 69 73 20 62 79 20 73 63 61 6e  oes this by scan
b570: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
b580: 20 73 74 61 74 34 20 73 61 6d 70 6c 65 73 2c 20   stat4 samples, 
b590: 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73  comparing values
b5a0: 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72  .** extracted fr
b5b0: 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  om pLower and pU
b5c0: 70 70 65 72 20 77 69 74 68 20 74 68 65 20 63 6f  pper with the co
b5d0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75  rresponding colu
b5e0: 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61  mn in each.** sa
b5f0: 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64 20 55  mple. If L and U
b600: 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20   are the number 
b610: 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64  of samples found
b620: 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
b630: 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20   or.** equal to 
b640: 74 68 65 20 76 61 6c 75 65 73 20 65 78 74 72 61  the values extra
b650: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
b660: 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
b670: 65 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a  ectively, and.**
b680: 20 4e 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20   N is the total 
b690: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
b6a0: 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f  s, the pLoop->nO
b6b0: 75 74 20 76 61 6c 75 65 20 69 73 20 61 64 6a 75  ut value is adju
b6c0: 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f  sted.** as follo
b6d0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74  ws:.**.**   nOut
b6e0: 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28   = nOut * ( min(
b6f0: 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a  U - L, 1) / N ).
b700: 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20  **.** If pLower 
b710: 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61  is NULL, or a va
b720: 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78  lue cannot be ex
b730: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
b740: 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73   term, L is.** s
b750: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70  et to zero. If p
b760: 55 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f  Upper is NULL, o
b770: 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  r a value cannot
b780: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
b790: 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73  om it,.** U is s
b7a0: 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e  et to N..**.** N
b7b0: 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  ormally, this fu
b7c0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 62 44  nction sets *pbD
b7d0: 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f 72 65 20  one to 1 before 
b7e0: 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76  returning. Howev
b7f0: 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c  er,.** if no val
b800: 75 65 20 63 61 6e 20 62 65 20 65 78 74 72 61 63  ue can be extrac
b810: 74 65 64 20 66 72 6f 6d 20 65 69 74 68 65 72 20  ted from either 
b820: 70 4c 6f 77 65 72 20 6f 72 20 70 55 70 70 65 72  pLower or pUpper
b830: 20 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20   (and so the.** 
b840: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
b850: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64  number of rows d
b860: 65 6c 69 76 65 72 65 64 20 72 65 6d 61 69 6e 73  elivered remains
b870: 20 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a 70 62   unchanged), *pb
b880: 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20  Done.** is left 
b890: 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  as is..**.** If 
b8a0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
b8b0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
b8c0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
b8d0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
b8e0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  * SQLITE_OK..*/.
b8f0: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
b900: 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74  RangeSkipScanEst
b910: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b920: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
b930: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
b940: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
b950: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c  .  WhereTerm *pL
b960: 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72  ower,   /* Lower
b970: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
b980: 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22  nge. ex: "x>123"
b990: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
b9a0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
b9b0: 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65  Upper,   /* Uppe
b9c0: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
b9d0: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35  ange. ex: "x<455
b9e0: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
b9f0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
ba00: 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64  pLoop,    /* Upd
ba10: 61 74 65 20 74 68 65 20 2e 6e 4f 75 74 20 76 61  ate the .nOut va
ba20: 6c 75 65 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70  lue of this loop
ba30: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e   */.  int *pbDon
ba40: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e          /* Se
ba50: 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 74 20  t to true if at 
ba60: 6c 65 61 73 74 20 6f 6e 65 20 65 78 70 72 2e 20  least one expr. 
ba70: 76 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  value extracted 
ba80: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
ba90: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
baa0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
bab0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
bac0: 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69  tree.nEq;.  sqli
bad0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
bae0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77  ->db;.  int nLow
baf0: 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e  er = -1;.  int n
bb00: 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70  Upper = p->nSamp
bb10: 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d  le+1;.  int rc =
bb20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
bb30: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e   aff = sqlite3In
bb40: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
bb50: 79 28 64 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20  y(db, p, nEq);. 
bb60: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
bb70: 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  .  .  sqlite3_va
bb80: 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20 20 20 20  lue *p1 = 0;    
bb90: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65        /* Value e
bba0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
bbb0: 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ower */.  sqlite
bbc0: 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b  3_value *p2 = 0;
bbd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
bbe0: 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ue extracted fro
bbf0: 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20 20 73 71  m pUpper */.  sq
bc00: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
bc10: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  l = 0;        /*
bc20: 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
bc30: 20 66 72 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a   from record */.
bc40: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
bc50: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
bc60: 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c  pParse, p->azCol
bc70: 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66 28 20 70  l[nEq]);.  if( p
bc80: 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 72 63 20  Lower ){.    rc 
bc90: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61  = sqlite3Stat4Va
bca0: 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
bcb0: 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70  se, pLower->pExp
bcc0: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20  r->pRight, aff, 
bcd0: 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72  &p1);.    nLower
bce0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
bcf0: 70 55 70 70 65 72 20 26 26 20 72 63 3d 3d 53 51  pUpper && rc==SQ
bd00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
bd10: 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
bd20: 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  ValueFromExpr(pP
bd30: 61 72 73 65 2c 20 70 55 70 70 65 72 2d 3e 70 45  arse, pUpper->pE
bd40: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66  xpr->pRight, aff
bd50: 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e 55 70 70  , &p2);.    nUpp
bd60: 65 72 20 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d  er = p2 ? 0 : p-
bd70: 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20  >nSample;.  }.. 
bd80: 20 69 66 28 20 70 31 20 7c 7c 20 70 32 20 29 7b   if( p1 || p2 ){
bd90: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
bda0: 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20 20 20 66  int nDiff;.    f
bdb0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
bdc0: 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53  TE_OK && i<p->nS
bdd0: 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ample; i++){.   
bde0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
bdf0: 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70  tat4Column(db, p
be00: 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  ->aSample[i].p, 
be10: 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  p->aSample[i].n,
be20: 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20   nEq, &pVal);.  
be30: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
be40: 54 45 5f 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20  TE_OK && p1 ){. 
be50: 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d         int res =
be60: 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
be70: 72 65 28 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f  re(p1, pVal, pCo
be80: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ll);.        if(
be90: 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72   res>=0 ) nLower
bea0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
beb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bec0: 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a 20 20 20  _OK && p2 ){.   
bed0: 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73       int res = s
bee0: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
bef0: 28 70 32 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c  (p2, pVal, pColl
bf00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
bf10: 65 73 3e 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b  es>=0 ) nUpper++
bf20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bf30: 20 20 20 20 6e 44 69 66 66 20 3d 20 28 6e 55 70      nDiff = (nUp
bf40: 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20  per - nLower);. 
bf50: 20 20 20 69 66 28 20 6e 44 69 66 66 3c 3d 30 20     if( nDiff<=0 
bf60: 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20  ) nDiff = 1;..  
bf70: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
bf80: 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61   both an upper a
bf90: 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73  nd lower bound s
bfa0: 70 65 63 69 66 69 65 64 2c 20 61 6e 64 20 74 68  pecified, and th
bfb0: 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  e .    ** compar
bfc0: 69 73 6f 6e 73 20 69 6e 64 69 63 61 74 65 20 74  isons indicate t
bfd0: 68 61 74 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hat they are clo
bfe0: 73 65 20 74 6f 67 65 74 68 65 72 2c 20 75 73 65  se together, use
bff0: 20 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20   the fallback.  
c000: 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28 61 73 73    ** method (ass
c010: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 63 61  ume that the sca
c020: 6e 20 76 69 73 69 74 73 20 31 2f 36 34 20 6f 66  n visits 1/64 of
c030: 20 74 68 65 20 72 6f 77 73 29 20 66 6f 72 20 65   the rows) for e
c040: 73 74 69 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a  stimating.    **
c050: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c060: 6f 77 73 20 76 69 73 69 74 65 64 2e 20 4f 74 68  ows visited. Oth
c070: 65 72 77 69 73 65 2c 20 65 73 74 69 6d 61 74 65  erwise, estimate
c080: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c090: 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67  ows.    ** using
c0a0: 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
c0b0: 72 69 62 65 64 20 69 6e 20 74 68 65 20 68 65 61  ribed in the hea
c0c0: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  der comment for 
c0d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
c0e0: 2f 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 21  /.    if( nDiff!
c0f0: 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20  =1 || pUpper==0 
c100: 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a  || pLower==0 ){.
c110: 20 20 20 20 20 20 69 6e 74 20 6e 41 64 6a 75 73        int nAdjus
c120: 74 20 3d 20 28 73 71 6c 69 74 65 33 4c 6f 67 45  t = (sqlite3LogE
c130: 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d  st(p->nSample) -
c140: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e   sqlite3LogEst(n
c150: 44 69 66 66 29 29 3b 0a 20 20 20 20 20 20 70 4c  Diff));.      pL
c160: 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64  oop->nOut -= nAd
c170: 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a 70 62 44  just;.      *pbD
c180: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 57  one = 1;.      W
c190: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20  HERETRACE(0x10, 
c1a0: 28 22 72 61 6e 67 65 20 73 6b 69 70 2d 73 63 61  ("range skip-sca
c1b0: 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25  n regions: %u..%
c1c0: 75 20 20 61 64 6a 75 73 74 3d 25 64 20 65 73 74  u  adjust=%d est
c1d0: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65     nLower, nUppe
c200: 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70  r, nAdjust*-1, p
c210: 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20  Loop->nOut));.  
c220: 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
c230: 20 20 61 73 73 65 72 74 28 20 2a 70 62 44 6f 6e    assert( *pbDon
c240: 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  e==0 );.  }..  s
c250: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
c260: 70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  p1);.  sqlite3Va
c270: 6c 75 65 46 72 65 65 28 70 32 29 3b 0a 20 20 73  lueFree(p2);.  s
c280: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
c290: 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
c2a0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
c2b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c2c0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
c2d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c2e0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
c2f0: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
c300: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
c310: 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65  t will be visite
c320: 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67  d.** by scanning
c330: 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20   an index for a 
c340: 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e  range of values.
c350: 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68   The range may h
c360: 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20  ave an upper.** 
c370: 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62  bound, a lower b
c380: 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54  ound, or both. T
c390: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
c3a0: 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74  terms that set t
c3b0: 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20  he upper.** and 
c3c0: 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65  lower bounds are
c3d0: 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
c3e0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
c3f0: 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  r respectively. 
c400: 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
c410: 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e  assuming that in
c420: 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
c430: 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  ):.**.**   ... F
c440: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
c450: 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
c460: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c470: 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20         |_____|  
c480: 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20   |_____|.**     
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a    |         |.**
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70       pLower    p
c4d0: 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Upper.**.** If e
c4e0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70  ither of the upp
c4f0: 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
c500: 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  d is not present
c510: 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70  , then NULL is p
c520: 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63  assed in.** plac
c530: 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  e of the corresp
c540: 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d  onding WhereTerm
c550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
c560: 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e  e in (pBuilder->
c570: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
c580: 71 29 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  q) is the number
c590: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   of the index.**
c5a0: 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20   column subject 
c5b0: 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  to the range con
c5c0: 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75  straint. Or, equ
c5d0: 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e  ivalently, the n
c5e0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61  umber of.** equa
c5f0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
c600: 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68   optimized by th
c610: 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78  e proposed index
c620: 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70   scan. For examp
c630: 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20  le,.** assuming 
c640: 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
c650: 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20  (a, b), and the 
c660: 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  SQL query is:.**
c670: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
c680: 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  1 WHERE a = ? AN
c690: 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20  D b > ? AND b < 
c6a0: 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
c6b0: 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 31   nEq is set to 1
c6c0: 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72   (as the range r
c6d0: 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e  estricted column
c6e0: 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f  , b, is the seco
c6f0: 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  nd .** left-most
c700: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
c710: 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68  ndex). Or, if th
c720: 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  e query is:.**.*
c730: 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
c740: 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
c750: 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  a < ? ....**.** 
c760: 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20  then nEq is set 
c770: 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  to 0..**.** When
c780: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c790: 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74  s called, *pnOut
c7a0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
c7b0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f  qlite3LogEst() o
c7c0: 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
c7d0: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74 68 65  of rows that the
c7e0: 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65   index scan is e
c7f0: 78 70 65 63 74 65 64 20 74 6f 20 76 69 73 69 74  xpected to visit
c800: 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e   without .** con
c810: 73 69 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e  sidering the ran
c820: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ge constraints. 
c830: 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68 65  If nEq is 0, the
c840: 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74 68 65 20  n *pnOut is the 
c850: 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f  number of .** ro
c860: 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ws in the index.
c870: 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
c880: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75  or occurs, *pnOu
c890: 74 20 69 73 20 61 64 6a 75 73 74 65 64 20 28 72  t is adjusted (r
c8a0: 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63  educed).** to ac
c8b0: 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61  count for the ra
c8c0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
c8d0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
c8e0: 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65  r..** .** In the
c8f0: 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
c900: 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45  te_stat4 ANALYZE
c910: 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63   data, or if suc
c920: 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65  h data cannot be
c930: 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73 69 6e 67  .** used, a sing
c940: 6c 65 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c  le range inequal
c950: 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65 20  ity reduces the 
c960: 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
c970: 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a  a factor of 4. .
c980: 2a 2a 20 61 6e 64 20 61 20 70 61 69 72 20 6f 66  ** and a pair of
c990: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
c9a0: 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
c9b0: 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
c9c0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77  number of.** row
c9d0: 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66  s visited by a f
c9e0: 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a  actor of 64..*/.
c9f0: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
ca00: 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
ca10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ca20: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ca30: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
ca40: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
ca50: 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
ca60: 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65  *pBuilder,.  Whe
ca70: 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
ca80: 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
ca90: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
caa0: 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
cab0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
cac0: 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
cad0: 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
cae0: 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
caf0: 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
cb00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
cb10: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
cb20: 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68      /* Modify th
cb30: 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62  e .nOut and mayb
cb40: 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a  e .rRun fields *
cb50: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
cb60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
cb70: 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e   nOut = pLoop->n
cb80: 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e  Out;.  LogEst nN
cb90: 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
cba0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
cbb0: 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78  OR_STAT4.  Index
cbc0: 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
cbd0: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
cbe0: 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
cbf0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20  u.btree.nEq;..  
cc00: 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  if( p->nSample>0
cc10: 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70   && nEq<p->nSamp
cc20: 6c 65 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28  leCol ){.    if(
cc30: 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e   nEq==pBuilder->
cc40: 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20 20 20  nRecValid ){.   
cc50: 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72     UnpackedRecor
cc60: 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64  d *pRec = pBuild
cc70: 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20 20  er->pRec;.      
cc80: 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
cc90: 20 20 20 20 69 6e 74 20 6e 42 74 6d 20 3d 20 70      int nBtm = p
cca0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  Loop->u.btree.nB
ccb0: 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  tm;.      int nT
ccc0: 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  op = pLoop->u.bt
ccd0: 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20 20 20 20  ree.nTop;..     
cce0: 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f   /* Variable iLo
ccf0: 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20  wer will be set 
cd00: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
cd10: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
cd20: 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20   rows in .      
cd30: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  ** the index tha
cd40: 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  t are less than 
cd50: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
cd60: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
cd70: 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ry. The.      **
cd80: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
cd90: 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
cda0: 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
cdb0: 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
cdc0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d  he.      ** key-
cdd0: 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79  prefix formed by
cde0: 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20   the nEq values 
cdf0: 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
ce00: 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73  the nEq left-mos
ce10: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
ce20: 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ns of the index,
ce30: 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76   and $L is the v
ce40: 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a  alue in pLower..
ce50: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
ce60: 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20  * Or, if pLower 
ce70: 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61  is NULL or $L ca
ce80: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
ce90: 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75  d from it (becau
cea0: 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69  se it.      ** i
ceb0: 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
cec0: 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
ced0: 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
cee0: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
cef0: 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65  e.      ** range
cf00: 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61   is $P. Due to a
cf10: 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61   quirk in the wa
cf20: 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  y whereKeyStats(
cf30: 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20  ) works, even.  
cf40: 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20      ** if $L is 
cf50: 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65  available, where
cf60: 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61  KeyStats() is ca
cf70: 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24  lled for both ($
cf80: 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  P) and .      **
cf90: 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
cfa0: 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
cfb0: 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
cfc0: 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  es is used..    
cfd0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69    **.      ** Si
cfe0: 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20  milarly, iUpper 
cff0: 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  is to be set to 
d000: 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
d010: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
d020: 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73  ws.      ** less
d030: 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
d040: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
d050: 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
d060: 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
d070: 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
d080: 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
d090: 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
d0a0: 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
d0b0: 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
d0c0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70        ** of iUpp
d0d0: 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64  er are requested
d0e0: 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74   of whereKeyStat
d0f0: 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c  s() and the smal
d100: 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20  ler used..      
d110: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
d120: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62  number of rows b
d130: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62  etween the two b
d140: 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75  ounds is then ju
d150: 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72  st iUpper-iLower
d160: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d170: 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b   tRowcnt iLower;
d180: 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73       /* Rows les
d190: 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
d1a0: 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
d1b0: 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20  tRowcnt iUpper; 
d1c0: 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
d1d0: 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
d1e0: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
d1f0: 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b  nt iLwrIdx = -2;
d200: 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
d210: 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  for the lower bo
d220: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
d230: 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20   iUprIdx = -1;  
d240: 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f   /* aSample[] fo
d250: 72 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  r the upper boun
d260: 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  d */..      if( 
d270: 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  pRec ){.        
d280: 74 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e  testcase( pRec->
d290: 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72  nField!=pBuilder
d2a0: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ->nRecValid );. 
d2b0: 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
d2c0: 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  eld = pBuilder->
d2d0: 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20  nRecValid;.     
d2e0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65   }.      /* Dete
d2f0: 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64  rmine iLower and
d300: 20 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24   iUpper using ($
d310: 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  P) only. */.    
d320: 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a    if( nEq==0 ){.
d330: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
d340: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70   0;.        iUpp
d350: 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30  er = p->nRowEst0
d360: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d370: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20         /* Note: 
d380: 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
d390: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
d3a0: 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
d3b0: 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
d3c0: 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20          ** have 
d3d0: 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77  been requested w
d3e0: 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20  hen testing key 
d3f0: 24 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c  $P in whereEqual
d400: 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20  ScanEst().  */. 
d410: 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
d420: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
d430: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
d440: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
d450: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70  0];.        iUpp
d460: 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d  er = a[0] + a[1]
d470: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d480: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d   assert( pLower=
d490: 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65  =0 || (pLower->e
d4a0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
d4b0: 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
d4c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55        assert( pU
d4d0: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
d4e0: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
d4f0: 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
d500: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
d510: 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  t( p->aSortOrder
d520: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
d530: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e   p->aSortOrder[n
d540: 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Eq] ){.        /
d550: 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70  * The roles of p
d560: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
d570: 20 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72   are swapped for
d580: 20 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f   a DESC index */
d590: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68  .        SWAP(Wh
d5a0: 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72  ereTerm*, pLower
d5b0: 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20  , pUpper);.     
d5c0: 20 20 20 53 57 41 50 28 69 6e 74 2c 20 6e 42 74     SWAP(int, nBt
d5d0: 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  m, nTop);.      
d5e0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
d5f0: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
d600: 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65   on the iLower e
d610: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
d620: 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$L). */.      
d630: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
d640: 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61 63  /* Values extrac
d670: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
d680: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
d690: 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
d6a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
d6b0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d6c0: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
d6d0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
d6e0: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e   &pRec, pExpr, n
d6f0: 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20  Btm, nEq, &n);. 
d700: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
d710: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b  QLITE_OK && n ){
d720: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
d730: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
d740: 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f     u16 mask = WO
d750: 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _GT|WO_LE;.     
d760: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
d770: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
d780: 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d  Expr)>n ) mask =
d790: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a   (WO_LE|WO_LT);.
d7a0: 20 20 20 20 20 20 20 20 20 20 69 4c 77 72 49 64            iLwrId
d7b0: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
d7c0: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
d7d0: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
d7e0: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
d7f0: 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  + ((pLower->eOpe
d800: 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20  rator & mask) ? 
d810: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
d820: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
d830: 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
d840: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d850: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
d860: 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
d870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d880: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
d890: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
d8a0: 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
d8b0: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
d8c0: 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
d8d0: 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
d8e0: 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d900: 20 56 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   Values extracte
d910: 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
d920: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
d930: 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
d940: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
d950: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d960: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
d970: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
d980: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e 54 6f  pRec, pExpr, nTo
d990: 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20  p, nEq, &n);.   
d9a0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
d9b0: 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20  ITE_OK && n ){. 
d9c0: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
d9d0: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
d9e0: 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47   u16 mask = WO_G
d9f0: 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20  T|WO_LE;.       
da00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
da10: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
da20: 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28  pr)>n ) mask = (
da30: 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20  WO_LE|WO_LT);.  
da40: 20 20 20 20 20 20 20 20 69 55 70 72 49 64 78 20          iUprIdx 
da50: 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  = whereKeyStats(
da60: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
da70: 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   1, a);.        
da80: 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
da90: 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
daa0: 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b  tor & mask) ? a[
dab0: 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
dac0: 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
dad0: 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
dae0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
daf0: 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ut--;.          
db00: 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
db10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
db20: 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
db30: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
db40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
db50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
db60: 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
db70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
db80: 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
db90: 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
dba0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  er);.          /
dbb0: 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f  * TUNING:  If bo
dbc0: 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c  th iUpper and iL
dbd0: 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65 64  ower are derived
dbe0: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20   from the same. 
dbf0: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70           ** samp
dc00: 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  le, then assume 
dc10: 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65  they are 4x more
dc20: 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69   selective.  Thi
dc30: 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20  s brings.       
dc40: 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61     ** the estima
dc50: 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79 20  ted selectivity 
dc60: 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74  more in line wit
dc70: 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20  h what it would 
dc80: 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
dc90: 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69 74  if estimated wit
dca0: 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66 20  hout the use of 
dcb0: 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20  STAT3/4 tables. 
dcc0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
dcd0: 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64   iLwrIdx==iUprId
dce0: 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20  x ) nNew -= 20; 
dcf0: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
dd00: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
dd10: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dd20: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
dd30: 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
dd40: 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
dd50: 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
dd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
dd70: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
dd80: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
dd90: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
dda0: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
ddb0: 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34  CE(0x10, ("STAT4
ddc0: 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e   range scan: %u.
ddd0: 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
de00: 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
de10: 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
de20: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
de30: 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
de40: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
de50: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
de60: 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c  anEst(pParse, pL
de70: 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c  ower, pUpper, pL
de80: 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20  oop, &bDone);.  
de90: 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20      if( bDone ) 
dea0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
deb0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
dec0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
ded0: 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
dee0: 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
def0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
df00: 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
df10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
df20: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
df30: 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
df40: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
df50: 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
df60: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
df70: 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
df80: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
df90: 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
dfa0: 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
dfb0: 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
dfc0: 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
dfd0: 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  and lower limit 
dfe0: 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69  and neither limi
dff0: 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70  t.  ** has an ap
e000: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
e010: 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20  d likelihood(), 
e020: 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
e030: 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
e040: 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
e050: 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
e060: 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
e070: 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
e080: 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
e090: 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
e0a0: 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
e0b0: 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
e0c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
e0d0: 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
e0e0: 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
e0f0: 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
e100: 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
e110: 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
e120: 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
e130: 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
e140: 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65   pLower && pLowe
e150: 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26  r->truthProb>0 &
e160: 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70  & pUpper && pUpp
e170: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
e180: 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32  ){.    nNew -= 2
e190: 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d  0;.  }..  nOut -
e1a0: 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20  = (pLower!=0) + 
e1b0: 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69  (pUpper!=0);.  i
e1c0: 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65  f( nNew<10 ) nNe
e1d0: 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e  w = 10;.  if( nN
e1e0: 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d  ew<nOut ) nOut =
e1f0: 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e   nNew;.#if defin
e200: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
e210: 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f  ABLED).  if( pLo
e220: 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b  op->nOut>nOut ){
e230: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
e240: 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61  0x10,("Range sca
e250: 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72  n lowers nOut fr
e260: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c      pLoop->nOut,
e290: 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e   nOut));.  }.#en
e2a0: 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  dif.  pLoop->nOu
e2b0: 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
e2c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e2d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e2e0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
e2f0: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
e300: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
e310: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
e320: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
e330: 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
e340: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
e350: 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
e360: 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
e370: 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
e380: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
e390: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
e3a0: 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
e3b0: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
e3c0: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
e3d0: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
e3e0: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
e3f0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
e400: 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
e410: 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
e420: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
e430: 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
e440: 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
e450: 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
e460: 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
e470: 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
e480: 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
e490: 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
e4a0: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
e4b0: 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
e4c0: 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
e4d0: 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
e4e0: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
e4f0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
e500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
e510: 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
e520: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
e530: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e540: 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
e550: 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
e560: 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
e570: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
e580: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
e590: 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
e5a0: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
e5b0: 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
e5c0: 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
e5d0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
e5e0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
e5f0: 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
e600: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
e610: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e620: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
e630: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
e640: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
e650: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
e660: 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45  lder,.  Expr *pE
e670: 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
e680: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
e690: 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
e6a0: 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
e6b0: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
e6c0: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
e6d0: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
e6e0: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
e6f0: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
e700: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
e710: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
e720: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
e730: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
e740: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e  .btree.nEq;.  Un
e750: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
e760: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
e770: 52 65 63 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Rec;.  int rc;  
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e790: 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
e7a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
e7b0: 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20   tRowcnt a[2];  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
e7d0: 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  atistics */.  in
e7e0: 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74  t bOk;..  assert
e7f0: 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73  ( nEq>=1 );.  as
e800: 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43  sert( nEq<=p->nC
e810: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
e820: 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
e830: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
e840: 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
e850: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
e860: 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
e870: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
e880: 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
e890: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
e8a0: 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
e8b0: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
e8c0: 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
e8d0: 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
e8e0: 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
e8f0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
e900: 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
e910: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
e920: 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
e930: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
e940: 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
e950: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
e960: 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
e970: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
e980: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
e990: 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
e9a0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
e9b0: 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
e9c0: 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43    if( nEq>=p->nC
e9d0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e  olumn ){.    *pn
e9e0: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
e9f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
ea00: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
ea10: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
ea20: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
ea30: 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 31 2c  &pRec, pExpr, 1,
ea40: 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20   nEq-1, &bOk);. 
ea50: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
ea60: 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63  = pRec;.  if( rc
ea70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
ea80: 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62  turn rc;.  if( b
ea90: 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Ok==0 ) return S
eaa0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
eab0: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
eac0: 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20  Valid = nEq;..  
ead0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
eae0: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
eaf0: 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41  , a);.  WHERETRA
eb00: 43 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69  CE(0x10,("equali
eb10: 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20  ty scan regions 
eb20: 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20  %s(%d): %d\n",. 
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d    p->zName, nEq-
eb50: 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  1, (int)a[1]));.
eb60: 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
eb70: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
eb80: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
eb90: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
eba0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69  _OR_STAT4 */..#i
ebb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ebc0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
ebd0: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
ebe0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
ebf0: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
ec00: 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
ec10: 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
ec20: 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
ec30: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
ec40: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
ec50: 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
ec60: 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
ec70: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
ec80: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
ec90: 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
eca0: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
ecb0: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
ecc0: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
ecd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
ece0: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
ecf0: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
ed00: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
ed10: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
ed20: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
ed30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ed40: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
ed50: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
ed60: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
ed70: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
ed80: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
ed90: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
eda0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
edb0: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
edc0: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
edd0: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
ede0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
edf0: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
ee00: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
ee10: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
ee20: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
ee30: 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
ee40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ee50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
ee60: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
ee70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
ee80: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
ee90: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
eea0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
eeb0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
eec0: 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
eed0: 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
eee0: 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
eef0: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
ef00: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
ef10: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
ef20: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
ef30: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
ef40: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
ef50: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20  e.pIndex;.  i64 
ef60: 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c  nRow0 = sqlite3L
ef70: 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69  ogEstToInt(p->ai
ef80: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
ef90: 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
efa0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
efb0: 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
efc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
efd0: 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
efe0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
eff0: 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
f000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f010: 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
f020: 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
f030: 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
f040: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
f050: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
f060: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
f070: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
f080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f090: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
f0a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
f0b0: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
f0c0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
f0d0: 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
f0e0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f0f0: 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20   nEst = nRow0;. 
f100: 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
f110: 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
f120: 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
f130: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
f140: 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
f150: 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
f160: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
f170: 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
f180: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
f190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f1a0: 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e   if( nRowEst > n
f1b0: 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d  Row0 ) nRowEst =
f1c0: 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52   nRow0;.    *pnR
f1d0: 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
f1e0: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
f1f0: 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
f200: 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20  ate: est=%d\n", 
f210: 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
f220: 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
f230: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
f240: 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
f250: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
f260: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
f270: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
f280: 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45   */...#ifdef WHE
f290: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
f2a0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
f2b0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65  content of a Whe
f2c0: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f  reTerm object.*/
f2d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f2e0: 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72  reTermPrint(Wher
f2f0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e  eTerm *pTerm, in
f300: 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20  t iTerm){.  if( 
f310: 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pTerm==0 ){.    
f320: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f330: 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55  tf("TERM-%-3d NU
f340: 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20  LL\n", iTerm);. 
f350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
f360: 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63   zType[4];.    c
f370: 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20  har zLeft[50];. 
f380: 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c     memcpy(zType,
f390: 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20   "...", 4);.    
f3a0: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
f3b0: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
f3c0: 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27  L ) zType[0] = '
f3d0: 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  V';.    if( pTer
f3e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f3f0: 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65  O_EQUIV  ) zType
f400: 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69  [1] = 'E';.    i
f410: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
f420: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
f430: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
f440: 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a  zType[2] = 'L';.
f450: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
f460: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
f470: 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71  NGLE ){.      sq
f480: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
f490: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
f4a0: 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d  ft,"left={%d:%d}
f4b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f4c0: 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
f4d0: 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65  >leftCursor, pTe
f4e0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
f4f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
f500: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
f510: 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26  or & WO_OR)!=0 &
f520: 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e  & pTerm->u.pOrIn
f530: 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  fo!=0 ){.      s
f540: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
f550: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
f560: 65 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30  eft,"indexable=0
f570: 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20  x%lld", .       
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
f5a0: 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20  ->indexable);.  
f5b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
f5c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
f5d0: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
f5e0: 65 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70  eft,"left=%d", p
f5f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f600: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f610: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f620: 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d  .       "TERM-%-
f630: 33 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70  3d %p %s %-12s p
f640: 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30  rob=%-3d op=0x%0
f650: 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34  3x wtFlags=0x%04
f660: 78 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72 6d  x",.       iTerm
f670: 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20  , pTerm, zType, 
f680: 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74 72  zLeft, pTerm->tr
f690: 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20  uthProb,.       
f6a0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f6b0: 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  , pTerm->wtFlags
f6c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
f6d0: 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->iField ){.    
f6e0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f6f0: 69 6e 74 66 28 22 20 69 46 69 65 6c 64 3d 25 64  intf(" iField=%d
f700: 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46 69 65  \n", pTerm->iFie
f710: 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ld);.    }else{.
f720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
f730: 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
f740: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f750: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
f760: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
f770: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
f780: 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
f790: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
f7a0: 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65   Show the comple
f7b0: 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  te content of a 
f7c0: 57 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76  WhereClause.*/.v
f7d0: 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
f7e0: 43 6c 61 75 73 65 50 72 69 6e 74 28 57 68 65 72  ClausePrint(Wher
f7f0: 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
f800: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
f810: 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; i<pWC->nTerm;
f820: 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65   i++){.    where
f830: 54 65 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e  TermPrint(&pWC->
f840: 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a  a[i], i);.  }.}.
f850: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57  #endif..#ifdef W
f860: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
f870: 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  D./*.** Print a 
f880: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
f890: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70   for debugging p
f8a0: 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
f8b0: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
f8c0: 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20  Print(WhereLoop 
f8d0: 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  *p, WhereClause 
f8e0: 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e  *pWC){.  WhereIn
f8f0: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
f900: 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20  ->pWInfo;.  int 
f910: 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e  nb = 1+(pWInfo->
f920: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33  pTabList->nSrc+3
f930: 29 2f 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72  )/4;.  struct Sr
f940: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
f950: 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
f960: 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
f970: 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
f980: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
f990: 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d    Bitmask mAll =
f9a0: 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
f9b0: 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73  (nb*4)) - 1;.  s
f9c0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f9d0: 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
f9e0: 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
f9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fa00: 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
fa10: 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
fa20: 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20  nb, p->prereq & 
fa30: 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mAll);.  sqlite3
fa40: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
fa50: 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
fa60: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
fa70: 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
fa80: 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
fa90: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
faa0: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
fab0: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
fac0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
fad0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
fae0: 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
faf0: 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65  pIndex && (zName
fb00: 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
fb10: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  ndex->zName)!=0 
fb20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
fb30: 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
fb40: 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
fb50: 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
fb60: 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
fb70: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
fb80: 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
fb90: 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
fba0: 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
fbb0: 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
fbc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
fbd0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fbe0: 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
fbf0: 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
fc00: 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
fc10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
fc20: 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
fc30: 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
fc40: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
fc50: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
fc60: 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
fc70: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
fc80: 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
fc90: 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
fca0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
fcb0: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
fcc0: 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
fcd0: 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
fce0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
fcf0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
fd00: 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
fd10: 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
fd20: 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
fd30: 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
fd40: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
fd50: 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
fd60: 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
fd70: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
fd80: 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
fd90: 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20   WHERE_SKIPSCAN 
fda0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
fdb0: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
fdc0: 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73  5x %d-%d", p->ws
fdd0: 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
fde0: 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65  ,p->nSkip);.  }e
fdf0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
fe00: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
fe10: 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %05x N %d", p->w
fe20: 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
fe30: 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  m);.  }.  sqlite
fe40: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
fe50: 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
fe60: 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
fe70: 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20  Run, p->nOut);. 
fe80: 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26   if( p->nLTerm &
fe90: 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54  & (sqlite3WhereT
fea0: 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
feb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
fec0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
fed0: 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  >nLTerm; i++){. 
fee0: 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
fef0: 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  int(p->aLTerm[i]
ff00: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
ff10: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
ff20: 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
ff30: 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
ff40: 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
ff50: 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
ff60: 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
ff70: 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
ff80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
ff90: 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
ffa0: 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
ffb0: 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
ffc0: 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
ffd0: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
ffe0: 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
fff0: 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
10000 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
10010 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
10020 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
10030 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
10040 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
10050 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
10060 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
10070 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
10080 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
10090 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
100a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
100b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
100c0 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
100d0 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
100e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
100f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
10100 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
10110 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
10120 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10130 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
10140 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
10150 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
10160 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
10170 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
10180 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
10190 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
101a0 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
101b0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
101c0 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
101d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
101e0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
101f0 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
10200 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10210 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  NN(db, p->u.btre
10220 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
10230 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
10240 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
10250 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
10260 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
10270 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
10280 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
10290 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
102a0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
102b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
102c0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
102d0 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
102e0 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
102f0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
10300 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77   p->aLTerm);.  w
10310 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
10320 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65  on(db, p);.  whe
10330 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d  reLoopInit(p);.}
10340 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ../*.** Increase
10350 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
10360 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70  cation for pLoop
10370 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65  ->aLTerm[] to be
10380 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a   at least n..*/.
10390 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
103a0 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
103b0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
103c0 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  p *p, int n){.  
103d0 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65  WhereTerm **paNe
103e0 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c  w;.  if( p->nLSl
103f0 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53  ot>=n ) return S
10400 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20  QLITE_OK;.  n = 
10410 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65  (n+7)&~7;.  paNe
10420 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
10430 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
10440 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
10450 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
10460 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
10470 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
10480 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c  .  memcpy(paNew,
10490 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65   p->aLTerm, size
104a0 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
104b0 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69  *p->nLSlot);.  i
104c0 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
104d0 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
104e0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
104f0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
10500 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
10510 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
10520 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
10530 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10540 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
10550 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
10560 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
10570 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
10580 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
10590 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
105a0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
105b0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
105c0 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
105d0 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
105e0 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
105f0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
10600 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
10610 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
10620 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
10630 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
10640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10650 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
10660 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
10670 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
10680 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
10690 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
106a0 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
106b0 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
106c0 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
106d0 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
106e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
106f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
10700 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
10710 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
10720 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
10730 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
10740 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
10750 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
10760 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
10770 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
10780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10790 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
107a0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
107b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
107c0 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
107d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
107e0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
107f0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
10800 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
10810 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  FreeNN(db, p);.}
10820 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
10830 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
10840 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
10850 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
10860 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
10870 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
10880 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
10890 72 74 28 20 70 57 49 6e 66 6f 21 3d 30 20 29 3b  rt( pWInfo!=0 );
108a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
108b0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
108c0 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76  +){.    WhereLev
108d0 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57  el *pLevel = &pW
108e0 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
108f0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  if( pLevel->pWLo
10900 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  op && (pLevel->p
10910 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
10920 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20   WHERE_IN_ABLE) 
10930 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10940 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
10950 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
10960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
10970 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
10980 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73  Clear(&pWInfo->s
10990 57 43 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 57  WC);.  while( pW
109a0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a  Info->pLoops ){.
109b0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
109c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70   = pWInfo->pLoop
109d0 73 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  s;.    pWInfo->p
109e0 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
109f0 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 4c  Loop;.    whereL
10a00 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
10a10 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
10a20 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 57 49 6e  bFreeNN(db, pWIn
10a30 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  fo);.}../*.** Re
10a40 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c  turn TRUE if all
10a50 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10a60 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
10a70 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
10a80 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
10a90 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
10aa0 20 20 28 32 29 20 20 58 20 75 73 65 73 20 66 65    (2)  X uses fe
10ab0 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
10ac0 20 74 65 72 6d 73 20 74 68 61 6e 20 59 0a 2a 2a   terms than Y.**
10ad0 20 20 20 28 33 29 20 20 45 76 65 72 79 20 57 48     (3)  Every WH
10ae0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
10af0 75 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73  used by X is als
10b00 6f 20 75 73 65 64 20 62 79 20 59 0a 2a 2a 20 20  o used by Y.**  
10b10 20 28 34 29 20 20 58 20 73 6b 69 70 73 20 61 74   (4)  X skips at
10b20 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63   least as many c
10b30 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 20 20  olumns as Y.**  
10b40 20 28 35 29 20 20 49 66 20 58 20 69 73 20 61 20   (5)  If X is a 
10b50 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
10b60 74 68 61 6e 20 59 20 69 73 20 74 6f 6f 0a 2a 2a  than Y is too.**
10b70 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 28  .** Conditions (
10b80 32 29 20 61 6e 64 20 28 33 29 20 6d 65 61 6e 20  2) and (3) mean 
10b90 74 68 61 74 20 58 20 69 73 20 61 20 22 70 72 6f  that X is a "pro
10ba0 70 65 72 20 73 75 62 73 65 74 22 20 6f 66 20 59  per subset" of Y
10bb0 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70  ..** If X is a p
10bc0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
10bd0 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65  Y then Y is a be
10be0 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20  tter choice and 
10bf0 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65  ought.** to have
10c00 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20   a lower cost.  
10c10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
10c20 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74  urns TRUE when t
10c30 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c  hat cost .** rel
10c40 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76  ationship is inv
10c50 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20  erted and needs 
10c60 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20  to be adjusted. 
10c70 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 34 29 0a   Constraint (4).
10c80 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
10c90 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73  ause if X uses s
10ca0 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68  kip-scan less th
10cb0 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69  an Y it still mi
10cc0 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61  ght.** deserve a
10cd0 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e   lower cost even
10ce0 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
10cf0 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 20  er subset of Y. 
10d00 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 35 29 0a   Constraint (5).
10d10 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
10d20 61 75 73 65 20 61 20 63 6f 76 65 72 69 6e 67 20  ause a covering 
10d30 69 6e 64 65 78 20 70 72 6f 62 61 62 6c 79 20 64  index probably d
10d40 65 73 65 72 76 65 73 20 74 6f 20 68 61 76 65 20  eserves to have 
10d50 61 20 6c 6f 77 65 72 20 63 6f 73 74 0a 2a 2a 20  a lower cost.** 
10d60 74 68 61 6e 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  than a non-cover
10d70 69 6e 67 20 69 6e 64 65 78 20 65 76 65 6e 20 69  ing index even i
10d80 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65 72  f it is a proper
10d90 20 73 75 62 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   subset..*/.stat
10da0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
10db0 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
10dc0 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65  set(.  const Whe
10dd0 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20  reLoop *pX,     
10de0 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65    /* First Where
10df0 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20  Loop to compare 
10e00 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  */.  const Where
10e10 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20  Loop *pY        
10e20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e  /* Compare again
10e30 73 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  st this WhereLoo
10e40 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  p */.){.  int i,
10e50 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c   j;.  if( pX->nL
10e60 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e  Term-pX->nSkip >
10e70 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d  = pY->nLTerm-pY-
10e80 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65  >nSkip ){.    re
10e90 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20  turn 0; /* X is 
10ea0 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
10eb0 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  Y */.  }.  if( p
10ec0 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e  Y->nSkip > pX->n
10ed0 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b  Skip ) return 0;
10ee0 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20  .  if( pX->rRun 
10ef0 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20  >= pY->rRun ){. 
10f00 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20     if( pX->rRun 
10f10 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74  > pY->rRun ) ret
10f20 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
10f30 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
10f40 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e   */.    if( pX->
10f50 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20  nOut > pY->nOut 
10f60 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
10f70 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  * X costs more t
10f80 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66  han Y */.  }.  f
10f90 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d  or(i=pX->nLTerm-
10fa0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
10fb0 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72     if( pX->aLTer
10fc0 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  m[i]==0 ) contin
10fd0 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59  ue;.    for(j=pY
10fe0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
10ff0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; j--){.      if
11000 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d  ( pY->aLTerm[j]=
11010 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29  =pX->aLTerm[i] )
11020 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11030 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75    if( j<0 ) retu
11040 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20  rn 0;  /* X not 
11050 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69  a subset of Y si
11060 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f  nce term X[i] no
11070 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20  t used by Y */. 
11080 20 7d 0a 20 20 69 66 28 20 28 70 58 2d 3e 77 73   }.  if( (pX->ws
11090 46 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f  Flags&WHERE_IDX_
110a0 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 26 26 20  ONLY)!=0 .   && 
110b0 28 70 59 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  (pY->wsFlags&WHE
110c0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
110d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
110e0 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
110f0 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  (5) */.  }.  ret
11100 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63  urn 1;  /* All c
11110 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a  onditions meet *
11120 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  /.}../*.** Try t
11130 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73  o adjust the cos
11140 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70  t of WhereLoop p
11150 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73  Template upwards
11160 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f   or downwards so
11170 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  .** that:.**.** 
11180 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20    (1) pTemplate 
11190 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20  costs less than 
111a0 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c  any other WhereL
111b0 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20  oops that are a 
111c0 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20  proper.**       
111d0 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c  subset of pTempl
111e0 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  ate.**.**   (2) 
111f0 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
11200 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74  more than any ot
11210 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  her WhereLoops f
11220 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61  or which pTempla
11230 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61  te.**       is a
11240 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a   proper subset..
11250 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68  **.** To say "Wh
11260 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70  ereLoop X is a p
11270 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
11280 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20  Y" means that X 
11290 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48  uses fewer.** WH
112a0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
112b0 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74   than Y and that
112c0 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
112d0 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79  use term used by
112e0 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73   X is.** also us
112f0 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74  ed by Y..*/.stat
11300 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
11310 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73  pAdjustCost(cons
11320 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t WhereLoop *p, 
11330 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
11340 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54  late){.  if( (pT
11350 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
11360 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
11370 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
11380 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70   for(; p; p=p->p
11390 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69  NextLoop){.    i
113a0 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
113b0 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f  plate->iTab ) co
113c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
113d0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
113e0 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
113f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11400 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
11410 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
11420 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29  (p, pTemplate) )
11430 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
11440 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
11450 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61   downward so tha
11460 74 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20  t it is cheaper 
11470 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20  than its .      
11480 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a  ** subset p. */.
11490 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
114a0 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
114b0 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
114c0 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
114d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
114e0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
114f0 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
11500 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
11510 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b  un, p->nOut-1));
11520 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
11530 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
11540 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
11550 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
11560 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t - 1;.    }else
11570 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68   if( whereLoopCh
11580 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65  eaperProperSubse
11590 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20  t(pTemplate, p) 
115a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
115b0 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  st pTemplate cos
115c0 74 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74  t upward so that
115d0 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20   it is costlier 
115e0 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20  than p since.   
115f0 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20     ** pTemplate 
11600 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
11610 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20  et of p */.     
11620 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
11630 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61  ,("subset cost a
11640 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20  djustment %d,%d 
11650 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20  to %d,%d\n",.   
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11670 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
11680 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Run, pTemplate->
11690 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  nOut, p->rRun, p
116a0 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20  ->nOut+1));.    
116b0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
116c0 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20  n = p->rRun;.   
116d0 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
116e0 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31  ut = p->nOut + 1
116f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11700 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
11710 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
11720 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f  ps in *ppPrev lo
11730 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68  oking for one th
11740 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 72 65 70  at can be.** rep
11750 6c 61 63 65 64 20 62 79 20 70 54 65 6d 70 6c 61  laced by pTempla
11760 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
11770 20 4e 55 4c 4c 20 69 66 20 70 54 65 6d 70 6c 61   NULL if pTempla
11780 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
11790 6e 67 20 6f 6e 20 74 68 65 20 57 68 65 72 65 4c  ng on the WhereL
117a0 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a 20 49 6e 20  oop list..** In 
117b0 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 70  other words if p
117c0 54 65 6d 70 6c 61 74 65 20 6f 75 67 68 74 20 74  Template ought t
117d0 6f 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  o be dropped fro
117e0 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64  m further consid
117f0 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
11800 66 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c  f pX is a WhereL
11810 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61  oop that pTempla
11820 74 65 20 63 61 6e 20 72 65 70 6c 61 63 65 2c 20  te can replace, 
11830 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
11840 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69  ** link that poi
11850 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a  nts to pX..**.**
11860 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61   If pTemplate ca
11870 6e 6e 6f 74 20 72 65 70 6c 61 63 65 20 61 6e 79  nnot replace any
11880 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e   existing elemen
11890 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75  t of the list bu
118a0 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  t needs.** to be
118b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
118c0 73 74 20 61 73 20 61 20 6e 65 77 20 65 6e 74 72  st as a new entr
118d0 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  y, then return a
118e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
118f0 2a 2a 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c  ** tail of the l
11900 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  ist..*/.static W
11910 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65  hereLoop **where
11920 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a  LoopFindLesser(.
11930 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
11940 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68  Prev,.  const Wh
11950 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
11960 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  te.){.  WhereLoo
11970 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a  p *p;.  for(p=(*
11980 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72  ppPrev); p; ppPr
11990 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ev=&p->pNextLoop
119a0 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20  , p=*ppPrev){.  
119b0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
119c0 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c  Template->iTab |
119d0 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70  | p->iSortIdx!=p
119e0 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49  Template->iSortI
119f0 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  dx ){.      /* I
11a00 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61  f either the iTa
11a10 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61  b or iSortIdx va
11a20 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65  lues for two Whe
11a30 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65  reLoop are diffe
11a40 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  rent.      ** th
11a50 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f  en those WhereLo
11a60 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ops need to be c
11a70 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61  onsidered separa
11a80 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69  tely.  Neither i
11a90 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e  s.      ** a can
11aa0 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63  didate to replac
11ab0 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a  e the other. */.
11ac0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
11ad0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20      }.    /* In 
11ae0 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
11af0 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
11b00 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20  rSetup value is 
11b10 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20  either zero.    
11b20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f  ** or the cost o
11b30 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75  f building an au
11b40 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e  tomatic index (N
11b50 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c  logN) and the Nl
11b60 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  ogN.    ** is th
11b70 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61  e same for compa
11b80 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73  tible WhereLoops
11b90 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
11ba0 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c   p->rSetup==0 ||
11bb0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74   pTemplate->rSet
11bc0 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  up==0 .         
11bd0 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53          || p->rS
11be0 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
11bf0 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
11c00 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  /* whereLoopAddB
11c10 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65  tree() always ge
11c20 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65  nerates and inse
11c30 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  rts the automati
11c40 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  c index.    ** c
11c50 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63  ase first.  Henc
11c60 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e  e compatible can
11c70 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  didate WhereLoop
11c80 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c  s never have a l
11c90 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65  arger.    ** rSe
11ca0 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53  tup. Call this S
11cb0 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a  ETUP-INVARIANT *
11cc0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
11cd0 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
11ce0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
11cf0 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75     /* Any loop u
11d00 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69  sing an appliati
11d10 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78  on-defined index
11d20 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   (or PRIMARY KEY
11d30 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55   or.    ** UNIQU
11d40 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69  E constraint) wi
11d50 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d  th one or more =
11d60 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73  = constraints is
11d70 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
11d80 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  han an automatic
11d90 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69   index. Unless i
11da0 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e  t is a skip-scan
11db0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d  . */.    if( (p-
11dc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
11dd0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a  _AUTO_INDEX)!=0.
11de0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
11df0 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20  te->nSkip)==0.  
11e00 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
11e10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
11e20 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
11e30 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
11e40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
11e50 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a  E_COLUMN_EQ)!=0.
11e60 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72       && (p->prer
11e70 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
11e80 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
11e90 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29  te->prereq.    )
11ea0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
11eb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11ec0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
11ed0 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74  op p is better t
11ee0 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70  han pTemplate, p
11ef0 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a  Template can be.
11f00 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64      ** discarded
11f10 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  .  WhereLoop p i
11f20 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20  s better if:.   
11f30 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73   **   (1)  p has
11f40 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65   no more depende
11f50 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70  ncies than pTemp
11f60 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  late, and.    **
11f70 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e     (2)  p has an
11f80 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
11f90 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c  cost than pTempl
11fa0 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ate.    */.    i
11fb0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
11fc0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11fd0 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20  q)==p->prereq   
11fe0 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
11ff0 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
12000 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20    /* (2a) */.   
12030 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54    && p->rRun<=pT
12040 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12060 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
12070 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70     && p->nOut<=p
12080 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20      /* (2c) */. 
120b0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
120c0 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72  rn 0;  /* Discar
120d0 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  d pTemplate */. 
120e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
120f0 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77  pTemplate is alw
12100 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20  ays better than 
12110 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20  p, then cause p 
12120 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  to be overwritte
12130 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54  n.    ** with pT
12140 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c  emplate.  pTempl
12150 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68  ate is better th
12160 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20  an p if:.    ** 
12170 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65    (1)  pTemplate
12180 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
12190 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c  endences than p,
121a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32   and.    **   (2
121b0 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73  )  pTemplate has
121c0 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
121d0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a  er cost than p..
121e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
121f0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
12200 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
12210 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
12220 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20  q   /* (1)  */. 
12230 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
12240 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
12270 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
12280 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74  ->nOut>=pTemplat
12290 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20  e->nOut         
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
122c0 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
122d0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
122e0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
122f0 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56   ); /* SETUP-INV
12300 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a  ARIANT above */.
12310 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f        break;   /
12320 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20  * Cause p to be 
12330 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70  overwritten by p
12340 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
12350 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
12360 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pPrev;.}../*.** 
12370 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63  Insert or replac
12380 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  e a WhereLoop en
12390 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65  try using the te
123a0 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e  mplate supplied.
123b0 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
123c0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  ng WhereLoop ent
123d0 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72  ry might be over
123e0 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e  written if the n
123f0 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69  ew template.** i
12400 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73  s better and has
12410 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
12420 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d  ies.  Or the tem
12430 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67  plate will be ig
12440 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20  nored.** and no 
12450 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75  insert will occu
12460 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  r if an existing
12470 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61   WhereLoop is fa
12480 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20  ster and has.** 
12490 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
124a0 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70  es than the temp
124b0 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65  late.  Otherwise
124c0 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
124d0 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73   is.** added bas
124e0 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61  ed on the templa
124f0 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  te..**.** If pBu
12500 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
12510 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77   not NULL then w
12520 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c  e care about onl
12530 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75  y the.** prerequ
12540 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20  isites and rRun 
12550 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f  and nOut costs o
12560 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f  f the N best loo
12570 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66  ps.  That.** inf
12580 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68  ormation is gath
12590 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69  ered in the pBui
125a0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a  lder->pOrSet obj
125b0 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69  ect.  This speci
125c0 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  al.** processing
125d0 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e   mode is used on
125e0 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  ly for OR clause
125f0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
12600 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61  ** When accumula
12610 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f  ting multiple lo
12620 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64  ops (when pBuild
12630 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55  er->pOrSet is NU
12640 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20  LL) we.** still 
12650 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
12660 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69  similar loops wi
12670 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  th the new templ
12680 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  ate if the.** ne
12690 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  w template is be
126a0 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
126b0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
126c0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
126d0 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
126e0 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
126f0 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
12700 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
12710 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
12720 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
12730 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
12740 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
12750 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
12760 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
12770 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
12780 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
12790 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
127a0 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
127b0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
127c0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f   current loop.*/
127d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
127e0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
127f0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
12800 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
12810 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
12820 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
12830 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65  rev, *p;.  Where
12840 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
12850 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
12860 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12870 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
12880 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  >db;.  int rc;..
12890 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72    /* If pBuilder
128a0 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66 69  ->pOrSet is defi
128b0 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ned, then only k
128c0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
128d0 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20   costs.  ** and 
128e0 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20  prereqs..  */.  
128f0 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  if( pBuilder->pO
12900 72 53 65 74 21 3d 30 20 29 7b 0a 20 20 20 20 69  rSet!=0 ){.    i
12910 66 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c  f( pTemplate->nL
12920 54 65 72 6d 20 29 7b 0a 23 69 66 20 57 48 45 52  Term ){.#if WHER
12930 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
12940 20 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75       u16 n = pBu
12950 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e  ilder->pOrSet->n
12960 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 0a  ;.      int x =.
12970 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
12980 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c  reOrInsert(pBuil
12990 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65  der->pOrSet, pTe
129a0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20  mplate->prereq, 
129b0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
129c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129e0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
129f0 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45  nOut);.#if WHERE
12a00 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
12a10 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66   0x8 */.      if
12a20 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
12a30 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
12a40 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
12a50 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72  gPrintf(x?"   or
12a60 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58  -%d:  ":"   or-X
12a70 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20  :  ", n);.      
12a80 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
12a90 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12aa0 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12ab0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
12ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12ad0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
12ae0 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69   Look for an exi
12af0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
12b00 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68 20  to replace with 
12b10 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20  pTemplate.  */. 
12b20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74   whereLoopAdjust
12b30 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Cost(pWInfo->pLo
12b40 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
12b50 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68 65 72  .  ppPrev = wher
12b60 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
12b70 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  &pWInfo->pLoops,
12b80 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20   pTemplate);..  
12b90 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b  if( ppPrev==0 ){
12ba0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c  .    /* There al
12bb0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 57  ready exists a W
12bc0 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20  hereLoop on the 
12bd0 6c 69 73 74 20 74 68 61 74 20 69 73 20 62 65 74  list that is bet
12be0 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
12bf0 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75  pTemplate, so ju
12c00 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c  st ignore pTempl
12c10 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ate */.#if WHERE
12c20 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
12c30 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20   0x8 */.    if( 
12c40 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
12c50 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
12c60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12c70 6e 74 66 28 22 20 20 20 73 6b 69 70 3a 20 22 29  ntf("   skip: ")
12c80 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
12c90 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
12ca0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
12cb0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
12cc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12cd0 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a  _OK;  .  }else{.
12ce0 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b      p = *ppPrev;
12cf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
12d00 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
12d10 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  t it means that 
12d20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c  either p[] shoul
12d30 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  d be overwritten
12d40 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70  .  ** with pTemp
12d50 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78  late[] if p[] ex
12d60 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e  ists, or if p==N
12d70 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ULL then allocat
12d80 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65  e a new.  ** Whe
12d90 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72  reLoop and inser
12da0 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57  t it..  */.#if W
12db0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
12dc0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66  D /* 0x8 */.  if
12dd0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
12de0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
12df0 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
12e00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
12e10 72 69 6e 74 66 28 22 72 65 70 6c 61 63 65 3a 20  rintf("replace: 
12e20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  ");.      whereL
12e30 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69  oopPrint(p, pBui
12e40 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12e50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
12e60 69 6e 74 66 28 22 20 20 20 77 69 74 68 3a 20 22  intf("   with: "
12e70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12e80 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
12e90 50 72 69 6e 74 66 28 22 20 20 20 20 61 64 64 3a  Printf("    add:
12ea0 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77   ");.    }.    w
12eb0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
12ec0 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
12ed0 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
12ee0 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
12ef0 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
12f00 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
12f10 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
12f20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
12f30 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
12f40 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
12f50 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
12f60 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
12f70 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
12f80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12f90 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 77  OMEM_BKPT;.    w
12fa0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
12fb0 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  .    p->pNextLoo
12fc0 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p = 0;.  }else{.
12fd0 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62      /* We will b
12fe0 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68  e overwriting Wh
12ff0 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75  ereLoop p[].  Bu
13000 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20  t before we do, 
13010 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20  first.    ** go 
13020 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74  through the rest
13030 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64   of the list and
13040 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65   delete any othe
13050 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65  r entries beside
13060 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61  s.    ** p[] tha
13070 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c  t are also suppl
13080 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  ated by pTemplat
13090 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  e */.    WhereLo
130a0 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70  op **ppTail = &p
130b0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
130c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44   WhereLoop *pToD
130d0 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  el;.    while( *
130e0 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  ppTail ){.      
130f0 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f  ppTail = whereLo
13100 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54  opFindLesser(ppT
13110 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ail, pTemplate);
13120 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69  .      if( ppTai
13130 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
13140 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70      pToDel = *pp
13150 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Tail;.      if( 
13160 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61  pToDel==0 ) brea
13170 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c  k;.      *ppTail
13180 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74   = pToDel->pNext
13190 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54  Loop;.#if WHERET
131a0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
131b0 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  0x8 */.      if(
131c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
131d0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
131e0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
131f0 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a  Printf(" delete:
13200 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65   ");.        whe
13210 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44  reLoopPrint(pToD
13220 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  el, pBuilder->pW
13230 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
13240 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  if.      whereLo
13250 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  opDelete(db, pTo
13260 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Del);.    }.  }.
13270 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
13280 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d  Xfer(db, p, pTem
13290 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70  plate);.  if( (p
132a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
132b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
132c0 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
132d0 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62  *pIndex = p->u.b
132e0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
132f0 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
13300 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29  Index->tnum==0 )
13310 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
13320 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
13330 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
13340 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
13350 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
13360 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
13370 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
13380 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
13390 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
133a0 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
133b0 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
133c0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
133d0 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
133e0 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
133f0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
13400 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
13410 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
13420 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
13430 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
13440 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
13450 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
13460 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
13470 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
13480 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
13490 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
134a0 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
134b0 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
134c0 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
134d0 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
134e0 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
134f0 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
13500 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
13510 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
13520 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
13530 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
13540 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
13550 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
13560 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
13570 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
13580 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
13590 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
135a0 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
135b0 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
135c0 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
135d0 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
135e0 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
135f0 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
13600 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
13610 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
13620 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
13630 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
13640 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
13650 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
13660 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
13670 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
13680 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
13690 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
136a0 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
136b0 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
136c0 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
136d0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
136e0 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
136f0 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
13700 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
13710 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
13720 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
13730 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
13740 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
13750 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
13760 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
13770 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
13780 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
13790 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
137a0 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
137b0 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
137c0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
137d0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
137e0 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
137f0 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
13800 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
13810 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
13820 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
13830 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
13840 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
13850 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
13860 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
13870 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
13880 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
13890 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
138a0 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
138b0 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
138c0 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
138d0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
138e0 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
138f0 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
13900 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
13910 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
13920 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
13930 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
13940 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
13950 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
13960 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
13970 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
13980 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
13990 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
139a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
139b0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
139c0 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
139d0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
139e0 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
139f0 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
13a00 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
13a10 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
13a20 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
13a30 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
13a40 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
13a50 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
13a60 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
13a70 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
13a80 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
13a90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
13aa0 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
13ab0 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
13ac0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
13ad0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
13ae0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
13af0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
13b00 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
13b10 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
13b20 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
13b30 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
13b40 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
13b50 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
13b60 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
13b70 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
13b80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
13b90 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
13ba0 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
13bb0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
13bc0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
13bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
13be0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
13bf0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
13c00 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
13c10 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
13c20 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
13c30 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
13c40 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13c50 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
13c60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
13c70 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
13c80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
13c90 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  f a truth probab
13ca0 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69  ility is specifi
13cb0 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b  ed using the lik
13cc0 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c  elihood() hints,
13cd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
13ce0 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69   use the probabi
13cf0 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79  lity provided by
13d00 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
13d10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
13d20 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
13d30 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
13d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13d50 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73     /* In the abs
13d60 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74  ence of explicit
13d70 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
13d80 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73  ties, use heuris
13d90 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20  tics to.        
13da0 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f  ** guess a reaso
13db0 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62  nable truth prob
13dc0 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ability. */.    
13dd0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
13de0 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
13df0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
13e00 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
13e10 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
13e20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
13e30 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
13e40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
13e50 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
13e60 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
13e70 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
13e80 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
13e90 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26  r(pRight, &k) &&
13ea0 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31   k>=(-1) && k<=1
13eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13ec0 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  k = 10;.        
13ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13ee0 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20       k = 20;.   
13ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13f00 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b     if( iReduce<k
13f10 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a   ) iReduce = k;.
13f20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13f30 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
13f40 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20  ( pLoop->nOut > 
13f50 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20  nRow-iReduce )  
13f60 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52  pLoop->nOut = nR
13f70 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a  ow - iReduce;.}.
13f80 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70 54 65  ./* .** Term pTe
13f90 72 6d 20 69 73 20 61 20 76 65 63 74 6f 72 20 72  rm is a vector r
13fa0 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  ange comparison 
13fb0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 66  operation. The f
13fc0 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  irst comparison.
13fd0 2a 2a 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72  ** in the vector
13fe0 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
13ff0 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  d using column n
14000 45 71 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  Eq of the index.
14010 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
14020 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  n returns the to
14030 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 76 65  tal number of ve
14040 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20 74 68  ctor elements th
14050 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  at can be used.*
14060 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  * as part of the
14070 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f   range compariso
14080 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  n..**.** For exa
14090 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
140a0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 57  ry is:.**.**   W
140b0 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 28  HERE a = ? AND (
140c0 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c 20 3f  b, c, d) > (?, ?
140d0 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 74  , ?).**.** and t
140e0 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20  he index:.**.** 
140f0 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 2e    CREATE INDEX .
14100 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63 2c 20  .. ON (a, b, c, 
14110 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  d, e).**.** then
14120 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
14130 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
14140 77 69 74 68 20 6e 45 71 3d 31 2e 20 54 68 65 20  with nEq=1. The 
14150 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
14160 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69  n.** this case i
14170 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s 3..*/.static i
14180 6e 74 20 77 68 65 72 65 52 61 6e 67 65 56 65 63  nt whereRangeVec
14190 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72 73 65 20  torLen(.  Parse 
141a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
141b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
141c0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  t */.  int iCur,
141d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
141e0 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 70 49  ursor open on pI
141f0 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
14200 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx,         /* 
14210 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
14220 75 73 65 64 20 66 6f 72 20 61 20 69 6e 65 71 75  used for a inequ
14230 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
14240 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20   */.  int nEq,  
14250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14260 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 65 71  mber of prior eq
14270 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
14280 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e 64 65 78  ts on same index
14290 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
142a0 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a 20 54 68  *pTerm     /* Th
142b0 65 20 76 65 63 74 6f 72 20 69 6e 65 71 75 61 6c  e vector inequal
142c0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ity constraint *
142d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  /.){.  int nCmp 
142e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
142f0 74 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d 3e 70  torSize(pTerm->p
14300 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
14310 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70 20 3d  int i;..  nCmp =
14320 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49 64 78   MIN(nCmp, (pIdx
14330 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45 71 29  ->nColumn - nEq)
14340 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
14350 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCmp; i++){.    
14360 2f 2a 20 54 65 73 74 20 69 66 20 63 6f 6d 70 61  /* Test if compa
14370 72 69 73 6f 6e 20 69 20 6f 66 20 70 54 65 72 6d  rison i of pTerm
14380 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   is compatible w
14390 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b 6e 45  ith column (i+nE
143a0 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  q) .    ** of th
143b0 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 74 2c  e index. If not,
143c0 20 65 78 69 74 20 74 68 65 20 6c 6f 6f 70 2e 20   exit the loop. 
143d0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66   */.    char aff
143e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
143f0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
14400 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  son affinity */.
14410 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
14420 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14430 20 20 2f 2a 20 49 6e 64 65 78 65 64 20 63 6f 6c    /* Indexed col
14440 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 2a 2f  umns affinity */
14450 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
14460 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
14470 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
14480 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14490 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  nce */.    Expr 
144a0 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70  *pLhs = pTerm->p
144b0 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
144c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
144d0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 68 73  ;.    Expr *pRhs
144e0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
144f0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28  >pRight;.    if(
14500 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 45   pRhs->flags & E
14510 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20  P_xIsSelect ){. 
14520 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73       pRhs = pRhs
14530 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
14540 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
14550 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14560 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d 3e 78    pRhs = pRhs->x
14570 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
14580 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  pr;.    }..    /
14590 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
145a0 20 4c 48 53 20 6f 66 20 74 68 65 20 63 6f 6d 70   LHS of the comp
145b0 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
145c0 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  mn reference to.
145d0 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
145e0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
145f0 69 67 68 74 20 73 6f 75 72 63 65 20 74 61 62 6c  ight source tabl
14600 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  e. And that the 
14610 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f 72 64 65  sort.    ** orde
14620 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  r of the index c
14630 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 73 61 6d  olumn is the sam
14640 65 20 61 73 20 74 68 65 20 73 6f 72 74 20 6f 72  e as the sort or
14650 64 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  der of the.    *
14660 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e 64 65 78  * leftmost index
14670 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 20   column.  */.   
14680 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21 3d 54   if( pLhs->op!=T
14690 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20 7c  K_COLUMN .     |
146a0 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65 21 3d  | pLhs->iTable!=
146b0 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20 70 4c  iCur .     || pL
146c0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64  hs->iColumn!=pId
146d0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b 6e 45  x->aiColumn[i+nE
146e0 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70 49 64 78  q] .     || pIdx
146f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2b 6e  ->aSortOrder[i+n
14700 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53 6f 72 74  Eq]!=pIdx->aSort
14710 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20 20 20 29  Order[nEq].    )
14720 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
14730 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
14740 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d  se( pLhs->iColum
14750 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 0a 20  n==XN_ROWID );. 
14760 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
14770 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
14780 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45 78 70  pRhs, sqlite3Exp
14790 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73 29 29  rAffinity(pLhs))
147a0 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d 20 73  ;.    idxaff = s
147b0 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d  qlite3TableColum
147c0 6e 41 66 66 69 6e 69 74 79 28 70 49 64 78 2d 3e  nAffinity(pIdx->
147d0 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d 3e 69 43  pTable, pLhs->iC
147e0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 20  olumn);.    if( 
147f0 61 66 66 21 3d 69 64 78 61 66 66 20 29 20 62 72  aff!=idxaff ) br
14800 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c 6c 20  eak;..    pColl 
14810 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
14820 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
14830 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73  arse, pLhs, pRhs
14840 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
14850 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
14860 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
14870 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
14880 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  , pIdx->azColl[i
14890 2b 6e 45 71 5d 29 20 29 20 62 72 65 61 6b 3b 0a  +nEq]) ) break;.
148a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
148b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
148c0 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74 68  the cost C by th
148d0 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65  e costMult facte
148e0 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  r T.  This only 
148f0 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d  occurs if.** com
14900 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c  piled with -DSQL
14910 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
14920 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ULT.*/.#ifdef SQ
14930 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
14940 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70  MULT.# define Ap
14950 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
14960 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23  r(C,T)  C += T.#
14970 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70  else.# define Ap
14980 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
14990 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f  r(C,T).#endif../
149a0 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
149b0 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
149c0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
149d0 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
149e0 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70   the .** index p
149f0 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61  Index. Try to ma
14a00 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a  tch one more..**
14a10 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
14a20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
14a30 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  , pBuilder->pNew
14a40 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20  ->nOut contains 
14a50 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
14a60 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
14a70 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62 79  to be visited by
14a80 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67   filtering using
14a90 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72   the nEq .** ter
14aa0 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69  ms only. If it i
14ab0 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73  s modified, this
14ac0 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72   value is restor
14ad0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a  ed before this .
14ae0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
14af0 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  rns..**.** If pP
14b00 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74  robe->tnum==0, t
14b10 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78  hat means pIndex
14b20 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78   is a fake index
14b30 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a   used for the.**
14b40 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
14b50 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   KEY..*/.static 
14b60 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
14b70 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68  BtreeIndex(.  Wh
14b80 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
14b90 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a  pBuilder,     /*
14ba0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66   The WhereLoop f
14bb0 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75  actory */.  stru
14bc0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
14bd0 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46  *pSrc,      /* F
14be0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
14bf0 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a  being analyzed *
14c00 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
14c10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14c20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
14c30 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67  on pSrc */.  Log
14c40 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20  Est nInMul      
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c60 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74  log(Number of it
14c70 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20  erations due to 
14c80 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  IN) */.){.  Wher
14c90 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
14ca0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
14cb0 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c  ;  /* WHERE anal
14cc0 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  yse context */. 
14cd0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
14ce0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
14cf0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
14d00 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14d10 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14d20 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
14d30 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
14d40 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f  ection malloc co
14d50 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
14d60 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
14d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
14d80 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
14d90 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
14da0 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
14db0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
14dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68           /* A Wh
14dd0 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f  ereTerm under co
14de0 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
14df0 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20   int opMask;    
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74   /* Valid operat
14e20 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  ors for constrai
14e30 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63  nts */.  WhereSc
14e40 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20  an scan;        
14e50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
14e60 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74  ator for WHERE t
14e70 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
14e80 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20  k saved_prereq; 
14e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
14ea0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
14eb0 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20  New->prereq */. 
14ec0 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72   u16 saved_nLTer
14ed0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
14ee0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
14ef0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65  ue of pNew->nLTe
14f00 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  rm */.  u16 save
14f10 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  d_nEq;          
14f20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
14f30 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
14f40 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a  w->u.btree.nEq *
14f50 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 42  /.  u16 saved_nB
14f60 74 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tm;             
14f70 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14f80 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
14f90 2e 62 74 72 65 65 2e 6e 42 74 6d 20 2a 2f 0a 20  .btree.nBtm */. 
14fa0 20 75 31 36 20 73 61 76 65 64 5f 6e 54 6f 70 3b   u16 saved_nTop;
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
14fd0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
14fe0 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a 20 20 75 31  ree.nTop */.  u1
14ff0 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20  6 saved_nSkip;  
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15010 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
15020 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a  of pNew->nSkip *
15030 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73  /.  u32 saved_ws
15040 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
15050 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
15060 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77  value of pNew->w
15070 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45  sFlags */.  LogE
15080 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20  st saved_nOut;  
15090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
150a0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
150b0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20   pNew->nOut */. 
150c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
150d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
150e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
150f0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
15100 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
15110 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15120 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
15130 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
15140 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
15150 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
15160 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73  rithm of table s
15170 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ize */.  WhereTe
15180 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70  rm *pTop = 0, *p
15190 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20  Btm = 0; /* Top 
151a0 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65  and bottom range
151b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
151c0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
151d0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20  er->pNew;.  if( 
151e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
151f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
15200 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 57  _NOMEM_BKPT;.  W
15210 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c  HERETRACE(0x800,
15220 20 28 22 42 45 47 49 4e 20 25 73 2e 61 64 64 42   ("BEGIN %s.addB
15230 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45 71  treeIdx(%s), nEq
15240 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
15260 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61  obe->pTable->zNa
15270 6d 65 2c 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  me,pProbe->zName
15280 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  , pNew->u.btree.
15290 6e 45 71 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  nEq));..  assert
152a0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
152b0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
152c0 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
152d0 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
152e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
152f0 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
15300 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
15310 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
15320 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
15330 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
15340 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
15350 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
15360 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a  tree.nBtm==0 );.
15370 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
15380 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
15390 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
153a0 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
153b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
153c0 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
153d0 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
153e0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
153f0 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
15400 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
15410 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
15420 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64 5f  umn );..  saved_
15430 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  nEq = pNew->u.bt
15440 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64  ree.nEq;.  saved
15450 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e  _nBtm = pNew->u.
15460 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 73 61  btree.nBtm;.  sa
15470 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65 77 2d  ved_nTop = pNew-
15480 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 20  >u.btree.nTop;. 
15490 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
154a0 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61  New->nSkip;.  sa
154b0 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
154c0 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
154d0 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
154e0 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
154f0 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
15500 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
15510 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
15520 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20  nOut;.  pTerm = 
15530 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
15540 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
15550 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
15560 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20  r, saved_nEq,.  
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
15590 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72  robe);.  pNew->r
155a0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69  Setup = 0;.  rSi
155b0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
155c0 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72  owLogEst[0];.  r
155d0 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
155e0 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b  (rSize);.  for(;
155f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15600 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
15610 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
15620 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75  t(&scan)){.    u
15630 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e  16 eOp = pTerm->
15640 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20  eOperator;   /* 
15650 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54  Shorthand for pT
15660 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  erm->eOperator *
15670 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f  /.    LogEst rCo
15680 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73  stIdx;.    LogEs
15690 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  t nOutUnadjusted
156a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74  ;        /* nOut
156b0 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64   before IN() and
156c0 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e   WHERE adjustmen
156d0 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  ts */.    int nI
156e0 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
156f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
15700 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
15710 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
15720 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
15730 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
15740 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55  f( (eOp==WO_ISNU
15750 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
15760 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
15770 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e  )!=0).     && in
15780 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c  dexColumnNotNull
15790 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e  (pProbe, saved_n
157a0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
157b0 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
157c0 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
157d0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
157e0 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
157f0 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
15800 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
15810 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
15820 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
15830 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  ue;..    /* Do n
15840 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70  ot allow the upp
15850 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49  er bound of a LI
15860 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
15870 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
15880 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77  .    ** to mix w
15890 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67  ith a lower rang
158a0 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d  e bound from som
158b0 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a  e other source *
158c0 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
158d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
158e0 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d  LIKEOPT && pTerm
158f0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
15900 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  LT ) continue;..
15910 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
15920 6c 6f 77 20 49 53 20 63 6f 6e 73 74 72 61 69 6e  low IS constrain
15930 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45 52  ts from the WHER
15940 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75  E clause to be u
15950 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  sed by the.    *
15960 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  * right table of
15970 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f   a LEFT JOIN.  O
15980 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nly constraints 
15990 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
159a0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f   are.    ** allo
159b0 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  wed */.    if( (
159c0 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  pSrc->fg.jointyp
159d0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a  e & JT_LEFT)!=0.
159e0 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
159f0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
15a00 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
15a10 69 6e 29 0a 20 20 20 20 20 26 26 20 28 65 4f 70  in).     && (eOp
15a20 20 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49 53 4e   & (WO_IS|WO_ISN
15a30 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29 7b 0a  ULL))!=0.    ){.
15a40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15a50 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  eOp & WO_IS );. 
15a60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
15a70 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
15a80 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
15a90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
15aa0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
15ab0 50 72 6f 62 65 29 20 26 26 20 73 61 76 65 64 5f  Probe) && saved_
15ac0 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65  nEq==pProbe->nKe
15ad0 79 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  yCol-1 ){.      
15ae0 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61  pBuilder->bldFla
15af0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42 4c 44  gs |= SQLITE_BLD
15b00 46 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65  F_UNIQUE;.    }e
15b10 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 75 69 6c  lse{.      pBuil
15b20 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d  der->bldFlags |=
15b30 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e 44   SQLITE_BLDF_IND
15b40 45 58 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  EXED;.    }.    
15b50 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
15b60 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
15b70 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
15b80 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
15b90 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
15ba0 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64  ree.nBtm = saved
15bb0 5f 6e 42 74 6d 3b 0a 20 20 20 20 70 4e 65 77 2d  _nBtm;.    pNew-
15bc0 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20  >u.btree.nTop = 
15bd0 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 20 20  saved_nTop;.    
15be0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
15bf0 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20  aved_nLTerm;.   
15c00 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
15c10 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
15c20 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
15c30 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
15c40 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  /.    pNew->aLTe
15c50 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
15c60 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
15c70 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28  pNew->prereq = (
15c80 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70  saved_prereq | p
15c90 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
15ca0 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
15cb0 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72  Self;..    asser
15cc0 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20  t( nInMul==0.   
15cd0 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
15ce0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
15cf0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a  OLUMN_NULL)!=0 .
15d00 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77          || (pNew
15d10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
15d20 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20  E_COLUMN_IN)!=0 
15d30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
15d40 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
15d50 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20  RE_SKIPSCAN)!=0 
15d60 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28  .    );..    if(
15d70 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a   eOp & WO_IN ){.
15d80 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
15d90 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
15da0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
15db0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
15dc0 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
15dd0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
15de0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
15df0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
15e00 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45      /* "x IN (SE
15e10 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e  LECT ...)":  TUN
15e20 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20  ING: the SELECT 
15e30 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
15e40 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
15e50 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  ;.        nIn = 
15e60 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  46;  assert( 46=
15e70 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
15e80 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  5) );..        /
15e90 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
15ea0 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
15eb0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 78 2c   of the form (x,
15ec0 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e   y) IN (SELECT..
15ed0 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  .)..        ** I
15ee0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
15ef0 65 20 69 73 20 61 20 73 65 70 61 72 61 74 65 20  e is a separate 
15f00 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20 6f 66  term for each of
15f10 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a 20 20   (x) and (y)..  
15f20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
15f30 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74 69 70  , the nIn multip
15f40 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  lier should only
15f50 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e 63 65   be applied once
15f60 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20 20 20  , not once.     
15f70 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20 73     ** for each s
15f80 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20 66 6f  uch term. The fo
15f90 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 68 65  llowing loop che
15fa0 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d 20 69  cks that pTerm i
15fb0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
15fc0 20 66 69 72 73 74 20 73 75 63 68 20 74 65 72 6d   first such term
15fd0 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73 65 74   in use, and set
15fe0 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20 30 20  s nIn back to 0 
15ff0 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f  if it is not. */
16000 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
16010 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ; i<pNew->nLTerm
16020 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
16030 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 4c      if( pNew->aL
16040 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65 77 2d  Term[i] && pNew-
16050 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70  >aLTerm[i]->pExp
16060 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e 20 3d  r==pExpr ) nIn =
16070 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
16080 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
16090 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
160a0 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
160b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
160c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
160d0 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
160e0 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
160f0 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c    nIn = sqlite3L
16100 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70  ogEst(pExpr->x.p
16110 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
16120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 49        assert( nI
16130 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61  n>0 );  /* RHS a
16140 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d  lways has 2 or m
16150 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68  ore terms...  Th
16160 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20 20  e parser.       
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78     ** changes "x
16190 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78   IN (?)" into "x
161a0 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  =?". */.      }.
161b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
161c0 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
161d0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
161e0 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Col = pProbe->ai
161f0 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71  Column[saved_nEq
16200 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ];.      pNew->w
16210 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
16220 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
16230 20 61 73 73 65 72 74 28 20 73 61 76 65 64 5f 6e   assert( saved_n
16240 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65  Eq==pNew->u.btre
16250 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20 69  e.nEq );.      i
16260 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  f( iCol==XN_ROWI
16270 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69 43  D .       || (iC
16280 6f 6c 3e 3d 30 20 26 26 20 6e 49 6e 4d 75 6c 3d  ol>=0 && nInMul=
16290 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d  =0 && saved_nEq=
162a0 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
162b0 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  -1).      ){.   
162c0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58       if( iCol==X
162d0 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 72 6f 62  N_ROWID || pProb
162e0 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 0a  e->uniqNotNull .
162f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72           || (pPr
16300 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  obe->nKeyCol==1 
16310 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  && pProbe->onErr
16320 6f 72 20 26 26 20 65 4f 70 3d 3d 57 4f 5f 45 51  or && eOp==WO_EQ
16330 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
16340 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
16350 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
16360 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d  NEROW;.        }
16370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16380 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
16390 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45   WHERE_UNQ_WANTE
163a0 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  D;.        }.   
163b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
163c0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
163d0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  LL ){.      pNew
163e0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
163f0 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
16400 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
16410 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  p & (WO_GT|WO_GE
16420 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
16430 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54  ase( eOp & WO_GT
16440 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16450 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20  se( eOp & WO_GE 
16460 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
16470 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
16480 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
16490 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
164a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
164b0 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65 52 61  e.nBtm = whereRa
164c0 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20  ngeVectorLen(.  
164d0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
164e0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70  pSrc->iCursor, p
164f0 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71  Probe, saved_nEq
16500 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b  , pTerm.      );
16510 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
16520 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
16530 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
16540 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
16550 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a  TERM_LIKEOPT ){.
16560 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
16570 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74   contraints that
16580 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c   come from the L
16590 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
165a0 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
165b0 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70  always used in p
165c0 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  airs. */.       
165d0 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31   pTop = &pTerm[1
165e0 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
165f0 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d  t( (pTop-(pTerm-
16600 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d  >pWC->a))<pTerm-
16610 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20  >pWC->nTerm );. 
16620 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16630 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  Top->wtFlags & T
16640 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20  ERM_LIKEOPT );. 
16650 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16660 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  Top->eOperator==
16670 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20  WO_LT );.       
16680 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
16690 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
166a0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
166b0 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
166c0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
166d0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
166e0 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20  erm++] = pTop;. 
166f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
16700 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
16710 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  P_LIMIT;.       
16720 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
16730 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Top = 1;.      }
16740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16750 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
16760 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
16770 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16780 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
16790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
167a0 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
167b0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
167c0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
167d0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
167e0 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
167f0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
16800 6f 70 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56  op = whereRangeV
16810 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20  ectorLen(.      
16820 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63      pParse, pSrc
16830 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62  ->iCursor, pProb
16840 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54  e, saved_nEq, pT
16850 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  erm.      );.   
16860 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
16870 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
16880 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
16890 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
168a0 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
168b0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
168c0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
168d0 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
168e0 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
168f0 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
16900 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
16910 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16920 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
16930 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
16940 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
16950 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
16960 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
16970 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
16980 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
16990 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
169a0 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
169b0 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
169c0 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
169d0 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
169e0 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
169f0 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
16a00 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
16a10 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
16a20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
16a30 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
16a40 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
16a50 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
16a60 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
16a70 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
16a80 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
16a90 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
16aa0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
16ab0 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
16ac0 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
16ad0 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
16ae0 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
16af0 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
16b00 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
16b10 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
16b20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
16b30 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
16b40 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
16b50 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
16b60 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
16b70 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
16b80 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
16b90 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
16ba0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
16bb0 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a  O_IN|WO_IS) );..
16bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
16bd0 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
16be0 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66  nOut );.      if
16bf0 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
16c00 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65 2d  ob<=0 && pProbe-
16c10 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
16c20 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  nEq]>=0 ){.     
16c30 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20     assert( (eOp 
16c40 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d  & WO_IN) || nIn=
16c50 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
16c60 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
16c70 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IN );.        p
16c80 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  New->nOut += pTe
16c90 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
16ca0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
16cb0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
16cc0 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
16cd0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
16ce0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20  3_OR_STAT4.     
16cf0 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
16d00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
16d10 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20   nInMul==0 .    
16d20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
16d30 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
16d40 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
16d50 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
16d60 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
16d70 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57      && ((eOp & W
16d80 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70  O_IN)==0 || !Exp
16d90 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
16da0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  rm->pExpr, EP_xI
16db0 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20  sSelect)).      
16dc0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45    ){.          E
16dd0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
16de0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
16df0 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
16e00 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
16e10 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20  |WO_IS))!=0 ){. 
16e20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
16e30 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
16e40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
16e50 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
16e60 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
16e70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
16e80 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
16e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
16ea0 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
16eb0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
16ec0 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
16ed0 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
16ee0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16ef0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
16f00 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
16f10 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
16f20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
16f30 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
16f40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
16f50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
16f60 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
16f70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
16f80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16f90 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20  E_OK ) break;   
16fa0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f         /* Jump o
16fb0 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20  ut of the pTerm 
16fc0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20  loop */.        
16fd0 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
16fe0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
16ff0 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
17000 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20  gEst(nOut);.    
17010 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
17020 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75  ->nOut>saved_nOu
17030 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  t ) pNew->nOut =
17040 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
17050 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
17060 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
17070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17080 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
17090 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20  ut==0 ).#endif. 
170a0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
170b0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
170c0 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c   (pProbe->aiRowL
170d0 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72  ogEst[nEq] - pPr
170e0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
170f0 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20  [nEq-1]);.      
17100 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
17110 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
17120 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
17130 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  : If there is no
17140 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
17150 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lue, assume that
17160 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   a .            
17170 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22  ** "col IS NULL"
17180 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63   expression matc
17190 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e  hes twice as man
171a0 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20  y rows .        
171b0 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f      ** as (col=?
171c0 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
171d0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
171e0 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
171f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17200 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
17210 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20  Set rCostIdx to 
17220 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
17230 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f  ting selected ro
17240 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64  ws in index. Add
17250 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e  .    ** it to pN
17260 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20  ew->rRun, which 
17270 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
17280 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
17290 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
172a0 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e   seek only. Then
172b0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e  , if this is a n
172c0 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
172d0 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  x, add the cost 
172e0 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69  of.    ** visiti
172f0 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  ng the rows in t
17300 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
17310 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20  */.    rCostIdx 
17320 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  = pNew->nOut + 1
17330 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
17340 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70  zIdxRow)/pSrc->p
17350 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
17360 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
17370 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
17380 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74  (rLogSize, rCost
17390 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70  Idx);.    if( (p
173a0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
173b0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
173c0 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
173d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
173e0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
173f0 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
17400 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36   pNew->nOut + 16
17410 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70  );.    }.    App
17420 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
17430 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72  (pNew->rRun, pPr
17440 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73  obe->pTable->cos
17450 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75  tMult);..    nOu
17460 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e  tUnadjusted = pN
17470 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ew->nOut;.    pN
17480 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d  ew->rRun += nInM
17490 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e  ul + nIn;.    pN
174a0 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d  ew->nOut += nInM
174b0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68  ul + nIn;.    wh
174c0 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
174d0 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
174e0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
174f0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
17500 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
17510 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
17520 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
17530 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
17540 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
17550 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
17560 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
17570 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
17580 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
17590 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
175a0 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
175b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
175c0 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
175d0 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
175e0 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
175f0 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
17600 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
17610 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
17620 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
17630 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
17640 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
17650 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
17660 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17670 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
17680 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
17690 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
176a0 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
176b0 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
176c0 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
176d0 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
176e0 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
176f0 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  nEq;.  pNew->u.b
17700 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65  tree.nBtm = save
17710 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e  d_nBtm;.  pNew->
17720 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73  u.btree.nTop = s
17730 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65  aved_nTop;.  pNe
17740 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  w->nSkip = saved
17750 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e  _nSkip;.  pNew->
17760 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
17770 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  wsFlags;.  pNew-
17780 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
17790 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ut;.  pNew->nLTe
177a0 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
177b0 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65  m;..  /* Conside
177c0 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73  r using a skip-s
177d0 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  can if there are
177e0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
177f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
17800 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
17810 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
17820 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
17830 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65  , and if the ave
17840 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  rage.  ** number
17850 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74   of repeats in t
17860 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
17870 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31  ms is at least 1
17880 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  8. .  **.  ** Th
17890 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31  e magic number 1
178a0 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e  8 is selected on
178b0 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20   the basis that 
178c0 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73  scanning 17 rows
178d0 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20  .  ** is almost 
178e0 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74  always quicker t
178f0 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65  han an index see
17900 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69  k (even though i
17910 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  f the index.  **
17920 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
17930 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77  than 2^17 rows w
17940 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69  e assume otherwi
17950 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74  se in other part
17960 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
17970 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69  de). And, even i
17980 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  f it is not, it 
17990 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f  should not be to
179a0 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a  o much slower. .
179b0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
179c0 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72  r hand, the extr
179d0 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e  a seeks could en
179e0 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69  d up being signi
179f0 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f  ficantly.  ** mo
17a00 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a  re expensive.  *
17a10 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d  /.  assert( 42==
17a20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38  sqlite3LogEst(18
17a30 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64  ) );.  if( saved
17a40 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69  _nEq==saved_nSki
17a50 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45  p.   && saved_nE
17a60 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q+1<pProbe->nKey
17a70 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65  Col.   && pProbe
17a80 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a  ->noSkipScan==0.
17a90 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69     && pProbe->ai
17aa0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
17ab0 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54  nEq+1]>=42  /* T
17ac0 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66  UNING: Minimum f
17ad0 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a  or skip-scan */.
17ae0 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72     && (rc = wher
17af0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
17b00 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
17b10 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  rm+1))==SQLITE_O
17b20 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73  K.  ){.    LogEs
17b30 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65  t nIter;.    pNe
17b40 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
17b50 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
17b60 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  p++;.    pNew->a
17b70 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
17b80 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm++] = 0;.    p
17b90 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
17ba0 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a  WHERE_SKIPSCAN;.
17bb0 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f      nIter = pPro
17bc0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
17bd0 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72  saved_nEq] - pPr
17be0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
17bf0 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20  [saved_nEq+1];. 
17c00 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
17c10 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54   nIter;.    /* T
17c20 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20  UNING:  Because 
17c30 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e  uncertainties in
17c40 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66   the estimates f
17c50 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65  or skip-scan que
17c60 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64  ries,.    ** add
17c70 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66   a 1.375 fudge f
17c80 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b  actor to make sk
17c90 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79  ip-scan slightly
17ca0 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f   less likely. */
17cb0 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b  .    nIter += 5;
17cc0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  .    whereLoopAd
17cd0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
17ce0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
17cf0 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d  be, nIter + nInM
17d00 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  ul);.    pNew->n
17d10 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
17d20 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
17d30 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
17d40 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
17d50 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
17d60 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  ip;.    pNew->ws
17d70 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
17d80 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 57 48  Flags;.  }..  WH
17d90 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20  ERETRACE(0x800, 
17da0 28 22 45 4e 44 20 25 73 2e 61 64 64 42 74 72 65  ("END %s.addBtre
17db0 65 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64  eIdx(%s), nEq=%d
17dc0 2c 20 72 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  , rc=%d\n",.    
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65    pProbe->pTable
17df0 2d 3e 7a 4e 61 6d 65 2c 20 70 50 72 6f 62 65 2d  ->zName, pProbe-
17e00 3e 7a 4e 61 6d 65 2c 20 73 61 76 65 64 5f 6e 45  >zName, saved_nE
17e10 71 2c 20 72 63 29 29 3b 0a 20 20 72 65 74 75 72  q, rc));.  retur
17e20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
17e30 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74  eturn True if it
17e40 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
17e50 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62  t pIndex might b
17e60 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69  e useful in.** i
17e70 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  mplementing the 
17e80 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17e90 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  in pBuilder..**.
17ea0 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20  ** Return False 
17eb0 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73  if pBuilder does
17ec0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
17ed0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17ee0 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  or.** if there i
17ef0 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e  s no way for pIn
17f00 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c  dex to be useful
17f10 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   in implementing
17f20 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42   that.** ORDER B
17f30 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  Y clause..*/.sta
17f40 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67  tic int indexMig
17f50 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
17f60 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  y(.  WhereLoopBu
17f70 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
17f80 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
17f90 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a  ,.  int iCursor.
17fa0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
17fb0 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  OB;.  ExprList *
17fc0 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e 74 20  aColExpr;.  int 
17fd0 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70  ii, jj;..  if( p
17fe0 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
17ff0 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
18000 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c  if( (pOB = pBuil
18010 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72  der->pWInfo->pOr
18020 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75  derBy)==0 ) retu
18030 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  rn 0;.  for(ii=0
18040 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b  ; ii<pOB->nExpr;
18050 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   ii++){.    Expr
18060 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65   *pExpr = sqlite
18070 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
18080 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  (pOB->a[ii].pExp
18090 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  r);.    if( pExp
180a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
180b0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
180c0 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e==iCursor ){.  
180d0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
180e0 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
180f0 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  n 1;.      for(j
18100 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
18110 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a  nKeyCol; jj++){.
18120 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
18130 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  r->iColumn==pInd
18140 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
18150 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
18160 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
18170 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d 20 70  f( (aColExpr = p
18180 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29  Index->aColExpr)
18190 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  !=0 ){.      for
181a0 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78  (jj=0; jj<pIndex
181b0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29  ->nKeyCol; jj++)
181c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
181d0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
181e0 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f  j]!=XN_EXPR ) co
181f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
18200 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
18210 6f 6d 70 61 72 65 53 6b 69 70 28 70 45 78 70 72  ompareSkip(pExpr
18220 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d  ,aColExpr->a[jj]
18230 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d  .pExpr,iCursor)=
18240 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
18250 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
18260 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18270 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
18280 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18290 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72  n a bitmask wher
182a0 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68  e 1s indicate th
182b0 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  at the correspon
182c0 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  ding column of.*
182d0 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75  * the table is u
182e0 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  sed by an index.
182f0 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
18300 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   63 columns are 
18310 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73  considered..*/.s
18320 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
18330 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64  lumnsInIndex(Ind
18340 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
18350 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
18360 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
18370 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
18380 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
18390 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
183a0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
183b0 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
183c0 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
183d0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
183e0 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
183f0 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
18400 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
18410 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
18420 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
18430 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
18440 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
18450 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
18460 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
18470 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
18480 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
18490 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
184a0 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
184b0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
184c0 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
184d0 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
184e0 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
184f0 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
18500 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
18510 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
18520 54 65 72 6d 3b 0a 20 20 50 61 72 73 65 20 2a 70  Term;.  Parse *p
18530 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49  Parse = pWC->pWI
18540 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77  nfo->pParse;.  w
18550 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70  hile( pWhere->op
18560 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
18570 69 66 28 20 21 77 68 65 72 65 55 73 61 62 6c 65  if( !whereUsable
18580 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 54 61  PartialIndex(iTa
18590 62 2c 70 57 43 2c 70 57 68 65 72 65 2d 3e 70 4c  b,pWC,pWhere->pL
185a0 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
185b0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57  .    pWhere = pW
185c0 68 65 72 65 2d 3e 70 52 69 67 68 74 3b 0a 20 20  here->pRight;.  
185d0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
185e0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
185f0 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 20 29 20  TE_EnableQPSG ) 
18600 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 66 6f  pParse = 0;.  fo
18610 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  r(i=0, pTerm=pWC
18620 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
18630 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
18640 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
18650 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
18660 3b 0a 20 20 20 20 69 66 28 20 28 21 45 78 70 72  ;.    if( (!Expr
18670 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
18680 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
18690 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  || pExpr->iRight
186a0 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29  JoinTable==iTab)
186b0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
186c0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
186d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
186e0 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a 20 20  Where, iTab) .  
186f0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
18700 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
18710 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
18720 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
18730 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
18740 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  r a single table
18750 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65   of the join whe
18760 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  re the table.** 
18770 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
18780 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
18790 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
187a0 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
187b0 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72   to be.** a b-tr
187c0 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  ee table, not a 
187d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
187e0 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20 28  *.** The costs (
187f0 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20  WhereLoop.rRun) 
18800 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c 6f  of the b-tree lo
18810 6f 70 73 20 61 64 64 65 64 20 62 79 20 74 68 69  ops added by thi
18820 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  s function.** ar
18830 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  e calculated as 
18840 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46  follows:.**.** F
18850 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20  or a full scan, 
18860 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61 62  assuming the tab
18870 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63 6f  le (or index) co
18880 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73  ntains nRow rows
18890 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
188a0 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20   = nRow * 3.0   
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188c0 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73   // full-table s
188d0 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  can.**     cost 
188e0 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20 20  = nRow * K      
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18900 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65 72  // scan of cover
18910 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20  ing index.**    
18920 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28   cost = nRow * (
18930 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20 20  K+3.0)          
18940 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66        // scan of
18950 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
18960 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  dex.**.** where 
18970 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62 65 74  K is a value bet
18980 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30  ween 1.1 and 3.0
18990 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
189a0 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65  e relative .** e
189b0 73 74 69 6d 61 74 65 64 20 61 76 65 72 61 67 65  stimated average
189c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
189d0 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65 63  ex and table rec
189e0 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ords..**.** For 
189f0 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 77  an index scan, w
18a00 68 65 72 65 20 6e 56 69 73 69 74 20 69 73 20 74  here nVisit is t
18a10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64  he number of ind
18a20 65 78 20 72 6f 77 73 20 76 69 73 69 74 65 64 0a  ex rows visited.
18a30 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c 20  ** by the scan, 
18a40 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68 65  and nSeek is the
18a50 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b 20   number of seek 
18a60 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69  operations requi
18a70 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69  red on .** the i
18a80 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a  ndex b-tree:.**.
18a90 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53  **     cost = nS
18aa0 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29  eek * (log(nRow)
18ab0 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20 20   + K * nVisit)  
18ac0 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65 72          // cover
18ad0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20  ing index.**    
18ae0 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20   cost = nSeek * 
18af0 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b  (log(nRow) + (K+
18b00 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20 20  3.0) * nVisit)  
18b10 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e    // non-coverin
18b20 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f  g index.**.** No
18b30 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73  rmally, nSeek is
18b40 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65 73   1. nSeek values
18b50 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 20   greater than 1 
18b60 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74 68  come about if th
18b70 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  e .** WHERE clau
18b80 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20 49  se includes "x I
18b90 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20  N (....)" terms 
18ba0 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
18bb0 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20   "x=?". Or when 
18bc0 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78 20  .** implicit "x 
18bd0 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  IN (SELECT x FRO
18be0 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61 72  M tbl)" terms ar
18bf0 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69 70  e added for skip
18c00 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  -scans..**.** Th
18c10 65 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c 75  e estimated valu
18c20 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74  es (nRow, nVisit
18c30 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20 63  , nSeek) often c
18c40 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20 61  ontain a large a
18c50 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65  mount.** of unce
18c60 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74 68  rtainty.  For th
18c70 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69  is reason, scori
18c80 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ng is designed t
18c90 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68 61  o pick plans tha
18ca0 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65 61  t.** "do the lea
18cb0 73 74 20 68 61 72 6d 22 20 69 66 20 74 68 65 20  st harm" if the 
18cc0 65 73 74 69 6d 61 74 65 73 20 61 72 65 20 69 6e  estimates are in
18cd0 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20 65  accurate.  For e
18ce0 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67  xample, a.** log
18cf0 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69 73  (nRow) factor is
18d00 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61 20   omitted from a 
18d10 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
18d20 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65 72  ex scan in order
18d30 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65 20   to.** bias the 
18d40 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f 72  scoring in favor
18d50 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
18d60 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77 6f  ex, since the wo
18d70 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66  rst-case.** perf
18d80 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e 67  ormance of using
18d90 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61 72   an index is far
18da0 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
18db0 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72 66   worst-case perf
18dc0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20  ormance.** of a 
18dd0 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e  full table scan.
18de0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
18df0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
18e00 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
18e10 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
18e20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
18e30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
18e40 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e60 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69  Extra prerequesi
18e70 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68  tes for using th
18e80 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  is table */.){. 
18e90 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
18ea0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
18eb0 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
18ec0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
18ed0 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
18ee0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
18ef0 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
18f00 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
18f10 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
18f20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
18f30 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
18f40 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
18f50 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69  y */.  LogEst ai
18f60 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20  RowEstPk[2];    
18f70 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c     /* The aiRowL
18f80 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f  ogEst[] value fo
18f90 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
18fa0 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d  */.  i16 aiColum
18fb0 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  nPk = -1;       
18fc0 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b   /* The aColumn[
18fd0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
18fe0 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53  sPk index */.  S
18ff0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
19000 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
19010 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
19020 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
19030 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f  t_item *pSrc;  /
19040 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
19050 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20  e btree term to 
19060 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  add */.  WhereLo
19070 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
19080 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
19090 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
190a0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
190b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
190c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
190d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  e */.  int iSort
190e0 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20  Idx = 1;        
190f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62     /* Index numb
19100 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20  er */.  int b;  
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19120 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e      /* A boolean
19130 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45   value */.  LogE
19140 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
19150 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
19160 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
19170 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45   table */.  LogE
19180 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
19190 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
191a0 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62  ithm of the numb
191b0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
191c0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
191d0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
191e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
191f0 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61  parsed WHERE cla
19200 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  use */.  Table *
19210 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
19220 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
19230 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
19240 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c   .  pNew = pBuil
19250 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49  der->pNew;.  pWI
19260 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
19270 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69  pWInfo;.  pTabLi
19280 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
19290 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20  bList;.  pSrc = 
192a0 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
192b0 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62  ew->iTab;.  pTab
192c0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
192d0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
192e0 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20  >pWC;.  assert( 
192f0 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d  !IsVirtual(pSrc-
19300 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28  >pTab) );..  if(
19310 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20   pSrc->pIBIndex 
19320 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44  ){.    /* An IND
19330 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73  EXED BY clause s
19340 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69  pecifies a parti
19350 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75  cular index to u
19360 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65  se */.    pProbe
19370 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65   = pSrc->pIBInde
19380 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  x;.  }else if( !
19390 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
193a0 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70  {.    pProbe = p
193b0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d  Tab->pIndex;.  }
193c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
193d0 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44  re is no INDEXED
193e0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65   BY clause.  Cre
193f0 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78  ate a fake Index
19400 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c   object in local
19410 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
19420 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e   sPk to represen
19430 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d  t the rowid prim
19440 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20  ary key index.  
19450 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  Make this.    **
19460 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20   fake index the 
19470 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e  first in a chain
19480 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   of Index object
19490 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68  s with all of th
194a0 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  e real.    ** in
194b0 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  dices to follow 
194c0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46  */.    Index *pF
194d0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
194e0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
194f0 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  of real indices 
19500 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  on the table */.
19510 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c      memset(&sPk,
19520 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78   0, sizeof(Index
19530 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79  ));.    sPk.nKey
19540 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  Col = 1;.    sPk
19550 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20  .nColumn = 1;.  
19560 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
19570 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
19580 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73    sPk.aiRowLogEs
19590 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
195a0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
195b0 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
195c0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
195d0 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49  Tab;.    sPk.szI
195e0 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a  dxRow = pTab->sz
195f0 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f  TabRow;.    aiRo
19600 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62  wEstPk[0] = pTab
19610 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
19620 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
19630 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 0;.    pFirst 
19640 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
19650 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
19660 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  rc->fg.notIndexe
19670 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
19680 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
19690 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
196a0 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
196b0 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
196c0 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
196d0 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
196e0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
196f0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
19700 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
19710 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
19720 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
19730 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61   }.  rSize = pTa
19740 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
19750 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
19760 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e  og(rSize);..#ifn
19770 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19780 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
19790 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
197a0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndexes */.  if( 
197b0 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  !pBuilder->pOrSe
197c0 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61  t      /* Not pa
197d0 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69  rt of an OR opti
197e0 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26  mization */.   &
197f0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
19800 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
19810 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20  _SUBCLAUSE)==0. 
19820 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50    && (pWInfo->pP
19830 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
19840 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  & SQLITE_AutoInd
19850 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72  ex)!=0.   && pSr
19860 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20 20  c->pIBIndex==0  
19870 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e      /* Has no IN
19880 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
19890 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
198a0 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20 20  fg.notIndexed   
198b0 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e  /* Has no NOT IN
198c0 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a  DEXED clause */.
198d0 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70     && HasRowid(p
198e0 54 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab)         /* 
198f0 4e 6f 74 20 57 49 54 48 4f 55 54 20 52 4f 57 49  Not WITHOUT ROWI
19900 44 20 74 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a  D table. (FIXME:
19910 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20   Why not?) */.  
19920 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73   && !pSrc->fg.is
19930 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f  Correlated /* No
19940 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
19950 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26  ubquery */.   &&
19960 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 52 65 63   !pSrc->fg.isRec
19970 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61  ursive  /* Not a
19980 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f   recursive commo
19990 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69  n table expressi
199a0 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  on. */.  ){.    
199b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
199c0 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
199d0 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
199e0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
199f0 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
19a00 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
19a10 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
19a20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
19a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
19a40 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
19a50 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
19a60 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
19a70 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
19a80 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
19a90 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
19aa0 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
19ab0 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
19ac0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
19ad0 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
19ae0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b         pNew->nSk
19af0 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ip = 0;.        
19b00 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
19b10 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
19b20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
19b30 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
19b40 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
19b50 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
19b60 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
19b70 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
19b80 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
19b90 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
19ba0 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20     ** estimated 
19bb0 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e  to be X*N*log2(N
19bc0 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
19bd0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
19be0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  in.        ** th
19bf0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
19c00 64 65 78 65 64 20 61 6e 64 20 77 68 65 72 65 20  dexed and where 
19c10 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32  X is 7 (LogEst=2
19c20 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20  8) for normal.  
19c30 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
19c40 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67 45 73 74  or 1.375 (LogEst
19c50 3d 34 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e  =4) for views an
19c60 64 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  d subqueries.  T
19c70 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
19c80 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c   ** of X is smal
19c90 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e  ler for views an
19ca0 64 20 73 75 62 71 75 65 72 69 65 73 20 73 6f 20  d subqueries so 
19cb0 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70  that the query p
19cc0 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a  lanner.        *
19cd0 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61  * will be more a
19ce0 67 67 72 65 73 73 69 76 65 20 61 62 6f 75 74 20  ggressive about 
19cf0 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d  generating autom
19d00 61 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72  atic indexes for
19d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73  .        ** thos
19d20 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65  e objects, since
19d30 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70   there is no opp
19d40 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20  ortunity to add 
19d50 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a  schema.        *
19d60 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62  * indexes on sub
19d70 71 75 65 72 69 65 73 20 61 6e 64 20 76 69 65 77  queries and view
19d80 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  s. */.        pN
19d90 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
19da0 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20  gSize + rSize + 
19db0 34 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  4;.        if( p
19dc0 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
19dd0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
19de0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
19df0 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
19e00 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
19e10 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20 20 20 7d  += 24;.        }
19e20 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
19e30 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
19e40 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d  w->rSetup, pTab-
19e50 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
19e60 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 72 53      if( pNew->rS
19e70 65 74 75 70 3c 30 20 29 20 70 4e 65 77 2d 3e 72  etup<0 ) pNew->r
19e80 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
19e90 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
19ea0 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
19eb0 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
19ec0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
19ed0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
19ee0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
19ef0 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
19f00 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
19f10 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
19f20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e      ** of knowin
19f30 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
19f40 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
19f50 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
19f60 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
19f70 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
19f80 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
19f90 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
19fa0 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
19fb0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
19fc0 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
19fd0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
19fe0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
19ff0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
1a000 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
1a010 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
1a020 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
1a030 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
1a040 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
1a050 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
1a060 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54 65 72  = mPrereq | pTer
1a070 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1a080 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1a090 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
1a0a0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
1a0b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a0c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a0d0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
1a0e0 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
1a0f0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
1a100 69 63 65 73 2e 20 49 66 20 74 68 65 72 65 20 77  ices. If there w
1a110 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
1a120 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
1a130 6c 79 20 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65  ly .  ** conside
1a140 72 20 69 6e 64 65 78 20 70 50 72 6f 62 65 2e 20  r index pProbe. 
1a150 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d   */.  for(; rc==
1a160 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72  SQLITE_OK && pPr
1a170 6f 62 65 3b 20 0a 20 20 20 20 20 20 70 50 72 6f  obe; .      pPro
1a180 62 65 3d 28 70 53 72 63 2d 3e 70 49 42 49 6e 64  be=(pSrc->pIBInd
1a190 65 78 20 3f 20 30 20 3a 20 70 50 72 6f 62 65 2d  ex ? 0 : pProbe-
1a1a0 3e 70 4e 65 78 74 29 2c 20 69 53 6f 72 74 49 64  >pNext), iSortId
1a1b0 78 2b 2b 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  x++.  ){.    if(
1a1c0 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
1a1d0 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26  xWhere!=0.     &
1a1e0 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  & !whereUsablePa
1a1f0 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d  rtialIndex(pSrc-
1a200 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70  >iCursor, pWC, p
1a210 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
1a220 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74  here) ){.      t
1a230 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69  estcase( pNew->i
1a240 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  Tab!=pSrc->iCurs
1a250 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69  or );  /* See ti
1a260 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35  cket [98d973b8f5
1a270 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  ] */.      conti
1a280 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c  nue;  /* Partial
1a290 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72   index inappropr
1a2a0 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75  iate for this qu
1a2b0 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ery */.    }.   
1a2c0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 4e 6f   if( pProbe->bNo
1a2d0 51 75 65 72 79 20 29 20 63 6f 6e 74 69 6e 75 65  Query ) continue
1a2e0 3b 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50  ;.    rSize = pP
1a2f0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
1a300 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  t[0];.    pNew->
1a310 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b  u.btree.nEq = 0;
1a320 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
1a330 65 65 2e 6e 42 74 6d 20 3d 20 30 3b 0a 20 20 20  ee.nBtm = 0;.   
1a340 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
1a350 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Top = 0;.    pNe
1a360 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  w->nSkip = 0;.  
1a370 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
1a380 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
1a390 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
1a3a0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1a3b0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
1a3c0 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 20 20  eq = mPrereq;.  
1a3d0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
1a3e0 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Size;.    pNew->
1a3f0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
1a400 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d   pProbe;.    b =
1a410 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
1a420 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c  ithOrderBy(pBuil
1a430 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72  der, pProbe, pSr
1a440 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
1a450 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f   /* The ONEPASS_
1a460 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65  DESIRED flags ne
1a470 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74  ver occurs toget
1a480 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42  her with ORDER B
1a490 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  Y */.    assert(
1a4a0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1a4b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
1a4c0 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
1a4d0 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20   || b==0 );.    
1a4e0 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
1a4f0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
1a500 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
1a510 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
1a520 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
1a530 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
1a540 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
1a550 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
1a560 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
1a570 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
1a580 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e   0;.      /* TUN
1a590 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c  ING: Cost of ful
1a5a0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20  l table scan is 
1a5b0 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20  (N*3.0). */.    
1a5c0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
1a5d0 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20  Size + 16;.     
1a5e0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
1a5f0 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
1a600 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
1a610 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
1a620 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
1a630 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
1a640 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1a650 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1a660 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1a670 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1a680 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  rSize;.      if(
1a690 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
1a6a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
1a6b0 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69  tmask m;.      i
1a6c0 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76  f( pProbe->isCov
1a6d0 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  ering ){.       
1a6e0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1a6f0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
1a700 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  | WHERE_INDEXED;
1a710 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a  .        m = 0;.
1a720 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a730 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63       m = pSrc->c
1a740 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
1a750 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29  sInIndex(pProbe)
1a760 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a770 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29  wsFlags = (m==0)
1a780 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   ? (WHERE_IDX_ON
1a790 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  LY|WHERE_INDEXED
1a7a0 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ) : WHERE_INDEXE
1a7b0 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  D;.      }..    
1a7c0 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
1a7d0 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
1a7e0 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c    if( b.       |
1a7f0 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  | !HasRowid(pTab
1a800 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 72 6f  ).       || pPro
1a810 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
1a820 65 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  e!=0.       || (
1a830 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26   m==0.         &
1a840 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  & pProbe->bUnord
1a850 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20  ered==0.        
1a860 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49   && (pProbe->szI
1a870 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
1a880 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26  bRow).         &
1a890 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
1a8a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
1a8b0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
1a8c0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  0.         && sq
1a8d0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1a8e0 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20  g.bUseCis.      
1a8f0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
1a900 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f  onEnabled(pWInfo
1a910 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  ->pParse->db, SQ
1a920 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61  LITE_CoverIdxSca
1a930 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20  n).          ). 
1a940 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1a950 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
1a960 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
1a970 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  0;..        /* T
1a980 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
1a990 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ing the index ro
1a9a0 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65  ws is N*K, where
1a9b0 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   K is.        **
1a9c0 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
1a9d0 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20   3.0, depending 
1a9e0 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
1a9f0 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20  sizes of the.   
1aa00 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e       ** index an
1aa10 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 2a 2f  d table rows. */
1aa20 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
1aa30 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20  Run = rSize + 1 
1aa40 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a  + (15*pProbe->sz
1aa50 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a  IdxRow)/pTab->sz
1aa60 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  TabRow;.        
1aa70 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20  if( m!=0 ){.    
1aa80 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1aa90 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
1aaa0 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 61  ng index scan, a
1aab0 64 64 20 69 6e 20 74 68 65 20 63 6f 73 74 20 6f  dd in the cost o
1aac0 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  f.          ** d
1aad0 6f 69 6e 67 20 74 61 62 6c 65 20 6c 6f 6f 6b 75  oing table looku
1aae0 70 73 2e 20 20 54 68 65 20 63 6f 73 74 20 77 69  ps.  The cost wi
1aaf0 6c 6c 20 62 65 20 33 78 20 74 68 65 20 6e 75 6d  ll be 3x the num
1ab00 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
1ab10 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 61   ** lookups.  Ta
1ab20 6b 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20  ke into account 
1ab30 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1ab40 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 0a 20  ms that can be. 
1ab50 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 74 69           ** sati
1ab60 73 66 69 65 64 20 75 73 69 6e 67 20 6a 75 73 74  sfied using just
1ab70 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
1ab80 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75  that do not requ
1ab90 69 72 65 20 61 0a 20 20 20 20 20 20 20 20 20 20  ire a.          
1aba0 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e  ** table lookup.
1abb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4c 6f   */.          Lo
1abc0 67 45 73 74 20 6e 4c 6f 6f 6b 75 70 20 3d 20 72  gEst nLookup = r
1abd0 53 69 7a 65 20 2b 20 31 36 3b 20 20 2f 2a 20 42  Size + 16;  /* B
1abe0 61 73 65 20 63 6f 73 74 3a 20 20 4e 2a 33 20 2a  ase cost:  N*3 *
1abf0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
1ac00 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  ii;.          in
1ac10 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
1ac20 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
1ac30 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1ac40 57 43 32 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  WC2 = &pWInfo->s
1ac50 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  WC;.          fo
1ac60 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 43 32 2d  r(ii=0; ii<pWC2-
1ac70 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
1ac80 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65             Where
1ac90 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
1aca0 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  WC2->a[ii];.    
1acb0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
1acc0 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42  ite3ExprCoveredB
1acd0 79 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70 45  yIndex(pTerm->pE
1ace0 78 70 72 2c 20 69 43 75 72 2c 20 70 50 72 6f 62  xpr, iCur, pProb
1acf0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
1ad00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ad10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ad20 20 20 20 20 20 2f 2a 20 70 54 65 72 6d 20 63 61       /* pTerm ca
1ad30 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 75  n be evaluated u
1ad40 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e  sing just the in
1ad50 64 65 78 2e 20 20 53 6f 20 72 65 64 75 63 65 0a  dex.  So reduce.
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1ad70 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62  he expected numb
1ad80 65 72 20 6f 66 20 74 61 62 6c 65 20 6c 6f 6f 6b  er of table look
1ad90 75 70 73 20 61 63 63 6f 72 64 69 6e 67 6c 79 20  ups accordingly 
1ada0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
1adb0 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
1adc0 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
1add0 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 20          nLookup 
1ade0 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
1adf0 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rob;.           
1ae00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ae10 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 2d 2d 3b        nLookup--;
1ae20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1ae30 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1ae40 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
1ae50 49 53 29 20 29 20 6e 4c 6f 6f 6b 75 70 20 2d 3d  IS) ) nLookup -=
1ae60 20 31 39 3b 0a 20 20 20 20 20 20 20 20 20 20 20   19;.           
1ae70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1ae80 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
1ae90 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
1aea0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1aeb0 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 6e 4c  d(pNew->rRun, nL
1aec0 6f 6f 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20  ookup);.        
1aed0 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43  }.        ApplyC
1aee0 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
1aef0 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e  ew->rRun, pTab->
1af00 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
1af10 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
1af20 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
1af30 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
1af40 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1af50 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1af60 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1af70 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
1af80 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
1af90 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
1afa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1afb0 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
1afc0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ags = 0;.    rc 
1afd0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
1afe0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
1aff0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
1b000 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 42 75   0);.    if( pBu
1b010 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 3d  ilder->bldFlags=
1b020 3d 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e 44  =SQLITE_BLDF_IND
1b030 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EXED ){.      /*
1b040 20 49 66 20 61 20 6e 6f 6e 2d 75 6e 69 71 75 65   If a non-unique
1b050 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 2c 20   index is used, 
1b060 6f 72 20 69 66 20 61 20 70 72 65 66 69 78 20 6f  or if a prefix o
1b070 66 20 74 68 65 20 6b 65 79 20 66 6f 72 0a 20 20  f the key for.  
1b080 20 20 20 20 2a 2a 20 75 6e 69 71 75 65 20 69 6e      ** unique in
1b090 64 65 78 20 69 73 20 75 73 65 64 20 28 6d 61 6b  dex is used (mak
1b0a0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 66 75  ing the index fu
1b0b0 6e 63 74 69 6f 6e 61 6c 6c 79 20 6e 6f 6e 2d 75  nctionally non-u
1b0c0 6e 69 71 75 65 29 0a 20 20 20 20 20 20 2a 2a 20  nique).      ** 
1b0d0 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  then the sqlite_
1b0e0 73 74 61 74 31 20 64 61 74 61 20 62 65 63 6f 6d  stat1 data becom
1b0f0 65 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72  es important for
1b100 20 73 63 6f 72 69 6e 67 20 74 68 65 0a 20 20 20   scoring the.   
1b110 20 20 20 2a 2a 20 70 6c 61 6e 20 2a 2f 0a 20 20     ** plan */.  
1b120 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
1b130 67 73 20 7c 3d 20 54 46 5f 53 74 61 74 73 55 73  gs |= TF_StatsUs
1b140 65 64 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ed;.    }.#ifdef
1b150 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1b160 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
1b170 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72    sqlite3Stat4Pr
1b180 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72  obeFree(pBuilder
1b190 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75  ->pRec);.    pBu
1b1a0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
1b1b0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64   = 0;.    pBuild
1b1c0 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65  er->pRec = 0;.#e
1b1d0 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
1b1e0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1b1f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1b200 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a  TUALTABLE../*.**
1b210 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 49 6e   Argument pIdxIn
1b220 66 6f 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  fo is already po
1b230 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c  pulated with all
1b240 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
1b250 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65 64  t may.** be used
1b260 20 62 79 20 74 68 65 20 76 69 72 74 75 61 6c 20   by the virtual 
1b270 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
1b280 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e   by pBuilder->pN
1b290 65 77 2d 3e 69 54 61 62 2e 20 54 68 69 73 0a 2a  ew->iTab. This.*
1b2a0 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73  * function marks
1b2b0 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 6f   a subset of tho
1b2c0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75  se constraints u
1b2d0 73 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73 20 74  sable, invokes t
1b2e0 68 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  he.** xBestIndex
1b2f0 20 6d 65 74 68 6f 64 20 61 6e 64 20 61 64 64 73   method and adds
1b300 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 70 6c   the returned pl
1b310 61 6e 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a  an to pBuilder..
1b320 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72 61 69  **.** A constrai
1b330 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 75 73 61  nt is marked usa
1b340 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ble if:.**.**   
1b350 2a 20 41 72 67 75 6d 65 6e 74 20 6d 55 73 61 62  * Argument mUsab
1b360 6c 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  le indicates tha
1b370 74 20 69 74 73 20 70 72 65 72 65 71 75 69 73 69  t its prerequisi
1b380 74 65 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  tes are availabl
1b390 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  e, and.**.**   *
1b3a0 20 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65 20 6f   It is not one o
1b3b0 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
1b3c0 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
1b3d0 20 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b 20 70   mExclude mask p
1b3e0 61 73 73 65 64 0a 2a 2a 20 20 20 20 20 61 73 20  assed.**     as 
1b3f0 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
1b400 65 6e 74 20 28 77 68 69 63 68 20 69 6e 20 70 72  ent (which in pr
1b410 61 63 74 69 63 65 20 69 73 20 65 69 74 68 65 72  actice is either
1b420 20 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a   WO_IN or 0)..**
1b430 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d 50 72  .** Argument mPr
1b440 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f  ereq is a mask o
1b450 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75  f tables that mu
1b460 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65  st be scanned be
1b470 66 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69 72 74  fore the.** virt
1b480 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 71 75 65  ual table in que
1b490 73 74 69 6f 6e 2e 20 54 68 65 73 65 20 61 72 65  stion. These are
1b4a0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 6c   added to the pl
1b4b0 61 6e 73 20 70 72 65 72 65 71 75 69 73 69 74 65  ans prerequisite
1b4c0 73 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74 20 69  s.** before it i
1b4d0 73 20 61 64 64 65 64 20 74 6f 20 70 42 75 69 6c  s added to pBuil
1b4e0 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75  der..**.** Outpu
1b4f0 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 62 49  t parameter *pbI
1b500 6e 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  n is set to true
1b510 20 69 66 20 74 68 65 20 70 6c 61 6e 20 61 64 64   if the plan add
1b520 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 0a 2a  ed to pBuilder.*
1b530 2a 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  * uses one or mo
1b540 72 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73 2c 20  re WO_IN terms, 
1b550 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
1b560 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1b570 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  t whereLoopAddVi
1b580 72 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68 65 72  rtualOne(.  Wher
1b590 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
1b5a0 75 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d 61 73  uilder,.  Bitmas
1b5b0 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20  k mPrereq,      
1b5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1b5d0 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  k of tables that
1b5e0 20 6d 75 73 74 20 62 65 20 75 73 65 64 2e 20 2a   must be used. *
1b5f0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 73 61  /.  Bitmask mUsa
1b600 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1b610 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75      /* Mask of u
1b620 73 61 62 6c 65 20 74 61 62 6c 65 73 20 2a 2f 0a  sable tables */.
1b630 20 20 75 31 36 20 6d 45 78 63 6c 75 64 65 2c 20    u16 mExclude, 
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 2f 2a 20 45 78 63 6c 75 64 65 20 74 65 72    /* Exclude ter
1b660 6d 73 20 75 73 69 6e 67 20 74 68 65 73 65 20 6f  ms using these o
1b670 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 73 71  perators */.  sq
1b680 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1b690 20 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20 2f 2a   *pIdxInfo,   /*
1b6a0 20 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a 65 63   Populated objec
1b6b0 74 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78  t for xBestIndex
1b6c0 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69   */.  u16 mNoOmi
1b6d0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1b6e0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
1b6f0 6f 6d 69 74 20 74 68 65 73 65 20 63 6f 6e 73 74  omit these const
1b700 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  raints */.  int 
1b710 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20 20 20  *pbIn           
1b720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1b730 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c 61 6e  UT: True if plan
1b740 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29   uses an IN(...)
1b750 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72   op */.){.  Wher
1b760 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70  eClause *pWC = p
1b770 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
1b780 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
1b790 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
1b7a0 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
1b7b0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
1b7c0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
1b7d0 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70 49 64  ge *pUsage = pId
1b7e0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
1b7f0 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74 20 69  ntUsage;.  int i
1b800 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d 3b 0a  ;.  int mxTerm;.
1b810 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1b820 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  E_OK;.  WhereLoo
1b830 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  p *pNew = pBuild
1b840 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61 72 73  er->pNew;.  Pars
1b850 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42 75 69  e *pParse = pBui
1b860 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50  lder->pWInfo->pP
1b870 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74 20 53  arse;.  struct S
1b880 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
1b890 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e 70  c = &pBuilder->p
1b8a0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1b8b0 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
1b8c0 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
1b8d0 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t = pIdxInfo->nC
1b8e0 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 61 73  onstraint;..  as
1b8f0 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65 20 26  sert( (mUsable &
1b900 20 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72 65 72   mPrereq)==mPrer
1b910 65 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20 3d 20  eq );.  *pbIn = 
1b920 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  0;.  pNew->prere
1b930 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a 20 20  q = mPrereq;..  
1b940 2f 2a 20 53 65 74 20 74 68 65 20 75 73 61 62 6c  /* Set the usabl
1b950 65 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 73 75  e flag on the su
1b960 62 73 65 74 20 6f 66 20 63 6f 6e 73 74 72 61 69  bset of constrai
1b970 6e 74 73 20 69 64 65 6e 74 69 66 69 65 64 20 62  nts identified b
1b980 79 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74  y .  ** argument
1b990 73 20 6d 55 73 61 62 6c 65 20 61 6e 64 20 6d 45  s mUsable and mE
1b9a0 78 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70 49 64  xclude. */.  pId
1b9b0 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
1b9c0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
1b9d0 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
1b9e0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
1b9f0 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nt;.  for(i=0; i
1ba00 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
1ba10 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
1ba20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1ba30 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70  Term = &pWC->a[p
1ba40 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
1ba50 66 73 65 74 5d 3b 0a 20 20 20 20 70 49 64 78 43  fset];.    pIdxC
1ba60 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b  ons->usable = 0;
1ba70 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
1ba80 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
1ba90 55 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e  Usable)==pTerm->
1baa0 70 72 65 72 65 71 52 69 67 68 74 20 0a 20 20 20  prereqRight .   
1bab0 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70    && (pTerm->eOp
1bac0 65 72 61 74 6f 72 20 26 20 6d 45 78 63 6c 75 64  erator & mExclud
1bad0 65 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  e)==0.    ){.   
1bae0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
1baf0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ble = 1;.    }. 
1bb00 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
1bb10 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 66  ize the output f
1bb20 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 71 6c  ields of the sql
1bb30 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1bb40 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 6d  structure */.  m
1bb50 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
1bb60 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
1bb70 5d 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  ])*nConstraint);
1bb80 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 49  .  assert( pIdxI
1bb90 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1bba0 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20 70 49  dxStr==0 );.  pI
1bbb0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
1bbc0 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
1bbd0 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49  idxNum = 0;.  pI
1bbe0 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
1bbf0 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70  onsumed = 0;.  p
1bc00 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1bc10 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
1bc20 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c  BIG_DBL / (doubl
1bc30 65 29 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  e)2;.  pIdxInfo-
1bc40 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
1bc50 20 32 35 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d   25;.  pIdxInfo-
1bc60 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b 0a 20  >idxFlags = 0;. 
1bc70 20 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73   pIdxInfo->colUs
1bc80 65 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  ed = (sqlite3_in
1bc90 74 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55 73 65  t64)pSrc->colUse
1bca0 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  d;..  /* Invoke 
1bcb0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1bcc0 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  e xBestIndex() m
1bcd0 65 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20 3d 20  ethod */.  rc = 
1bce0 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
1bcf0 61 72 73 65 2c 20 70 53 72 63 2d 3e 70 54 61 62  arse, pSrc->pTab
1bd00 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 69  , pIdxInfo);.  i
1bd10 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1bd20 63 3b 0a 0a 20 20 6d 78 54 65 72 6d 20 3d 20 2d  c;..  mxTerm = -
1bd30 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  1;.  assert( pNe
1bd40 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73  w->nLSlot>=nCons
1bd50 74 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f 72 28  traint );.  for(
1bd60 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
1bd70 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61  nt; i++) pNew->a
1bd80 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20  LTerm[i] = 0;.  
1bd90 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
1bda0 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 49 64  tMask = 0;.  pId
1bdb0 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
1bdc0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
1bdd0 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
1bde0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
1bdf0 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nt;.  for(i=0; i
1be00 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
1be10 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
1be20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20      int iTerm;. 
1be30 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20     if( (iTerm = 
1be40 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
1be50 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20  dex - 1)>=0 ){. 
1be60 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1be70 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pTerm;.      int
1be80 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
1be90 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
1bea0 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f    if( iTerm>=nCo
1beb0 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20  nstraint.       
1bec0 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 7c 7c  || j<0.       ||
1bed0 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20   j>=pWC->nTerm. 
1bee0 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
1bef0 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
1bf00 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 43 6f         || pIdxCo
1bf10 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a 20 20  ns->usable==0.  
1bf20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
1bf30 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1bf40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1bf50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1bf60 2c 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 20  ,"%s.xBestIndex 
1bf70 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72  malfunction",pSr
1bf80 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  c->pTab->zName);
1bf90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1bfa0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1bfb0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
1bfc0 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31  m==nConstraint-1
1bfd0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1bfe0 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20  se( j==0 );.    
1bff0 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70    testcase( j==p
1c000 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20  WC->nTerm-1 );. 
1c010 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
1c020 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70  C->a[j];.      p
1c030 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70  New->prereq |= p
1c040 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
1c050 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1c060 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53   iTerm<pNew->nLS
1c070 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  lot );.      pNe
1c080 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
1c090 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
1c0a0 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d  if( iTerm>mxTerm
1c0b0 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72   ) mxTerm = iTer
1c0c0 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  m;.      testcas
1c0d0 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a  e( iTerm==15 );.
1c0e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c0f0 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20  iTerm==16 );.   
1c100 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20     if( iTerm<16 
1c110 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  && pUsage[i].omi
1c120 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  t ) pNew->u.vtab
1c130 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c  .omitMask |= 1<<
1c140 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  iTerm;.      if(
1c150 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1c160 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
1c170 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76  {.        /* A v
1c180 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
1c190 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
1c1a0 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65   by an IN clause
1c1b0 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20   may not.       
1c1c0 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20   ** consume the 
1c1d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c1e0 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20  because (1) the 
1c1f0 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d  order of IN term
1c200 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
1c210 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
1c220 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f  related to the o
1c230 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74  rder of output t
1c240 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20  erms and.       
1c250 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65   ** (2) Multiple
1c260 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20   outputs from a 
1c270 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20  single IN value 
1c280 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20  will not merge. 
1c290 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68         ** togeth
1c2a0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  er.  */.        
1c2b0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1c2c0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
1c2d0 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
1c2e0 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e 53 51  >idxFlags &= ~SQ
1c2f0 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f  LITE_INDEX_SCAN_
1c300 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20  UNIQUE;.        
1c310 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73 73 65 72  *pbIn = 1; asser
1c320 74 28 20 28 6d 45 78 63 6c 75 64 65 20 26 20 57  t( (mExclude & W
1c330 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20  O_IN)==0 );.    
1c340 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1c350 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
1c360 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69  tMask &= ~mNoOmi
1c370 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  t;..  pNew->nLTe
1c380 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
1c390 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
1c3a0 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53  LTerm<=pNew->nLS
1c3b0 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75  lot );.  pNew->u
1c3c0 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70  .vtab.idxNum = p
1c3d0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b  IdxInfo->idxNum;
1c3e0 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1c3f0 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
1c400 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1c410 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49 6e 66  dxStr;.  pIdxInf
1c420 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
1c430 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  Str = 0;.  pNew-
1c440 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
1c450 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
1c460 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  r;.  pNew->u.vta
1c470 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69  b.isOrdered = (i
1c480 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  8)(pIdxInfo->ord
1c490 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20  erByConsumed ?. 
1c4a0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
1c4b0 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20  OrderBy : 0);.  
1c4c0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1c4d0 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d  ;.  pNew->rRun =
1c4e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72   sqlite3LogEstFr
1c4f0 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
1c500 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
1c510 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  );.  pNew->nOut 
1c520 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
1c530 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1c540 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20  tedRows);..  /* 
1c550 53 65 74 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  Set the WHERE_ON
1c560 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74 68 65  EROW flag if the
1c570 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65   xBestIndex() me
1c580 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64 0a 20  thod indicated. 
1c590 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61   ** that the sca
1c5a0 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20  n will visit at 
1c5b0 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c  most one row. Cl
1c5c0 65 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65  ear it otherwise
1c5d0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 49  . */.  if( pIdxI
1c5e0 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 20  nfo->idxFlags & 
1c5f0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
1c600 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20  N_UNIQUE ){.    
1c610 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
1c620 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20   WHERE_ONEROW;. 
1c630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
1c640 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  ->wsFlags &= ~WH
1c650 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a  ERE_ONEROW;.  }.
1c660 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1c670 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
1c680 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e   pNew);.  if( pN
1c690 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
1c6a0 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
1c6b0 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e  e3_free(pNew->u.
1c6c0 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
1c6d0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1c6e0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
1c6f0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
1c700 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d 25 64  ffff, ("  bIn=%d
1c710 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78   prereqIn=%04llx
1c720 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c   prereqOut=%04ll
1c730 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
1c740 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 62 49              *pbI
1c750 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74  n, (sqlite3_uint
1c760 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20 20 20  64)mPrereq,.    
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c780 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36    (sqlite3_uint6
1c790 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  4)(pNew->prereq 
1c7a0 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a  & ~mPrereq)));..
1c7b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c7c0 2f 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  /*.** If this fu
1c7d0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1c7e0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e  d from within an
1c7f0 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 63 61   xBestIndex() ca
1c800 6c 6c 62 61 63 6b 2c 20 69 74 0a 2a 2a 20 72 65  llback, it.** re
1c810 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
1c820 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1c830 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
1c840 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  of the collation
1c850 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 73 73  .** sequence ass
1c860 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 6c 65  ociated with ele
1c870 6d 65 6e 74 20 69 43 6f 6e 73 20 6f 66 20 74 68  ment iCons of th
1c880 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
1c890 69 6e 66 6f 2e 61 43 6f 6e 73 74 72 61 69 6e 74  info.aConstraint
1c8a0 0a 2a 2a 20 61 72 72 61 79 2e 20 4f 72 2c 20 69  .** array. Or, i
1c8b0 66 20 69 43 6f 6e 73 20 69 73 20 6f 75 74 20 6f  f iCons is out o
1c8c0 66 20 72 61 6e 67 65 20 6f 72 20 74 68 65 72 65  f range or there
1c8d0 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 78 42   is no active xB
1c8e0 65 73 74 49 6e 64 65 78 0a 2a 2a 20 63 61 6c 6c  estIndex.** call
1c8f0 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
1c900 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1c910 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6c 6c 61  lite3_vtab_colla
1c920 74 69 6f 6e 28 73 71 6c 69 74 65 33 5f 69 6e 64  tion(sqlite3_ind
1c930 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
1c940 6f 2c 20 69 6e 74 20 69 43 6f 6e 73 29 7b 0a 20  o, int iCons){. 
1c950 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f   HiddenIndexInfo
1c960 20 2a 70 48 69 64 64 65 6e 20 3d 20 28 48 69 64   *pHidden = (Hid
1c970 64 65 6e 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70  denIndexInfo*)&p
1c980 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 63 6f  IdxInfo[1];.  co
1c990 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
1c9a0 20 30 3b 0a 20 20 69 66 28 20 69 43 6f 6e 73 3e   0;.  if( iCons>
1c9b0 3d 30 20 26 26 20 69 43 6f 6e 73 3c 70 49 64 78  =0 && iCons<pIdx
1c9c0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
1c9d0 74 20 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  t ){.    CollSeq
1c9e0 20 2a 70 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e   *pC = 0;.    in
1c9f0 74 20 69 54 65 72 6d 20 3d 20 70 49 64 78 49 6e  t iTerm = pIdxIn
1ca00 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
1ca10 69 43 6f 6e 73 5d 2e 69 54 65 72 6d 4f 66 66 73  iCons].iTermOffs
1ca20 65 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  et;.    Expr *pX
1ca30 20 3d 20 70 48 69 64 64 65 6e 2d 3e 70 57 43 2d   = pHidden->pWC-
1ca40 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b  >a[iTerm].pExpr;
1ca50 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65  .    if( pX->pLe
1ca60 66 74 20 29 7b 0a 20 20 20 20 20 20 70 43 20 3d  ft ){.      pC =
1ca70 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1ca80 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 48 69  mpareCollSeq(pHi
1ca90 64 64 65 6e 2d 3e 70 50 61 72 73 65 2c 20 70 58  dden->pParse, pX
1caa0 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
1cab0 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
1cac0 7a 52 65 74 20 3d 20 28 70 43 20 3f 20 70 43 2d  zRet = (pC ? pC-
1cad0 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59  >zName : "BINARY
1cae0 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ");.  }.  return
1caf0 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
1cb00 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
1cb10 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
1cb20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
1cb30 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  n identified by.
1cb40 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ** pBuilder->pNe
1cb50 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
1cb60 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
1cb70 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75  ed to be a virtu
1cb80 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
1cb90 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1cba0 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1cbb0 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20  IN joins in the 
1cbc0 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 50 72 65  query, both mPre
1cbd0 72 65 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73  req and.** mUnus
1cbe0 61 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20  able are set to 
1cbf0 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 50  0. Otherwise, mP
1cc00 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20  rereq is a mask 
1cc10 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  of all FROM clau
1cc20 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68  se.** entries th
1cc30 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
1cc40 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1cc50 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
1cc60 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20  ause and are.** 
1cc70 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69  separated from i
1cc80 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e  t by at least on
1cc90 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  e LEFT or CROSS 
1cca0 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  JOIN. Similarly,
1ccb0 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   the.** mUnusabl
1ccc0 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
1ccd0 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
1cce0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63  entries that occ
1ccf0 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20  ur after the.** 
1cd00 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e  virtual table an
1cd10 64 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  d are separated 
1cd20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65  from it by at le
1cd30 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20  ast one LEFT or 
1cd40 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20  .** CROSS JOIN. 
1cd50 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1cd60 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
1cd70 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e   were:.**.**   .
1cd80 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c  .. FROM t1, t2 L
1cd90 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c  EFT JOIN t3, t4,
1cda0 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74   vt CROSS JOIN t
1cdb0 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  5, t6;.**.** the
1cdc0 6e 20 6d 50 72 65 72 65 71 20 63 6f 72 72 65 73  n mPrereq corres
1cdd0 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32  ponds to (t1, t2
1cde0 29 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20  ) and mUnusable 
1cdf0 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a  to (t5, t6)..**.
1ce00 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65  ** All the table
1ce10 73 20 69 6e 20 6d 50 72 65 72 65 71 20 6d 75 73  s in mPrereq mus
1ce20 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66  t be scanned bef
1ce30 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
1ce40 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c  virtual .** tabl
1ce50 65 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20  e. So any terms 
1ce60 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72  for which all pr
1ce70 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20  erequisites are 
1ce80 73 61 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a  satisfied by .**
1ce90 20 6d 50 72 65 72 65 71 20 6d 61 79 20 62 65 20   mPrereq may be 
1cea0 73 70 65 63 69 66 69 65 64 20 61 73 20 22 75 73  specified as "us
1ceb0 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c  able" in all cal
1cec0 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
1ced0 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79  . .** Conversely
1cee0 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  , all tables in 
1cef0 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62  mUnusable must b
1cf00 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
1cf10 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76  the current.** v
1cf20 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f  irtual table, so
1cf30 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77   any terms for w
1cf40 68 69 63 68 20 74 68 65 20 70 72 65 72 65 71 75  hich the prerequ
1cf50 69 73 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77  isites overlap w
1cf60 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  ith.** mUnusable
1cf70 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1cf80 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20  e configured as 
1cf90 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72  "not-usable" for
1cfa0 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a   xBestIndex..*/.
1cfb0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1cfc0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a  LoopAddVirtual(.
1cfd0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
1cfe0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f  er *pBuilder,  /
1cff0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
1d000 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
1d010 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c  Bitmask mPrereq,
1d020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d030 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  Tables that must
1d040 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f   be scanned befo
1d050 72 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  re this one */. 
1d060 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1d070 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le            /*
1d080 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73   Tables that mus
1d090 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74  t be scanned aft
1d0a0 65 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29  er this one */.)
1d0b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d0c0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1d0d0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1d0e0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
1d0f0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
1d100 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
1d110 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
1d120 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d140 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1d150 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
1d160 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
1d170 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1d180 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1d190 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1d1a0 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  tem *pSrc;   /* 
1d1b0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1d1c0 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
1d1d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  /.  sqlite3_inde
1d1e0 78 5f 69 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20  x_info *p;      
1d1f0 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 61   /* Object to pa
1d200 73 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ss to xBestIndex
1d210 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e  () */.  int nCon
1d220 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
1d230 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d240 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  f constraints in
1d250 20 70 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b   p */.  int bIn;
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1d280 70 6c 61 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e  plan uses IN(...
1d290 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  ) operator */.  
1d2a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
1d2b0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74  .  Bitmask mBest
1d2c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d2d0 2f 2a 20 54 61 62 6c 65 73 20 75 73 65 64 20 62  /* Tables used b
1d2e0 79 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20  y best possible 
1d2f0 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20 6d 4e  plan */.  u16 mN
1d300 6f 4f 6d 69 74 3b 0a 0a 20 20 61 73 73 65 72 74  oOmit;..  assert
1d310 28 20 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e  ( (mPrereq & mUn
1d320 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  usable)==0 );.  
1d330 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1d340 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61  r->pWInfo;.  pPa
1d350 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1d360 61 72 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42  arse;.  pWC = pB
1d370 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1d380 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1d390 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26  pNew;.  pSrc = &
1d3a0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1d3b0 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
1d3c0 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
1d3d0 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
1d3e0 20 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61   );.  p = alloca
1d3f0 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
1d400 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62  se, pWC, mUnusab
1d410 6c 65 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  le, pSrc, pBuild
1d420 65 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20  er->pOrderBy, . 
1d430 20 20 20 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a       &mNoOmit);.
1d440 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1d450 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1d460 5f 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72  _BKPT;.  pNew->r
1d470 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
1d480 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
1d490 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
1d4a0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
1d4b0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
1d4c0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1d4d0 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ;.  nConstraint 
1d4e0 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  = p->nConstraint
1d4f0 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
1d500 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
1d510 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
1d520 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71  raint) ){.    sq
1d530 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1d540 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20  se->db, p);.    
1d550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1d560 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
1d570 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 20 78   /* First call x
1d580 42 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68  BestIndex() with
1d590 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
1d5a0 20 75 73 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48   usable. */.  WH
1d5b0 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20  ERETRACE(0x800, 
1d5c0 28 22 42 45 47 49 4e 20 25 73 2e 61 64 64 56 69  ("BEGIN %s.addVi
1d5d0 72 74 75 61 6c 28 29 5c 6e 22 2c 20 70 53 72 63  rtual()\n", pSrc
1d5e0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1d5f0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
1d600 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1d610 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 5c 6e  ne: all usable\n
1d620 22 29 29 3b 0a 20 20 72 63 20 3d 20 77 68 65 72  "));.  rc = wher
1d630 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1d640 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  ne(pBuilder, mPr
1d650 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 30  ereq, ALLBITS, 0
1d660 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1d670 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  In);..  /* If th
1d680 65 20 63 61 6c 6c 20 74 6f 20 78 42 65 73 74 49  e call to xBestI
1d690 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20  ndex() with all 
1d6a0 74 65 72 6d 73 20 65 6e 61 62 6c 65 64 20 70 72  terms enabled pr
1d6b0 6f 64 75 63 65 64 20 61 20 70 6c 61 6e 0a 20 20  oduced a plan.  
1d6c0 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
1d6d0 20 72 65 71 75 69 72 65 20 61 6e 79 20 73 6f 75   require any sou
1d6e0 72 63 65 20 74 61 62 6c 65 73 20 28 49 4f 57 3a  rce tables (IOW:
1d6f0 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6d 42 65   a plan with mBe
1d700 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74 68 65  st==0),.  ** the
1d710 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  n there is no po
1d720 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67 20 61 6e  int in making an
1d730 79 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20  y further calls 
1d740 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1d750 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 79  .  ** since they
1d760 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74 75 72 6e   will all return
1d770 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1d780 20 28 69 66 20 74 68 65 20 78 42 65 73 74 49 6e   (if the xBestIn
1d790 64 65 78 28 29 0a 20 20 2a 2a 20 69 6d 70 6c 65  dex().  ** imple
1d7a0 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 73 61 6e  mentation is san
1d7b0 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  e). */.  if( rc=
1d7c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6d  =SQLITE_OK && (m
1d7d0 42 65 73 74 20 3d 20 28 70 4e 65 77 2d 3e 70 72  Best = (pNew->pr
1d7e0 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29  ereq & ~mPrereq)
1d7f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
1d800 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20  seenZero = 0;   
1d810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d820 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69 74 68  e if a plan with
1d830 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65 65 6e   no prereqs seen
1d840 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   */.    int seen
1d850 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20  ZeroNoIN = 0;   
1d860 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69        /* Plan wi
1d870 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 61 6e  th no prereqs an
1d880 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65  d no IN(...) see
1d890 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  n */.    Bitmask
1d8a0 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   mPrev = 0;.    
1d8b0 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49  Bitmask mBestNoI
1d8c0 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  n = 0;..    /* I
1d8d0 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f 64 75  f the plan produ
1d8e0 63 65 64 20 62 79 20 74 68 65 20 65 61 72 6c 69  ced by the earli
1d8f0 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61 6e 20  er call uses an 
1d900 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61  IN(...) term, ca
1d910 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73 74 49  ll.    ** xBestI
1d920 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68 69 73  ndex again, this
1d930 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e   time with IN(..
1d940 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62 6c 65  .) terms disable
1d950 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49  d. */.    if( bI
1d960 6e 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45  n ){.      WHERE
1d970 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1d980 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1d990 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22  usable w/o IN\n"
1d9a0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
1d9b0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1d9c0 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20  alOne(.         
1d9d0 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72   pBuilder, mPrer
1d9e0 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f  eq, ALLBITS, WO_
1d9f0 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20  IN, p, mNoOmit, 
1da00 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  &bIn);.      ass
1da10 65 72 74 28 20 62 49 6e 3d 3d 30 20 29 3b 0a 20  ert( bIn==0 );. 
1da20 20 20 20 20 20 6d 42 65 73 74 4e 6f 49 6e 20 3d       mBestNoIn =
1da30 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20   pNew->prereq & 
1da40 7e 6d 50 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ~mPrereq;.      
1da50 69 66 28 20 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30  if( mBestNoIn==0
1da60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   ){.        seen
1da70 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  Zero = 1;.      
1da80 20 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d    seenZeroNoIN =
1da90 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1daa0 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78  }..    /* Call x
1dab0 42 65 73 74 49 6e 64 65 78 20 6f 6e 63 65 20 66  BestIndex once f
1dac0 6f 72 20 65 61 63 68 20 64 69 73 74 69 6e 63 74  or each distinct
1dad0 20 76 61 6c 75 65 20 6f 66 20 28 70 72 65 72 65   value of (prere
1dae0 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65  qRight & ~mPrere
1daf0 71 29 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  q) .    ** in th
1db00 65 20 73 65 74 20 6f 66 20 74 65 72 6d 73 20 74  e set of terms t
1db10 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74 68 65  hat apply to the
1db20 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
1db30 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
1db40 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1db50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
1db60 74 20 69 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  t i;.      Bitma
1db70 73 6b 20 6d 4e 65 78 74 20 3d 20 41 4c 4c 42 49  sk mNext = ALLBI
1db80 54 53 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  TS;.      assert
1db90 28 20 6d 4e 65 78 74 3e 30 20 29 3b 0a 20 20 20  ( mNext>0 );.   
1dba0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1dbb0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
1dbc0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
1dbd0 20 6d 54 68 69 73 20 3d 20 28 0a 20 20 20 20 20   mThis = (.     
1dbe0 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 70 2d         pWC->a[p-
1dbf0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
1dc00 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65  iTermOffset].pre
1dc10 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65  reqRight & ~mPre
1dc20 72 65 71 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  req.        );. 
1dc30 20 20 20 20 20 20 20 69 66 28 20 6d 54 68 69 73         if( mThis
1dc40 3e 6d 50 72 65 76 20 26 26 20 6d 54 68 69 73 3c  >mPrev && mThis<
1dc50 6d 4e 65 78 74 20 29 20 6d 4e 65 78 74 20 3d 20  mNext ) mNext = 
1dc60 6d 54 68 69 73 3b 0a 20 20 20 20 20 20 7d 0a 20  mThis;.      }. 
1dc70 20 20 20 20 20 6d 50 72 65 76 20 3d 20 6d 4e 65       mPrev = mNe
1dc80 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e  xt;.      if( mN
1dc90 65 78 74 3d 3d 41 4c 4c 42 49 54 53 20 29 20 62  ext==ALLBITS ) b
1dca0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
1dcb0 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20  mNext==mBest || 
1dcc0 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e  mNext==mBestNoIn
1dcd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1dce0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1dcf0 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1dd00 6e 65 3a 20 6d 50 72 65 76 3d 25 30 34 6c 6c 78  ne: mPrev=%04llx
1dd10 20 6d 4e 65 78 74 3d 25 30 34 6c 6c 78 5c 6e 22   mNext=%04llx\n"
1dd20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dd30 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
1dd40 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 76 2c 20  3_uint64)mPrev, 
1dd50 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1dd60 6d 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 72  mNext));.      r
1dd70 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1dd80 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20  VirtualOne(.    
1dd90 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20        pBuilder, 
1dda0 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78 74 7c 6d  mPrereq, mNext|m
1ddb0 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e  Prereq, 0, p, mN
1ddc0 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1ddd0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 72      if( pNew->pr
1dde0 65 72 65 71 3d 3d 6d 50 72 65 72 65 71 20 29 7b  ereq==mPrereq ){
1ddf0 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1de00 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  o = 1;.        i
1de10 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e  f( bIn==0 ) seen
1de20 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20  ZeroNoIN = 1;.  
1de30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1de40 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73   /* If the calls
1de50 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1de60 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 6c 6f   in the above lo
1de70 6f 70 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  op did not find 
1de80 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68  a plan.    ** th
1de90 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73  at requires no s
1dea0 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61 74 20  ource tables at 
1deb0 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65 20 67 75  all (i.e. one gu
1dec0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 20  aranteed to be. 
1ded0 20 20 20 2a 2a 20 75 73 61 62 6c 65 29 2c 20 6d     ** usable), m
1dee0 61 6b 65 20 61 20 63 61 6c 6c 20 68 65 72 65 20  ake a call here 
1def0 77 69 74 68 20 61 6c 6c 20 73 6f 75 72 63 65 20  with all source 
1df00 74 61 62 6c 65 73 20 64 69 73 61 62 6c 65 64 20  tables disabled 
1df10 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1df20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e  QLITE_OK && seen
1df30 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Zero==0 ){.     
1df40 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1df50 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1df60 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 5c 6e  : all disabled\n
1df70 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "));.      rc = 
1df80 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1df90 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20  ualOne(.        
1dfa0 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65    pBuilder, mPre
1dfb0 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c  req, mPrereq, 0,
1dfc0 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49   p, mNoOmit, &bI
1dfd0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  n);.      if( bI
1dfe0 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e  n==0 ) seenZeroN
1dff0 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  oIN = 1;.    }..
1e000 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
1e010 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1e020 78 28 29 20 68 61 76 65 20 73 6f 20 66 61 72 20  x() have so far 
1e030 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61  failed to find a
1e040 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61   plan.    ** tha
1e050 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f  t requires no so
1e060 75 72 63 65 20 74 61 62 6c 65 73 20 61 74 20 61  urce tables at a
1e070 6c 6c 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ll and does not 
1e080 75 73 65 20 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20  use an IN(...). 
1e090 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2c 20     ** operator, 
1e0a0 6d 61 6b 65 20 61 20 66 69 6e 61 6c 20 63 61 6c  make a final cal
1e0b0 6c 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 20  l to obtain one 
1e0c0 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  here.  */.    if
1e0d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e0e0 26 26 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d  && seenZeroNoIN=
1e0f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52  =0 ){.      WHER
1e100 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1e110 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c   VirtualOne: all
1e120 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 77 2f   disabled and w/
1e130 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  o IN\n"));.     
1e140 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1e150 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1e160 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1e170 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72  , mPrereq, mPrer
1e180 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e  eq, WO_IN, p, mN
1e190 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1e1a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1e1b0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1e1c0 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
1e1d0 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  e(p->idxStr);.  
1e1e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
1e1f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1e200 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
1e210 30 30 2c 20 28 22 45 4e 44 20 25 73 2e 61 64 64  00, ("END %s.add
1e220 56 69 72 74 75 61 6c 28 29 2c 20 72 63 3d 25 64  Virtual(), rc=%d
1e230 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
1e240 3e 7a 4e 61 6d 65 2c 20 72 63 29 29 3b 0a 20 20  >zName, rc));.  
1e250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1e260 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1e270 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1e280 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68  */../*.** Add Wh
1e290 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20  ereLoop entries 
1e2a0 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72  to handle OR ter
1e2b0 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ms.  This works 
1e2c0 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74  for either.** bt
1e2d0 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20  rees or virtual 
1e2e0 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
1e2f0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1e300 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ddOr(.  WhereLoo
1e310 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1e320 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d  er, .  Bitmask m
1e330 50 72 65 72 65 71 2c 20 0a 20 20 42 69 74 6d 61  Prereq, .  Bitma
1e340 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a  sk mUnusable.){.
1e350 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1e360 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1e370 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43  pWInfo;.  WhereC
1e380 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
1e390 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1e3a0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1e3b0 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e  m, *pWCEnd;.  in
1e3c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e3d0 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
1e3e0 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70  WhereClause temp
1e3f0 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  WC;.  WhereLoopB
1e400 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64  uilder sSubBuild
1e410 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73  ;.  WhereOrSet s
1e420 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72  Sum, sCur;.  str
1e430 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e440 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57   *pItem;.  .  pW
1e450 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
1e460 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57  C;.  pWCEnd = pW
1e470 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
1e480 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  m;.  pNew = pBui
1e490 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65  lder->pNew;.  me
1e4a0 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73  mset(&sSum, 0, s
1e4b0 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20  izeof(sSum));.  
1e4c0 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
1e4d0 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
1e4e0 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72  ew->iTab;.  iCur
1e4f0 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
1e500 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  r;..  for(pTerm=
1e510 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
1e520 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
1e530 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
1e540 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
1e550 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e560 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
1e570 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1e580 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
1e590 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
1e5a0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
1e5b0 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
1e5c0 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
1e5d0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
1e5e0 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
1e5f0 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
1e600 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
1e610 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
1e620 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1e630 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
1e640 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
1e650 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
1e660 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
1e670 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
1e680 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
1e690 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1e6a0 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53    sSubBuild.pOrS
1e6b0 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20  et = &sCur;..   
1e6c0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1e6d0 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f  200, ("Begin pro
1e6e0 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1e6f0 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1e700 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ;.      for(pOrT
1e710 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
1e720 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
1e730 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
1e740 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
1e750 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1e760 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
1e770 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1e780 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
1e790 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
1e7a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1e7b0 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
1e7c0 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
1e7d0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1e7e0 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
1e7f0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
1e800 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
1e810 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
1e820 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
1e830 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
1e840 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
1e850 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1e860 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
1e870 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
1e880 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
1e890 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e8a0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1e8b0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1e8c0 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
1e8d0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
1e8e0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
1e8f0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1e900 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25  200, ("OR-term %
1e910 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73  d of %p has %d s
1e920 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20  ubterms:\n", .  
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e940 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70   (int)(pOrTerm-p
1e950 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c  OrWC->a), pTerm,
1e960 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e   sSubBuild.pWC->
1e970 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20  nTerm));.       
1e980 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
1e990 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  eTrace & 0x400 )
1e9a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1e9b0 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72  te3WhereClausePr
1e9c0 69 6e 74 28 73 53 75 62 42 75 69 6c 64 2e 70 57  int(sSubBuild.pW
1e9d0 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  C);.        }.#e
1e9e0 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
1e9f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1ea00 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66  TABLE.        if
1ea10 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
1ea20 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
1ea30 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1ea40 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26  LoopAddVirtual(&
1ea50 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72  sSubBuild, mPrer
1ea60 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1ea70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
1ea80 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
1ea90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1eaa0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1eab0 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65  &sSubBuild, mPre
1eac0 72 65 71 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  req);.        }.
1ead0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1eae0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eaf0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1eb00 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62  eLoopAddOr(&sSub
1eb10 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20  Build, mPrereq, 
1eb20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1eb30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1eb40 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1eb50 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30  _OK || sCur.n==0
1eb60 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1eb70 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  sCur.n==0 ){.   
1eb80 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
1eb90 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
1eba0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1ebb0 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20  e if( once ){.  
1ebc0 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
1ebd0 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72  ove(&sSum, &sCur
1ebe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
1ebf0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
1ec00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ec10 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76  WhereOrSet sPrev
1ec20 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  ;.          wher
1ec30 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20  eOrMove(&sPrev, 
1ec40 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  &sSum);.        
1ec50 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
1ec60 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1ec70 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29   i<sPrev.n; i++)
1ec80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
1ec90 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b  r(j=0; j<sCur.n;
1eca0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1ecb0 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
1ecc0 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e  rt(&sSum, sPrev.
1ecd0 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43  a[i].prereq | sC
1ece0 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a  ur.a[j].prereq,.
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1ed10 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
1ed20 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43  ev.a[i].rRun, sC
1ed30 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20  ur.a[j].rRun),. 
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1ed60 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1ed70 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75  v.a[i].nOut, sCu
1ed80 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20  r.a[j].nOut));. 
1ed90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1eda0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1edb0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1edc0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1edd0 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  1;.      pNew->a
1ede0 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
1edf0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
1ee00 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55  Flags = WHERE_MU
1ee10 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e  LTI_OR;.      pN
1ee20 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
1ee30 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
1ee40 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  tIdx = 0;.      
1ee50 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
1ee60 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
1ee70 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >u));.      for(
1ee80 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1ee90 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20  OK && i<sSum.n; 
1eea0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
1eeb0 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74   TUNING: Current
1eec0 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75  ly sSum.a[i].rRu
1eed0 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
1eee0 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73  sum of the costs
1eef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
1ef00 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71  ll sub-scans req
1ef10 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d  uired by the OR-
1ef20 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64  scan. However, d
1ef30 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20  ue to rounding. 
1ef40 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
1ef50 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74  , it may be that
1ef60 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
1ef70 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61   OR-scan is equa
1ef80 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20  l to its.       
1ef90 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69   ** most expensi
1efa0 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64  ve sub-scan. Add
1efb0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
1efc0 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a  ssible penalty .
1efd0 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69          ** (equi
1efe0 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70  valent to multip
1eff0 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62  lying the cost b
1f000 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72  y 1.07) to ensur
1f010 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  e that .        
1f020 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ** this does not
1f030 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69   happen. Otherwi
1f040 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c  se, for WHERE cl
1f050 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68  auses such as th
1f060 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c  e.        ** fol
1f070 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65  lowing where the
1f080 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
1f090 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a  n "y":.        *
1f0a0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  *.        **    
1f0b0 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f   WHERE likelihoo
1f0c0 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20  d(x=?, 0.99) OR 
1f0d0 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  y=?.        **. 
1f0e0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c         ** the pl
1f0f0 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20  anner may elect 
1f100 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72  to "OR" together
1f110 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63   a full-table sc
1f120 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  an and an.      
1f130 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75    ** index looku
1f140 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d  p. And other sim
1f150 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c  ilarly odd resul
1f160 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ts.  */.        
1f170 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75  pNew->rRun = sSu
1f180 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b  m.a[i].rRun + 1;
1f190 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
1f1a0 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Out = sSum.a[i].
1f1b0 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e  nOut;.        pN
1f1c0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75  ew->prereq = sSu
1f1d0 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20  m.a[i].prereq;. 
1f1e0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1f1f0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1f200 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1f210 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45     }.      WHERE
1f220 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45  TRACE(0x200, ("E
1f230 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  nd processing OR
1f240 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1f250 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Term));.    }.  
1f260 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f270 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
1f280 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1f290 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
1f2a0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
1f2b0 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
1f2c0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1f2d0 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
1f2e0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1f2f0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1f300 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  nfo;.  Bitmask m
1f310 50 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 42 69  Prereq = 0;.  Bi
1f320 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
1f330 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
1f340 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1f350 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
1f360 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
1f370 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1f380 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  em;.  struct Src
1f390 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20  List_item *pEnd 
1f3a0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
1f3b0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  WInfo->nLevel];.
1f3c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f3d0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
1f3e0 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
1f3f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
1f400 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75  eLoop *pNew;.  u
1f410 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20  8 priorJointype 
1f420 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  = 0;..  /* Loop 
1f430 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
1f440 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
1f450 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
1f460 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
1f470 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
1f480 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
1f490 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  );.  for(iTab=0,
1f4a0 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
1f4b0 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20  >a; pItem<pEnd; 
1f4c0 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  iTab++, pItem++)
1f4d0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55  {.    Bitmask mU
1f4e0 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  nusable = 0;.   
1f4f0 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54   pNew->iTab = iT
1f500 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61  ab;.    pNew->ma
1f510 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33  skSelf = sqlite3
1f520 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
1f530 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
1f540 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
1f550 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d  .    if( ((pItem
1f560 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72  ->fg.jointype|pr
1f570 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28  iorJointype) & (
1f580 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
1f590 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))!=0 ){.      /
1f5a0 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  * This condition
1f5b0 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 70 49   is true when pI
1f5c0 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20  tem is the FROM 
1f5d0 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74  clause term on t
1f5e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68  he.      ** righ
1f5f0 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61  t-hand-side of a
1f600 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
1f610 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d  OIN.  */.      m
1f620 50 72 65 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b  Prereq = mPrior;
1f630 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72  .    }.    prior
1f640 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d  Jointype = pItem
1f650 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23  ->fg.jointype;.#
1f660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f670 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1f680 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1f690 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
1f6a0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
1f6b0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a  rcList_item *p;.
1f6c0 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74        for(p=&pIt
1f6d0 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  em[1]; p<pEnd; p
1f6e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1f6f0 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70   mUnusable || (p
1f700 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
1f710 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
1f720 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  S)) ){.         
1f730 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71   mUnusable |= sq
1f740 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
1f750 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
1f760 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29  Set, p->iCursor)
1f770 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f780 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77    }.      rc = w
1f790 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1f7a0 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  al(pBuilder, mPr
1f7b0 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1f7c0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
1f7d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1f7e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
1f7f0 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63  /.    {.      rc
1f800 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
1f810 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  tree(pBuilder, m
1f820 50 72 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20  Prereq);.    }. 
1f830 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1f850 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f   = whereLoopAddO
1f860 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  r(pBuilder, mPre
1f870 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  req, mUnusable);
1f880 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f  .    }.    mPrio
1f890 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  r |= pNew->maskS
1f8a0 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20  elf;.    if( rc 
1f8b0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1f8c0 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  led ) break;.  }
1f8d0 0a 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ..  whereLoopCle
1f8e0 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ar(db, pNew);.  
1f8f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f900 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68  .** Examine a Wh
1f910 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68  erePath (with th
1f920 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68  e addition of th
1f930 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f  e extra WhereLoo
1f940 70 20 6f 66 20 74 68 65 20 36 74 68 0a 2a 2a 20  p of the 6th.** 
1f950 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73  parameters) to s
1f960 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73  ee if it outputs
1f970 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71   rows in the req
1f980 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a  uested ORDER BY.
1f990 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  ** (or GROUP BY)
1f9a0 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69   without requiri
1f9b0 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f  ng a separate so
1f9c0 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52  rt operation.  R
1f9d0 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20  eturn N:.** .** 
1f9e0 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73    N>0:   N terms
1f9f0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1fa00 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1fa10 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a  sfied.**   N==0:
1fa20 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68    No terms of th
1fa30 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1fa40 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
1fa50 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e  **   N<0:   Unkn
1fa60 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79  own yet how many
1fa70 20 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20   terms of ORDER 
1fa80 42 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69  BY might be sati
1fa90 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20  sfied.   .**.** 
1faa0 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73  Note that proces
1fab0 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47  sing for WHERE_G
1fac0 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45  ROUPBY and WHERE
1fad0 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e  _DISTINCTBY is n
1fae0 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e  ot as.** strict.
1faf0 20 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20    With GROUP BY 
1fb00 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65  and DISTINCT the
1fb10 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e   only requiremen
1fb20 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75  t is that.** equ
1fb30 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70  ivalent rows app
1fb40 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ear immediately 
1fb50 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20  adjacent to one 
1fb60 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20  another.  GROUP 
1fb70 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e  BY.** and DISTIN
1fb80 43 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72  CT do not requir
1fb90 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72  e rows to appear
1fba0 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c   in any particul
1fbb0 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67  ar order as long
1fbc0 0a 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e  .** as equivalen
1fbd0 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70  t rows are group
1fbe0 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68  ed together.  Th
1fbf0 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20  us for GROUP BY 
1fc00 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20  and DISTINCT.** 
1fc10 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72  the pOrderBy ter
1fc20 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65  ms can be matche
1fc30 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20  d in any order. 
1fc40 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20   With ORDER BY, 
1fc50 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79  the .** pOrderBy
1fc60 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d   terms must be m
1fc70 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74  atched in strict
1fc80 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f   left-to-right o
1fc90 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1fca0 69 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69  i8 wherePathSati
1fcb0 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20  sfiesOrderBy(.  
1fcc0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1fcd0 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  o,    /* The WHE
1fce0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
1fcf0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1fd00 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  y,   /* ORDER BY
1fd10 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20   or GROUP BY or 
1fd20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20  DISTINCT clause 
1fd30 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68  to check */.  Wh
1fd40 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
1fd50 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
1fd60 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f  Path to check */
1fd70 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
1fd80 73 2c 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52  s,       /* WHER
1fd90 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 5f 44 49  E_GROUPBY or _DI
1fda0 53 54 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44  STINCTBY or _ORD
1fdb0 45 52 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20  ERBY_LIMIT */.  
1fdc0 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20  u16 nLoop,      
1fdd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1fde0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50  of entries in pP
1fdf0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
1fe00 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61    WhereLoop *pLa
1fe10 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74  st,     /* Add t
1fe20 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  his WhereLoop to
1fe30 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74   the end of pPat
1fe40 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
1fe50 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73  Bitmask *pRevMas
1fe60 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61  k     /* OUT: Ma
1fe70 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  sk of WhereLoops
1fe80 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72   to run in rever
1fe90 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20  se order */.){. 
1fea0 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20   u8 revSet;     
1feb0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1fec0 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a  f rev is known *
1fed0 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20  /.  u8 rev;     
1fee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1fef0 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65  posite sort orde
1ff00 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78  r */.  u8 revIdx
1ff10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1ff20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72  Index sort order
1ff30 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
1ff40 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41  Distinct;   /* A
1ff50 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f  ll prior WhereLo
1ff60 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69  ops are order-di
1ff70 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64  stinct */.  u8 d
1ff80 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20  istinctColumns; 
1ff90 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1ffa0 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45   loop has UNIQUE
1ffb0 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
1ffc0 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63  s */.  u8 isMatc
1ffd0 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
1ffe0 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20  iColumn matches 
1fff0 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  a term of the OR
20000 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
20010 0a 20 20 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b  .  u16 eqOpMask;
20020 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
20030 77 65 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  wed equality ope
20040 72 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20  rators */.  u16 
20050 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
20060 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b    /* Number of k
20070 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49  ey columns in pI
20080 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43  ndex */.  u16 nC
20090 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
200a0 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
200b0 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d  of ordered colum
200c0 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
200d0 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42  */.  u16 nOrderB
200e0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
200f0 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68  mber terms in th
20100 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
20110 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  e */.  int iLoop
20120 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
20130 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f  Index of WhereLo
20140 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e  op in pPath bein
20150 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  g processed */. 
20160 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
20170 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
20180 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
20190 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
201a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
201b0 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ber for current 
201c0 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69  WhereLoop */.  i
201d0 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
201e0 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
201f0 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
20200 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57  able iCur */.  W
20210 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
20220 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  = 0; /* Current 
20230 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20  WhereLoop being 
20240 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20  processed. */.  
20250 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
20260 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c  ;     /* A singl
20270 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
20280 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
20290 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20  Expr *pOBExpr;  
202a0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
202b0 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
202c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
202d0 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
202e0 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f  oll;       /* CO
202f0 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66  LLATE function f
20300 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20  rom an ORDER BY 
20310 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
20320 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
20330 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
20340 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
20350 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73  ith pLoop */.  s
20360 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
20370 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
20380 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
20390 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  nnection */.  Bi
203a0 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b  tmask obSat = 0;
203b0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f      /* Mask of O
203c0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61  RDER BY terms sa
203d0 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a  tisfied so far *
203e0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f  /.  Bitmask obDo
203f0 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ne;       /* Mas
20400 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  k of all ORDER B
20410 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  Y terms */.  Bit
20420 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e  mask orderDistin
20430 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b  ctMask;  /* Mask
20440 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64   of all well-ord
20450 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  ered loops */.  
20460 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20  Bitmask ready;  
20470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
20480 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f  ask of inner loo
20490 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ps */..  /*.  **
204a0 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
204b0 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f  eLoop is "one-ro
204c0 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74  w" if it generat
204d0 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  es no more than 
204e0 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  one.  ** row of 
204f0 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65  output.  A Where
20500 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20  Loop is one-row 
20510 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
20520 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
20530 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20  :.  **  (a) All 
20540 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61  index columns ma
20550 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43  tch with WHERE_C
20560 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20  OLUMN_EQ..  **  
20570 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73  (b) The index is
20580 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79   unique.  ** Any
20590 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
205a0 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  an WHERE_COLUMN_
205b0 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  EQ constraint on
205c0 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e   the rowid is on
205d0 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72  e-row..  ** Ever
205e0 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
205f0 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68  oop will have th
20600 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62  e WHERE_ONEROW b
20610 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67  it set in wsFlag
20620 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  s..  **.  ** We 
20630 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
20640 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74  p is "order-dist
20650 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74  inct" if the set
20660 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d   of columns from
20670 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65  .  ** that Where
20680 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e  Loop that are in
20690 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
206a0 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65  ause are differe
206b0 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a  nt for every.  *
206c0 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65  * row of the Whe
206d0 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f  reLoop.  Every o
206e0 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
206f0 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
20700 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73  y.  ** order-dis
20710 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65  tinct.   A Where
20720 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f  Loop that has no
20730 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
20740 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
20750 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65    ** is not orde
20760 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62  r-distinct. To b
20770 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
20780 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68   is not quite th
20790 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a  e same as being.
207a0 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63    ** UNIQUE sinc
207b0 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d  e a UNIQUE colum
207c0 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68  n or index can h
207d0 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ave multiple row
207e0 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65  s that .  ** are
207f0 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76   NULL and NULL v
20800 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61  alues are equiva
20810 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  lent for the pur
20820 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69  pose of order-di
20830 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20  stinct..  ** To 
20840 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
20850 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d  t, the columns m
20860 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e  ust be UNIQUE an
20870 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  d NOT NULL..  **
20880 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  .  ** The rowid 
20890 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61  for a table is a
208a0 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64  lways UNIQUE and
208b0 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65   NOT NULL so whe
208c0 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72  never the.  ** r
208d0 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20  owid appears in 
208e0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
208f0 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  use, the corresp
20900 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  onding WhereLoop
20910 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74   is.  ** automat
20920 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73  ically order-dis
20930 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61  tinct..  */..  a
20940 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
20950 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f  =0 );.  if( nLoo
20960 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
20970 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
20980 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
20990 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
209a0 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ..  nOrderBy = p
209b0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
209c0 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64    testcase( nOrd
209d0 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  erBy==BMS-1 );. 
209e0 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d   if( nOrderBy>BM
209f0 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  S-1 ) return 0; 
20a00 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d   /* Cannot optim
20a10 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65  ize overly large
20a20 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20   ORDER BYs */.  
20a30 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
20a40 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20  = 1;.  obDone = 
20a50 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79  MASKBIT(nOrderBy
20a60 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74  )-1;.  orderDist
20a70 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  inctMask = 0;.  
20a80 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f  ready = 0;.  eqO
20a90 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20  pMask = WO_EQ | 
20aa0 57 4f 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c  WO_IS | WO_ISNUL
20ab0 4c 3b 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c  L;.  if( wctrlFl
20ac0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
20ad0 52 42 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70  RBY_LIMIT ) eqOp
20ae0 4d 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20  Mask |= WO_IN;. 
20af0 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73   for(iLoop=0; is
20b00 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26  OrderDistinct &&
20b10 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26   obSat<obDone &&
20b20 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69   iLoop<=nLoop; i
20b30 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Loop++){.    if(
20b40 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79   iLoop>0 ) ready
20b50 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
20b60 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f  elf;.    if( iLo
20b70 6f 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20  op<nLoop ){.    
20b80 20 20 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d    pLoop = pPath-
20b90 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
20ba0 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c       if( wctrlFl
20bb0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
20bc0 52 42 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74  RBY_LIMIT ) cont
20bd0 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  inue;.    }else{
20be0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  .      pLoop = p
20bf0 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Last;.    }.    
20c00 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
20c10 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
20c20 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ALTABLE ){.     
20c30 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74   if( pLoop->u.vt
20c40 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f  ab.isOrdered ) o
20c50 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20  bSat = obDone;. 
20c60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f  }else{.      pLo
20c80 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78  op->u.btree.nIdx
20c90 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Col = 0;.    }. 
20ca0 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
20cb0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
20cc0 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
20cd0 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
20ce0 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
20cf0 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
20d00 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
20d10 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
20d20 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
20d30 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
20d40 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
20d50 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
20d60 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
20d70 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
20d80 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
20d90 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
20da0 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
20db0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20dc0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
20dd0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
20de0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
20df0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
20e00 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
20e10 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
20e20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
20e30 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
20e40 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
20e50 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
20e60 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
20e70 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
20e80 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
20e90 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71        pTerm = sq
20ea0 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
20eb0 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
20ec0 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
20ed0 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 7e 72 65 61 64 79 2c 20 65 71 4f 70 4d 61 73 6b  ~ready, eqOpMask
20f00 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
20f10 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
20f20 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
20f30 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
20f40 3d 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20  =WO_IN ){.      
20f50 20 20 2f 2a 20 49 4e 20 74 65 72 6d 73 20 61 72    /* IN terms ar
20f60 65 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72  e only valid for
20f70 20 73 6f 72 74 69 6e 67 20 69 6e 20 74 68 65 20   sorting in the 
20f80 4f 52 44 45 52 20 42 59 20 4c 49 4d 49 54 20 0a  ORDER BY LIMIT .
20f90 20 20 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d          ** optim
20fa0 69 7a 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65  ization, and the
20fb0 6e 20 6f 6e 6c 79 20 69 66 20 74 68 65 79 20 61  n only if they a
20fc0 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64  re actually used
20fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 74  .        ** by t
20fe0 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f  he query plan */
20ff0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21000 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
21010 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
21020 54 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  T );.        for
21030 28 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e  (j=0; j<pLoop->n
21040 4c 54 65 72 6d 20 26 26 20 70 54 65 72 6d 21 3d  LTerm && pTerm!=
21050 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
21060 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; j++){}.       
21070 20 69 66 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e   if( j>=pLoop->n
21080 4c 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65  LTerm ) continue
21090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
210a0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
210b0 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f  rator&(WO_EQ|WO_
210c0 49 53 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78  IS))!=0 && pOBEx
210d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  pr->iColumn>=0 )
210e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
210f0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
21100 4d 61 74 63 68 28 70 57 49 6e 66 6f 2d 3e 70 50  Match(pWInfo->pP
21110 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
21120 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
21130 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  y->a[i].pExpr, p
21140 54 65 72 6d 2d 3e 70 45 78 70 72 29 3d 3d 30 20  Term->pExpr)==0 
21150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
21160 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
21170 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
21180 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
21190 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
211a0 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
211b0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
211c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
211d0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
211e0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
211f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
21200 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
21210 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
21220 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
21230 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  ;.        nKeyCo
21240 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
21250 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
21260 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e    }else if( (pIn
21270 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
21280 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20  tree.pIndex)==0 
21290 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  || pIndex->bUnor
212a0 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
212b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
212c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
212d0 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nKeyCol = pIndex
212e0 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
212f0 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
21300 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
21310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
21320 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31  olumn==nKeyCol+1
21330 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
21340 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b  ndex->pTable) );
21350 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21360 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
21370 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e  n[nColumn-1]==XN
21380 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20  _ROWID.         
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
213b0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a  ndex->pTable));.
213c0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
213d0 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71  istinct = IsUniq
213e0 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  ueIndex(pIndex);
213f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21400 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
21410 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
21420 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
21430 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
21440 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
21450 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
21460 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
21470 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
21480 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
21490 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
214a0 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
214b0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c   for(j=0; j<nCol
214c0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
214d0 20 20 20 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b     u8 bOnce = 1;
214e0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
214f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
21500 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
21510 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e 3d       assert( j>=
21520 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
21530 45 71 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Eq .            
21540 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  || (pLoop->aLTer
21550 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f  m[j]==0)==(j<pLo
21560 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20  op->nSkip).     
21570 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
21580 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
21590 65 65 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f  ee.nEq && j>=pLo
215a0 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20  op->nSkip ){.   
215b0 20 20 20 20 20 20 20 75 31 36 20 65 4f 70 20 3d         u16 eOp =
215c0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
215d0 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20  ]->eOperator;.. 
215e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
215f0 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20   over == and IS 
21600 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73  and ISNULL terms
21610 2e 20 20 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e  .  (Also skip IN
21620 20 74 65 72 6d 73 20 77 68 65 6e 0a 20 20 20 20   terms when.    
21630 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57        ** doing W
21640 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
21650 49 54 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 20  IT processing). 
21660 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
21670 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
21680 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
21690 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  s a column of an
216a0 20 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45   ((?,?) IN (SELE
216b0 43 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20 20  CT...)) .       
216c0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
216d0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 53   for which the S
216e0 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 6d 6f  ELECT returns mo
216f0 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
21700 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mn,.          **
21710 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69   check that it i
21720 73 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d  s the only colum
21730 6e 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6c  n used by this l
21740 6f 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  oop. Otherwise,.
21750 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20            ** if 
21760 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f  it is one of two
21770 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f   or more, none o
21780 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61  f the columns ca
21790 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  n be.          *
217a0 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  * considered to 
217b0 6d 61 74 63 68 20 61 6e 20 4f 52 44 45 52 20 42  match an ORDER B
217c0 59 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  Y term.  */.    
217d0 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26        if( (eOp &
217e0 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b   eqOpMask)!=0 ){
217f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21800 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
21810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21820 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
21830 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  derDistinct );. 
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21850 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
21860 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
21870 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
21880 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
21890 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
218a0 59 53 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  YS(eOp & WO_IN) 
218b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
218c0 2a 20 41 4c 57 41 59 53 28 29 20 6a 75 73 74 69  * ALWAYS() justi
218d0 66 69 63 61 74 69 6f 6e 3a 20 65 4f 70 20 69 73  fication: eOp is
218e0 20 61 6e 20 65 71 75 61 6c 69 74 79 20 6f 70 65   an equality ope
218f0 72 61 74 6f 72 20 64 75 65 20 74 6f 20 74 68 65  rator due to the
21900 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21910 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
21920 2e 6e 45 71 20 63 6f 6e 73 74 72 61 69 6e 74 20  .nEq constraint 
21930 61 62 6f 76 65 2e 20 20 41 6e 79 20 65 71 75 61  above.  Any equa
21940 6c 69 74 79 20 6f 74 68 65 72 0a 20 20 20 20 20  lity other.     
21950 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 57         ** than W
21960 4f 5f 49 4e 20 69 73 20 63 61 70 74 75 72 65 64  O_IN is captured
21970 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
21980 20 22 69 66 22 2e 20 20 53 6f 20 74 68 69 73 20   "if".  So this 
21990 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  one.            
219a0 2a 2a 20 61 6c 77 61 79 73 20 68 61 73 20 74 6f  ** always has to
219b0 20 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20   be WO_IN. */.  
219c0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
219d0 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  pX = pLoop->aLTe
219e0 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20  rm[j]->pExpr;.  
219f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
21a00 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e  j+1; i<pLoop->u.
21a10 62 74 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b  btree.nEq; i++){
21a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21a30 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  f( pLoop->aLTerm
21a40 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29  [i]->pExpr==pX )
21a50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21a60 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
21a70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70  ->aLTerm[i]->eOp
21a80 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20  erator & WO_IN) 
21a90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
21aa0 20 20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20     bOnce = 0;.  
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
21ac0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
21ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
21ae0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
21af0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21b00 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c    /* Get the col
21b10 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  umn number in th
21b20 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e  e table (iColumn
21b30 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72  ) and sort order
21b40 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76  .        ** (rev
21b50 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74  Idx) for the j-t
21b60 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
21b70 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
21b80 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
21b90 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
21ba0 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
21bb0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
21bc0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
21bd0 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
21be0 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
21bf0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
21c00 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
21c10 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
21c20 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20  n = XN_ROWID;.  
21c30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21c40 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
21c50 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20   XN_ROWID;.     
21c60 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b       revIdx = 0;
21c70 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
21c80 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73      /* An uncons
21c90 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74  trained column t
21ca0 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  hat might be NUL
21cb0 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  L means that thi
21cc0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65  s.        ** Whe
21cd0 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65  reLoop is not we
21ce0 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20  ll-ordered.     
21cf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
21d00 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
21d10 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43  t.         && iC
21d20 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20  olumn>=0.       
21d30 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75    && j>=pLoop->u
21d40 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
21d50 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70      && pIndex->p
21d60 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
21d70 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a  umn].notNull==0.
21d80 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
21d90 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
21da0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
21db0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
21dc0 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42  Find the ORDER B
21dd0 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72  Y term that corr
21de0 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a  esponds to the j
21df0 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20  -th column.     
21e00 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64     ** of the ind
21e10 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74  ex and mark that
21e20 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f   ORDER BY term o
21e30 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ff .        */. 
21e40 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
21e50 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
21e60 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c  i=0; bOnce && i<
21e70 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
21e80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41            if( MA
21e90 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
21ea0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21eb0 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d         pOBExpr =
21ec0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
21ed0 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
21ee0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
21ef0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
21f00 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
21f10 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b  WHERE_GROUPBY );
21f20 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
21f30 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
21f40 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
21f50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
21f60 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
21f70 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59  & (WHERE_GROUPBY
21f80 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42  |WHERE_DISTINCTB
21f90 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d  Y))==0 ) bOnce =
21fa0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
21fb0 28 20 69 43 6f 6c 75 6d 6e 3e 3d 58 4e 5f 52 4f  ( iColumn>=XN_RO
21fc0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  WID ){.         
21fd0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
21fe0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
21ff0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22000 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
22010 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
22020 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22030 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
22040 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  xpr->iColumn!=iC
22050 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
22060 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
22070 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  e{.            E
22080 78 70 72 20 2a 70 49 64 78 45 78 70 72 20 3d 20  xpr *pIdxExpr = 
22090 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
220a0 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[j].pExpr;.  
220b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
220c0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
220d0 53 6b 69 70 28 70 4f 42 45 78 70 72 2c 20 70 49  Skip(pOBExpr, pI
220e0 64 78 45 78 70 72 2c 20 69 43 75 72 29 20 29 7b  dxExpr, iCur) ){
220f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
22100 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
22110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22120 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
22130 20 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 52 4f 57   iColumn!=XN_ROW
22140 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ID ){.          
22150 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
22160 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70  3ExprNNCollSeq(p
22170 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
22180 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
22190 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
221a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
221b0 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
221c0 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  e, pIndex->azCol
221d0 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69  l[j])!=0 ) conti
221e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
221f0 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  .          pLoop
22200 2d 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f  ->u.btree.nIdxCo
22210 6c 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20  l = j+1;.       
22220 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a     isMatch = 1;.
22230 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22240 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22250 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26     if( isMatch &
22260 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
22270 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d  WHERE_GROUPBY)==
22280 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
22290 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
222a0 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f  sort order is co
222b0 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f  mpatible in an O
222c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
222d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72            ** Sor
222e0 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c  t order is irrel
222f0 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55  evant for a GROU
22300 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a  P BY clause. */.
22310 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
22320 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  vSet ){.        
22330 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72      if( (rev ^ r
22340 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79  evIdx)!=pOrderBy
22350 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
22360 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a   ) isMatch = 0;.
22370 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
22380 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76  .            rev
22390 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64   = revIdx ^ pOrd
223a0 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
223b0 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rder;.          
223c0 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65    if( rev ) *pRe
223d0 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  vMask |= MASKBIT
223e0 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  (iLoop);.       
223f0 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b       revSet = 1;
22400 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
22420 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20  f( isMatch ){.  
22430 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
22440 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 7b  umn==XN_ROWID ){
22450 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
22460 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43  tcase( distinctC
22470 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20  olumns==0 );.   
22480 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
22490 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20  tColumns = 1;.  
224a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
224b0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
224c0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
224d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
224e0 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f    /* No match fo
224f0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
22500 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e   if( j==0 || j<n
22510 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
22520 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22530 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21  isOrderDistinct!
22540 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
22550 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
22560 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
22570 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
22580 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
22590 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f      } /* end Loo
225a0 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78  p over all index
225b0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
225c0 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f    if( distinctCo
225d0 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20  lumns ){.       
225e0 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
225f0 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  erDistinct==0 );
22600 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
22610 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
22620 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65      }.    } /* e
22630 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f  nd-if not one-ro
22640 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  w */..    /* Mar
22650 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20  k off any other 
22660 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
22670 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c  hat reference pL
22680 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  oop */.    if( i
22690 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
226a0 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73  {.      orderDis
226b0 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f  tinctMask |= pLo
226c0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
226d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
226e0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
226f0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a         Expr *p;.
22700 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
22710 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  mTerm;.        i
22720 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
22730 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
22740 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f  ;.        p = pO
22750 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
22760 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72  pr;.        mTer
22770 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
22780 45 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66  ExprUsage(&pWInf
22790 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a  o->sMaskSet,p);.
227a0 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72          if( mTer
227b0 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  m==0 && !sqlite3
227c0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
227d0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
227e0 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d        if( (mTerm
227f0 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  &~orderDistinctM
22800 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
22810 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
22820 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
22830 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22840 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65  }.  } /* End the
22850 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57   loop over all W
22860 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f  hereLoops from o
22870 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74  uter-most down t
22880 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a  o inner-most */.
22890 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44    if( obSat==obD
228a0 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38  one ) return (i8
228b0 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  )nOrderBy;.  if(
228c0 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
228d0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  t ){.    for(i=n
228e0 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20  OrderBy-1; i>0; 
228f0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i--){.      Bitm
22900 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28  ask m = MASKBIT(
22910 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66  i) - 1;.      if
22920 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29  ( (obSat&m)==m )
22930 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d   return i;.    }
22940 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
22950 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
22960 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
22970 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
22980 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68  lag is set in th
22990 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f  e mask passed to
229a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
229b0 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61  in(),.** the pla
229c0 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61  nner assumes tha
229d0 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  t the specified 
229e0 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73  pOrderBy list is
229f0 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55   actually a GROU
22a00 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d  P.** BY clause -
22a10 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65   and so any orde
22a20 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f  r that groups ro
22a30 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73  ws as required s
22a40 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20  atisfies the.** 
22a50 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e  request..**.** N
22a60 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73  ormally, in this
22a70 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
22a80 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
22a90 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72   caller to deter
22aa0 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20  mine.** whether 
22ab0 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20  or not the rows 
22ac0 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67  are really being
22ad0 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f   delivered in so
22ae0 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a  rted order, or.*
22af0 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f  * just in some o
22b00 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20  ther order that 
22b10 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71  provides the req
22b20 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20  uired grouping. 
22b30 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74  However,.** if t
22b40 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47  he WHERE_SORTBYG
22b50 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73  ROUP flag is als
22b60 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  o passed to sqli
22b70 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
22b80 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   then.** this fu
22b90 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
22ba0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75  lled on the retu
22bb0 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f  rned WhereInfo o
22bc0 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e  bject. It return
22bd0 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  s.** true if the
22be0 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c   rows really wil
22bf0 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74  l be sorted in t
22c00 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64  he specified ord
22c10 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20  er, or false.** 
22c20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
22c30 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
22c40 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  suming:.**.**   
22c50 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
22c60 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a  ON t1(x, Y);.**.
22c70 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20  ** then.**.**   
22c80 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
22c90 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52   GROUP BY x,y OR
22ca0 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d  DER BY x,y;   --
22cb0 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a   IsSorted()==1.*
22cc0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
22cd0 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c  M t1 GROUP BY y,
22ce0 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20  x ORDER BY y,x; 
22cf0 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
22d00 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  =0.*/.int sqlite
22d10 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57  3WhereIsSorted(W
22d20 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
22d30 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  ){.  assert( pWI
22d40 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
22d50 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
22d60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  );.  assert( pWI
22d70 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
22d80 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  & WHERE_SORTBYGR
22d90 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  OUP );.  return 
22da0 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a  pWInfo->sorted;.
22db0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
22dc0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
22dd0 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
22de0 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
22df0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
22e00 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
22e10 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
22e20 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
22e30 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
22e40 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
22e50 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
22e60 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
22e70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
22e80 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
22e90 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
22ea0 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
22eb0 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
22ec0 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
22ed0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
22ee0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
22ef0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73  * Return the cos
22f00 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
22f10 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67  w rows, assuming
22f20 20 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68   that the keys h
22f30 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79  ave .** nOrderby
22f40 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61   columns and tha
22f50 74 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72  t the first nSor
22f60 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
22f70 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72  already in.** or
22f80 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  der..*/.static L
22f90 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69  ogEst whereSorti
22fa0 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49  ngCost(.  WhereI
22fb0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c  nfo *pWInfo,.  L
22fc0 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e  ogEst nRow,.  in
22fd0 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e  t nOrderBy,.  in
22fe0 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f  t nSorted.){.  /
22ff0 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61  * TUNING: Estima
23000 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75  ted cost of a fu
23010 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74  ll external sort
23020 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20  , where N is .  
23030 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
23040 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73   rows to sort is
23050 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
23060 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
23070 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20  log(N))..  ** . 
23080 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f   ** Or, if the o
23090 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68  rder-by clause h
230a0 61 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f  as X terms but o
230b0 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a  nly the last Y .
230c0 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f    ** terms are o
230d0 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65  ut of order, the
230e0 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20  n block-sorting 
230f0 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20  will reduce the 
23100 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f  .  ** sorting co
23110 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  st to:.  **.  **
23120 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
23130 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28   N * log(N)) * (
23140 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  Y/X).  **.  ** T
23150 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73  he (Y/X) term is
23160 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
23170 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  ng stack variabl
23180 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65  e rScale.  ** be
23190 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73  low.  */.  LogEs
231a0 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43  t rScale, rSortC
231b0 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ost;.  assert( n
231c0 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d  OrderBy>0 && 66=
231d0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
231e0 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20  00) );.  rScale 
231f0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
23200 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65  (nOrderBy-nSorte
23210 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29  d)*100/nOrderBy)
23220 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f   - 66;.  rSortCo
23230 73 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61  st = nRow + rSca
23240 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d  le + 16;..  /* M
23250 75 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d  ultiple by log(M
23260 29 20 77 68 65 72 65 20 4d 20 69 73 20 74 68 65  ) where M is the
23270 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
23280 74 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65  t rows..  ** Use
23290 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d   the LIMIT for M
232a0 20 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65   if it is smalle
232b0 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e  r */.  if( (pWIn
232c0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
232d0 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
232e0 29 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e  )!=0 && pWInfo->
232f0 69 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20  iLimit<nRow ){. 
23300 20 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f     nRow = pWInfo
23310 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  ->iLimit;.  }.  
23320 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74  rSortCost += est
23330 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74  Log(nRow);.  ret
23340 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d  urn rSortCost;.}
23350 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
23360 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
23370 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70  oop objects at p
23380 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74  WInfo->pLoops, t
23390 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
233a0 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
233b0 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
233c0 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73  path that visits
233d0 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a   each WhereLoop.
233e0 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70  ** once.  This p
233f0 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64  ath is then load
23400 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e  ed into the pWIn
23410 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66  fo->a[].pWLoop f
23420 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73  ields..**.** Ass
23430 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74  ume that the tot
23440 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  al number of out
23450 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69  put rows that wi
23460 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f  ll need to be so
23470 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  rted.** will be 
23480 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20  nRowEst (in the 
23490 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e  10*log2 represen
234a0 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67  tation).  Or, ig
234b0 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  nore sorting.** 
234c0 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74  costs if nRowEst
234d0 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ==0..**.** Retur
234e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
234f0 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45  uccess or SQLITE
23500 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f  _NOMEM of a memo
23510 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
23520 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
23530 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
23540 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65  rePathSolver(Whe
23550 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
23560 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b  LogEst nRowEst){
23570 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b  .  int mxChoice;
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23590 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
235a0 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70  f simultaneous p
235b0 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a  aths tracked */.
235c0 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20    int nLoop;    
235d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
235e0 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
235f0 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
23600 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
23610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
23620 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
23630 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
23640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23650 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
23660 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
23670 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  iLoop;          
23680 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
23690 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74  unter over the t
236a0 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  erms of the join
236b0 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a   */.  int ii, jj
236c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
236d0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
236e0 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20   */.  int mxI = 
236f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
23700 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
23710 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63   entry to replac
23720 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
23730 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rBy;            
23740 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
23750 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
23760 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  rms */.  LogEst 
23770 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20  mxCost = 0;     
23780 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
23790 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
237a0 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  aths */.  LogEst
237b0 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b   mxUnsorted = 0;
237c0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75      /* Maximum u
237d0 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20  nsorted cost of 
237e0 61 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f  a set of path */
237f0 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
23800 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
23810 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
23820 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
23830 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
23840 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
23850 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
23860 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
23870 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
23880 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
23890 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
238a0 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
238b0 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
238c0 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
238d0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
238e0 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
238f0 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
23900 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
23910 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
23920 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
23930 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
23940 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
23950 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
23960 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
23970 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
23980 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
23990 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
239a0 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
239b0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
239c0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
239d0 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
239e0 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
239f0 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74  .  LogEst *aSort
23a00 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Cost = 0;    /* 
23a10 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74  Sorting and part
23a20 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74  ial sorting cost
23a30 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  s */.  char *pSp
23a40 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
23a50 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65   /* Temporary me
23a60 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69  mory used by thi
23a70 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  s routine */.  i
23a80 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20  nt nSpace;      
23a90 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
23aa0 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
23ab0 61 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a  ated at pSpace *
23ac0 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
23ad0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
23ae0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
23af0 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  .  nLoop = pWInf
23b00 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20  o->nLevel;.  /* 
23b10 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70  TUNING: For simp
23b20 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79  le queries, only
23b30 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69   the best path i
23b40 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20  s tracked..  ** 
23b50 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c  For 2-way joins,
23b60 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68   the 5 best path
23b70 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a  s are followed..
23b80 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f    ** For joins o
23b90 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c  f 3 or more tabl
23ba0 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30  es, track the 10
23bb0 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20   best paths */. 
23bc0 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f   mxChoice = (nLo
23bd0 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c  op<=1) ? 1 : (nL
23be0 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29  oop==2 ? 5 : 10)
23bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f  ;.  assert( nLoo
23c00 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  p<=pWInfo->pTabL
23c10 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57  ist->nSrc );.  W
23c20 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
23c30 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f   ("---- begin so
23c40 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d  lver.  (nRowEst=
23c50 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29  %d)\n", nRowEst)
23c60 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77  );..  /* If nRow
23c70 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20  Est is zero and 
23c80 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
23c90 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e  R BY clause, ign
23ca0 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a  ore it. In this.
23cb0 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75    ** case the pu
23cc0 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
23cd0 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74  ll is to estimat
23ce0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
23cf0 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20  rows returned.  
23d00 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c  ** by the overal
23d10 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68  l query. Once th
23d20 69 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20  is estimate has 
23d30 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74  been obtained, t
23d40 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77  he caller.  ** w
23d50 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  ill invoke this 
23d60 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e  function a secon
23d70 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20  d time, passing 
23d80 74 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20  the estimate as 
23d90 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74  the.  ** nRowEst
23da0 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a   parameter.  */.
23db0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
23dc0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f  rderBy==0 || nRo
23dd0 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  wEst==0 ){.    n
23de0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
23df0 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72  else{.    nOrder
23e00 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  By = pWInfo->pOr
23e10 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
23e20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
23e30 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
23e40 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61  space for aTo, a
23e50 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f  From and aSortCo
23e60 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65  st[] */.  nSpace
23e70 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65   = (sizeof(Where
23e80 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65  Path)+sizeof(Whe
23e90 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a  reLoop*)*nLoop)*
23ea0 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53  mxChoice*2;.  nS
23eb0 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c  pace += sizeof(L
23ec0 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42  ogEst) * nOrderB
23ed0 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71  y;.  pSpace = sq
23ee0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
23ef0 4e 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a  NN(db, nSpace);.
23f00 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
23f10 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
23f20 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54  NOMEM_BKPT;.  aT
23f30 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
23f40 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
23f50 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
23f60 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
23f70 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
23f80 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
23f90 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
23fa0 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
23fb0 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
23fc0 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
23fd0 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
23fe0 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
23ff0 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
24000 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = pX;.  }.  if( 
24010 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
24020 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
24030 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
24040 65 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  e and it is not 
24050 62 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73  being ignored, s
24060 65 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61  et up.    ** spa
24070 63 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74  ce for the aSort
24080 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61  Cost[] array. Ea
24090 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ch element of th
240a0 65 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61  e aSortCost arra
240b0 79 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  y.    ** is eith
240c0 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e  er zero - meanin
240d0 67 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74  g it has not yet
240e0 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
240f0 64 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  d - or the.    *
24100 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  * cost of sortin
24110 67 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f  g nRowEst rows o
24120 66 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65  f data where the
24130 20 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f   first X terms o
24140 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44  f.    ** the ORD
24150 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
24160 20 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65   already in orde
24170 72 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68  r, where X is th
24180 65 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20  e array .    ** 
24190 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61  index.  */.    a
241a0 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45  SortCost = (LogE
241b0 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73  st*)pX;.    mems
241c0 65 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c  et(aSortCost, 0,
241d0 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20   sizeof(LogEst) 
241e0 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  * nOrderBy);.  }
241f0 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74  .  assert( aSort
24200 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61  Cost==0 || &pSpa
24210 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61  ce[nSpace]==(cha
24220 72 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f  r*)&aSortCost[nO
24230 72 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73  rderBy] );.  ass
24240 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d  ert( aSortCost!=
24250 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
24260 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20  ace]==(char*)pX 
24270 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68  );..  /* Seed th
24280 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
24290 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
242a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
242b0 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a   WhereLoops..  *
242c0 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44  *.  ** TUNING: D
242d0 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75  o not let the nu
242e0 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
242f0 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20  ns go above 28. 
24300 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a   If the cost.  *
24310 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  * of computing a
24320 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
24330 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61  x is not paid ba
24340 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ck within the fi
24350 72 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73  rst 28.  ** rows
24360 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73  , then do not us
24370 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
24380 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f  index. */.  aFro
24390 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28  m[0].nRow = MIN(
243a0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
243b0 6f 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74  op, 48);  assert
243c0 28 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 48==sqlite3Log
243d0 45 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72  Est(28) );.  nFr
243e0 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  om = 1;.  assert
243f0 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64  ( aFrom[0].isOrd
24400 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ered==0 );.  if(
24410 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   nOrderBy ){.   
24420 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20   /* If nLoop is 
24430 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65  zero, then there
24440 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72   are no FROM ter
24450 6d 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  ms in the query.
24460 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e   Since.    ** in
24470 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71   this case the q
24480 75 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20  uery may return 
24490 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65  a maximum of one
244a0 20 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74   row, the result
244b0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72  s.    ** are alr
244c0 65 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75  eady in the requ
244d0 65 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74  ested order. Set
244e0 20 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f   isOrdered to nO
244f0 72 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a  rderBy to.    **
24500 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20   indicate this. 
24510 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20  Or, if nLoop is 
24520 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
24530 6f 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64  o, set isOrdered
24540 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69   to.    ** -1, i
24550 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
24560 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61  he result set ma
24570 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
24580 6f 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a  ordered, .    **
24590 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
245a0 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f  e loops added to
245b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61   the current pla
245c0 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d  n.  */.    aFrom
245d0 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  [0].isOrdered = 
245e0 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e  nLoop>0 ? -1 : n
245f0 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20  OrderBy;.  }..  
24600 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65  /* Compute succe
24610 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57  ssively longer W
24620 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20  herePaths using 
24630 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e  the previous gen
24640 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20  eration.  ** of 
24650 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68  WherePaths as th
24660 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  e basis for the 
24670 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63  next.  Keep trac
24680 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  k of the mxChoic
24690 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68  e.  ** best path
246a0 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61  s at each genera
246b0 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  tion */.  for(iL
246c0 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
246d0 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
246e0 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66    nTo = 0;.    f
246f0 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
24700 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  From; ii<nFrom; 
24710 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a  ii++, pFrom++){.
24720 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70        for(pWLoop
24730 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
24740 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d   pWLoop; pWLoop=
24750 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f  pWLoop->pNextLoo
24760 70 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45  p){.        LogE
24770 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  st nOut;        
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24790 20 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   Rows visited by
247a0 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
247b0 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
247c0 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20  t rCost;        
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
247e0 43 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46  Cost of path (pF
247f0 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
24800 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55         LogEst rU
24810 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20  nsorted;        
24820 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f           /* Unso
24830 72 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46  rted cost of (pF
24840 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
24850 20 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65         i8 isOrde
24860 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
24870 72 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72  rdered;  /* isOr
24880 64 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d  dered for (pFrom
24890 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
248a0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b      Bitmask mask
248b0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
248c0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
248d0 20 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20   src visited by 
248e0 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  (..) */.        
248f0 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
24900 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
24910 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76    /* Mask of rev
24920 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72  -order loops for
24930 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20   (..) */..      
24940 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
24950 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
24960 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
24970 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
24980 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
24990 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
249a0 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
249b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
249c0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73   if( (pWLoop->ws
249d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
249e0 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
249f0 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29  pFrom->nRow<10 )
24a00 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
24a10 6f 20 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74  o not use an aut
24a20 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 66 20  omatic index if 
24a30 74 68 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  the this loop is
24a40 20 65 78 70 65 63 74 65 64 0a 20 20 20 20 20 20   expected.      
24a50 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65      ** to run le
24a60 73 73 20 74 68 61 6e 20 32 20 74 69 6d 65 73 2e  ss than 2 times.
24a70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
24a80 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
24a90 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
24aa0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
24ab0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24ac0 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
24ad0 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20  oint, pWLoop is 
24ae0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
24af0 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e  e the next loop.
24b00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d   .        ** Com
24b10 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f  pute its cost */
24b20 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
24b30 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
24b40 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53  stAdd(pWLoop->rS
24b50 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75  etup,pWLoop->rRu
24b60 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29  n + pFrom->nRow)
24b70 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72  ;.        rUnsor
24b80 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ted = sqlite3Log
24b90 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
24ba0 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74  , pFrom->rUnsort
24bb0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  ed);.        nOu
24bc0 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20  t = pFrom->nRow 
24bd0 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a  + pWLoop->nOut;.
24be0 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
24bf0 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
24c00 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
24c10 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
24c20 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b  ( isOrdered<0 ){
24c30 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
24c40 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68  ered = wherePath
24c50 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
24c60 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  (pWInfo,.       
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c80 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
24c90 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d  , pFrom, pWInfo-
24ca0 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20  >wctrlFlags,.   
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cc0 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f      iLoop, pWLoo
24cd0 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20  p, &revMask);.  
24ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24cf0 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d         revMask =
24d00 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
24d10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24d20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
24d30 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64  >=0 && isOrdered
24d40 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  <nOrderBy ){.   
24d50 20 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74         if( aSort
24d60 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d  Cost[isOrdered]=
24d70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24d80 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
24d90 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f  dered] = whereSo
24da0 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20  rtingCost(.     
24db0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
24dc0 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64  o, nRowEst, nOrd
24dd0 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a  erBy, isOrdered.
24de0 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
24df0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24e00 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
24e10 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55  ite3LogEstAdd(rU
24e20 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f  nsorted, aSortCo
24e30 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a  st[isOrdered]);.
24e40 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
24e50 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20  TRACE(0x002,.   
24e60 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d             ("---
24e70 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
24e80 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73   (%d/%d) increas
24e90 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25  es cost %3d to %
24ea0 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  -3d\n",.        
24eb0 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74         aSortCost
24ec0 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f  [isOrdered], (nO
24ed0 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64  rderBy-isOrdered
24ee0 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20  ), nOrderBy, .  
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e               rUn
24f00 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b  sorted, rCost));
24f10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
24f20 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
24f30 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20  = rUnsorted;.   
24f40 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64         rUnsorted
24f50 20 2d 3d 20 32 3b 20 20 2f 2a 20 54 55 4e 49 4e   -= 2;  /* TUNIN
24f60 47 3a 20 20 53 6c 69 67 68 74 20 62 69 61 73 20  G:  Slight bias 
24f70 69 6e 20 66 61 76 6f 72 20 6f 66 20 6e 6f 2d 73  in favor of no-s
24f80 6f 72 74 20 70 6c 61 6e 73 20 2a 2f 0a 20 20 20  ort plans */.   
24f90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
24fa0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
24fb0 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
24fc0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
24fd0 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20   set of.        
24fe0 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74  ** mxChoice best
24ff0 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20  -so-far paths.. 
25000 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
25010 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20    ** First look 
25020 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
25030 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d  path among best-
25040 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20  so-far paths.   
25050 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76       ** that cov
25060 65 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74  ers the same set
25070 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
25080 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64  s the same isOrd
25090 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ered.        ** 
250a0 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63  setting as the c
250b0 75 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64  urrent path cand
250c0 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a  idate..        *
250d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
250e0 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73   term "((pTo->is
250f0 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65  Ordered^isOrdere
25100 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20  d)&0x80)==0" is 
25110 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20  equivalent.     
25120 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69     ** to (pTo->i
25130 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d  sOrdered==(-1))=
25140 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31  =(isOrdered==(-1
25150 29 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67  ))" for the rang
25160 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
25170 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72  legal values for
25180 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e   isOrdered, -1..
25190 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  64..        */. 
251a0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c         for(jj=0,
251b0 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f   pTo=aTo; jj<nTo
251c0 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
251d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
251e0 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73  o->maskLoop==mas
251f0 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20  kNew.           
25200 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  && ((pTo->isOrde
25210 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
25220 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  x80)==0.        
25230 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
25240 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e   testcase( jj==n
25250 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  To-1 );.        
25260 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25280 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e  .        if( jj>
25290 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  =nTo ){.        
252a0 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65    /* None of the
252b0 20 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73   existing best-s
252c0 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63  o-far paths matc
252d0 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
252e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
252f0 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a  ( nTo>=mxChoice.
25300 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72             && (r
25310 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28  Cost>mxCost || (
25320 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
25330 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e   rUnsorted>=mxUn
25340 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20  sorted)).       
25350 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
25360 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
25370 20 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f   candidate is no
25380 20 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79   better than any
25390 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
253a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
253b0 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20  paths currently 
253c0 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66  in the best-so-f
253d0 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64  ar buffer.  So d
253e0 69 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20  iscard.         
253f0 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69     ** this candi
25400 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62  date as not viab
25410 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  le. */.#ifdef WH
25420 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
25430 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
25440 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
25450 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
25460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25470 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25480 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
25490 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33  cost=%-3d,%3d,%3
254a0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
254d0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
254e0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
254f0 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20  t, rUnsorted,.  
25500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25510 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
25520 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
25530 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
25540 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
25550 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
25560 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25570 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
25580 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73  each this points
25590 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
255a0 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65  he new candidate
255b0 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20   path.          
255c0 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  ** needs to be a
255d0 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
255e0 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  of best-so-far p
255f0 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  aths. */.       
25600 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
25610 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
25620 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
25630 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
25640 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
25650 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
25660 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
25670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25680 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
25690 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
256a0 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
256b0 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
256c0 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
256d0 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b         jj = mxI;
256e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
256f0 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
25700 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48  o[jj];.#ifdef WH
25710 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
25720 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
25730 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25740 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
25750 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
25760 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25770 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
25780 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72  =%-3d,%3d,%3d or
25790 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
257a0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
257b0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
257c0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
257d0 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e  rCost, nOut, rUn
257e0 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  sorted,.        
257f0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
25800 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
25810 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
25820 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
25830 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25840 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
25850 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65  rol reaches here
25860 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20   if best-so-far 
25870 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d  path pTo=aTo[jj]
25880 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20 20   covers the.    
25890 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73 65        ** same se
258a0 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68  t of loops and h
258b0 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72  as the same isOr
258c0 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61 73  dered setting as
258d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
258e0 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  * candidate path
258f0 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
25900 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
25910 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a   should replace.
25920 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f            ** pTo
25930 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64 69   or if the candi
25940 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73  date should be s
25950 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 20 20  kipped..        
25960 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20    ** .          
25970 2a 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ** The condition
25980 61 6c 20 69 73 20 61 6e 20 65 78 70 61 6e 64 65  al is an expande
25990 64 20 76 65 63 74 6f 72 20 63 6f 6d 70 61 72 69  d vector compari
259a0 73 6f 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 74  son equivalent t
259b0 6f 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o:.          ** 
259c0 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74 2c 70 54    (pTo->rCost,pT
259d0 6f 2d 3e 6e 52 6f 77 2c 70 54 6f 2d 3e 72 55 6e  o->nRow,pTo->rUn
259e0 73 6f 72 74 65 64 29 20 3c 3d 20 28 72 43 6f 73  sorted) <= (rCos
259f0 74 2c 6e 4f 75 74 2c 72 55 6e 73 6f 72 74 65 64  t,nOut,rUnsorted
25a00 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
25a10 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
25a20 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 0a 20  ->rCost<rCost . 
25a30 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
25a40 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 0a  o->rCost==rCost.
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
25a60 26 20 28 70 54 6f 2d 3e 6e 52 6f 77 3c 6e 4f 75  & (pTo->nRow<nOu
25a70 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
25a80 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 6e 52       || (pTo->nR
25a90 6f 77 3d 3d 6e 4f 75 74 20 26 26 20 70 54 6f 2d  ow==nOut && pTo-
25aa0 3e 72 55 6e 73 6f 72 74 65 64 3c 3d 72 55 6e 73  >rUnsorted<=rUns
25ab0 6f 72 74 65 64 29 0a 20 20 20 20 20 20 20 20 20  orted).         
25ac0 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
25ad0 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
25ae0 20 20 20 20 20 29 7b 0a 23 69 66 64 65 66 20 57       ){.#ifdef W
25af0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
25b00 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
25b10 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
25b20 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
25b30 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
25b40 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25b50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
25b60 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20           "Skip  
25b70 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
25b80 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  d,%3d order=%c",
25b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25ba0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
25bb0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
25bc0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
25bd0 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a  Out, rUnsorted,.
25be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bf0 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
25c00 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
25c10 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
25c20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25c30 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25  gPrintf("   vs %
25c40 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c  s cost=%-3d,%3d,
25c50 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
25c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25c70 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
25c80 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
25c90 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
25ca0 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
25cb0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d              pTo-
25cc0 3e 72 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f 2d  >rUnsorted, pTo-
25cd0 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20  >isOrdered>=0 ? 
25ce0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27  pTo->isOrdered+'
25cf0 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
25d00 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
25d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
25d20 69 73 63 61 72 64 20 74 68 65 20 63 61 6e 64 69  iscard the candi
25d30 64 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66  date path from f
25d40 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61  urther considera
25d50 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
25d60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
25d70 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
25d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
25d90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
25da0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
25db0 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
25dc0 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a  ost==rCost+1 );.
25dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
25de0 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72  trol reaches her
25df0 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  e if the candida
25e00 74 65 20 70 61 74 68 20 69 73 20 62 65 74 74 65  te path is bette
25e10 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20  r than the.     
25e20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68       ** pTo path
25e30 2e 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77  .  Replace pTo w
25e40 69 74 68 20 74 68 65 20 63 61 6e 64 69 64 61 74  ith the candidat
25e50 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  e. */.#ifdef WHE
25e60 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
25e70 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
25e80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
25e90 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
25ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
25eb0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25ed0 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74   "Update %s cost
25ee0 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72  =%-3d,%3d,%3d or
25ef0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
25f00 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
25f10 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
25f20 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
25f30 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f  ost, nOut, rUnso
25f40 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
25f50 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
25f60 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
25f70 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
25f80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25f90 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73  bugPrintf("  was
25fa0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
25fb0 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
25fc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
25fd0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
25fe0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
25ff0 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
26000 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
26010 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72            pTo->r
26020 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e 69  Unsorted, pTo->i
26030 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
26040 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
26050 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
26060 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
26070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
26080 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
26090 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
260a0 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
260b0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
260c0 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
260d0 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
260e0 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
260f0 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
26100 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
26110 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
26120 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a  o->nRow = nOut;.
26130 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f          pTo->rCo
26140 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20  st = rCost;.    
26150 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74      pTo->rUnsort
26160 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a  ed = rUnsorted;.
26170 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
26180 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72  rdered = isOrder
26190 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ed;.        memc
261a0 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70  py(pTo->aLoop, p
261b0 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a  From->aLoop, siz
261c0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
261d0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
261e0 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  pTo->aLoop[iLoop
261f0 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  ] = pWLoop;.    
26200 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
26210 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
26220 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20     mxI = 0;.    
26230 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61        mxCost = a
26240 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20  To[0].rCost;.   
26250 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65         mxUnsorte
26260 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b  d = aTo[0].nRow;
26270 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
26280 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d  j=1, pTo=&aTo[1]
26290 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a  ; jj<mxChoice; j
262a0 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
262b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
262c0 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a  ->rCost>mxCost .
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
262e0 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43  (pTo->rCost==mxC
262f0 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73  ost && pTo->rUns
26300 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64  orted>mxUnsorted
26310 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ) .            )
26320 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26330 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
26340 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ost;.           
26350 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
26360 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a  pTo->rUnsorted;.
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
26380 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  I = jj;.        
26390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
263a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
263b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
263c0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
263d0 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a  BLED  /* >=2 */.
263e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
263f0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30 32  hereTrace & 0x02
26400 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26410 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
26420 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
26430 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
26440 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
26450 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
26460 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
26470 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26480 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
26490 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
264a0 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
264b0 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
264c0 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
264d0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
264e0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
264f0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
26500 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
26510 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
26520 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20  d+'0') : '?');. 
26530 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
26540 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20  isOrdered>0 ){. 
26550 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26560 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
26570 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
26580 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
26590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
265a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
265b0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
265c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
265d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
265e0 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
265f0 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
26600 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
26610 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
26620 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
26630 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
26640 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
26650 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
26660 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
26670 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
26680 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
26690 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
266a0 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
266b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
266c0 65 4e 4e 28 64 62 2c 20 70 53 70 61 63 65 29 3b  eNN(db, pSpace);
266d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
266e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
266f0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c  .  /* Find the l
26700 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e  owest cost path.
26710 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20    pFrom will be 
26720 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
26730 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20   that path */.  
26740 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20  pFrom = aFrom;. 
26750 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46   for(ii=1; ii<nF
26760 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  rom; ii++){.    
26770 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74  if( pFrom->rCost
26780 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74  >aFrom[ii].rCost
26790 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f   ) pFrom = &aFro
267a0 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73  m[ii];.  }.  ass
267b0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
267c0 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20  vel==nLoop );.  
267d0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65  /* Load the lowe
267e0 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74  st cost path int
267f0 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f  o pWInfo */.  fo
26800 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
26810 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
26820 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c  {.    WhereLevel
26830 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66   *pLevel = pWInf
26840 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20  o->a + iLoop;.  
26850 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70    pLevel->pWLoop
26860 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f   = pWLoop = pFro
26870 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b  m->aLoop[iLoop];
26880 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
26890 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61  om = pWLoop->iTa
268a0 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  b;.    pLevel->i
268b0 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d  TabCur = pWInfo-
268c0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
268d0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72  vel->iFrom].iCur
268e0 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  sor;.  }.  if( (
268f0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
26900 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
26910 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20  DISTINCT)!=0.   
26920 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
26930 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
26940 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20  ISTINCTBY)==0.  
26950 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73   && pWInfo->eDis
26960 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53  tinct==WHERE_DIS
26970 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26  TINCT_NOOP.   &&
26980 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20   nRowEst.  ){.  
26990 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65    Bitmask notUse
269a0 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
269b0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
269c0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
269d0 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c  , pWInfo->pResul
269e0 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20  tSet, pFrom,.   
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
26a00 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20  ERE_DISTINCTBY, 
26a10 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e  nLoop-1, pFrom->
26a20 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20  aLoop[nLoop-1], 
26a30 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
26a40 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70  f( rc==pWInfo->p
26a50 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72  ResultSet->nExpr
26a60 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
26a70 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
26a80 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
26a90 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ERED;.    }.  }.
26aa0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
26ab0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66  rderBy ){.    if
26ac0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
26ad0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
26ae0 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20  TINCTBY ){.     
26af0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72   if( pFrom->isOr
26b00 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70  dered==pWInfo->p
26b10 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
26b20 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
26b30 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
26b40 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
26b50 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERED;.      }.  
26b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
26b70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20  WInfo->nOBSat = 
26b80 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
26b90 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
26ba0 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
26bb0 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  >revLoop;.      
26bc0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  if( pWInfo->nOBS
26bd0 61 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  at<=0 ){.       
26be0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
26bf0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
26c00 20 6e 4c 6f 6f 70 3e 30 20 29 7b 0a 20 20 20 20   nLoop>0 ){.    
26c10 20 20 20 20 20 20 75 33 32 20 77 73 46 6c 61 67        u32 wsFlag
26c20 73 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  s = pFrom->aLoop
26c30 5b 6e 4c 6f 6f 70 2d 31 5d 2d 3e 77 73 46 6c 61  [nLoop-1]->wsFla
26c40 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  gs;.          if
26c50 28 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  ( (wsFlags & WHE
26c60 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 0a 20  RE_ONEROW)==0 . 
26c70 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77 73            && (ws
26c80 46 6c 61 67 73 26 28 57 48 45 52 45 5f 49 50 4b  Flags&(WHERE_IPK
26c90 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  |WHERE_COLUMN_IN
26ca0 29 29 21 3d 28 57 48 45 52 45 5f 49 50 4b 7c 57  ))!=(WHERE_IPK|W
26cb0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 0a  HERE_COLUMN_IN).
26cc0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
26cd0 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b           Bitmask
26ce0 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   m = 0;.        
26cf0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65      int rc = whe
26d00 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
26d10 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
26d20 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
26d30 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20   pFrom,.        
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
26d50 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
26d60 54 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f  T, nLoop-1, pFro
26d70 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
26d80 5d 2c 20 26 6d 29 3b 0a 20 20 20 20 20 20 20 20  ], &m);.        
26d90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73      testcase( ws
26da0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
26db0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  K );.           
26dc0 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61   testcase( wsFla
26dd0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
26de0 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  N_IN );.        
26df0 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e      if( rc==pWIn
26e00 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
26e10 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
26e20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 72       pWInfo->bOr
26e30 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d  deredInnerLoop =
26e40 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
26e50 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
26e60 6b 20 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20 20  k = m;.         
26e70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
26e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26e90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
26ea0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
26eb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52  lags & WHERE_SOR
26ec0 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20  TBYGROUP).      
26ed0 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42    && pWInfo->nOB
26ee0 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  Sat==pWInfo->pOr
26ef0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20  derBy->nExpr && 
26f00 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20  nLoop>0.    ){. 
26f10 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
26f20 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
26f30 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65  int nOrder = whe
26f40 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
26f50 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
26f60 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
26f70 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
26f80 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  m, 0, nLoop-1, p
26f90 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
26fa0 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20  p-1], &revMask. 
26fb0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
26fc0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f  sert( pWInfo->so
26fd0 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rted==0 );.     
26fe0 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49   if( nOrder==pWI
26ff0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
27000 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
27010 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d  pWInfo->sorted =
27020 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   1;.        pWIn
27030 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65  fo->revMask = re
27040 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  vMask;.      }. 
27050 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49     }.  }...  pWI
27060 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70  nfo->nRowOut = p
27070 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f  From->nRow;..  /
27080 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79  * Free temporary
27090 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75   memory and retu
270a0 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  rn success */.  
270b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
270c0 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72  db, pSpace);.  r
270d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
270e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71  .}../*.** Most q
270f0 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20  ueries use only 
27100 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28  a single table (
27110 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69  they are not joi
27120 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20  ns) and have.** 
27130 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72  simple == constr
27140 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e  aints against in
27150 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54  dexed fields.  T
27160 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
27170 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20  mpts.** to plan 
27180 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73  those simple cas
27190 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65  es using much le
271a0 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e  ss ceremony than
271b0 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d   the.** general-
271c0 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
271d0 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65  anner, and there
271e0 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20  by yield faster 
271f0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
27200 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74  ).** times for t
27210 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
27220 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  **.** Return non
27230 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73  -zero on success
27240 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  , if this query 
27250 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62  can be handled b
27260 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69  y this.** no-fri
27270 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  lls query planne
27280 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  r.  Return zero 
27290 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65  if this query ne
272a0 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65  eds the .** gene
272b0 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
272c0 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74  y planner..*/.st
272d0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68  atic int whereSh
272e0 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70  ortCut(WhereLoop
272f0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
27300 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
27310 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  *pWInfo;.  struc
27320 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
27330 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c  pItem;.  WhereCl
27340 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
27350 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
27360 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
27370 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  p;.  int iCur;. 
27380 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20   int j;.  Table 
27390 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
273a0 70 49 64 78 3b 0a 0a 20 20 70 57 49 6e 66 6f 20  pIdx;..  pWInfo 
273b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
273c0 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
273d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
273e0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
273f0 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  E ) return 0;.  
27400 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
27410 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d  pTabList->nSrc>=
27420 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  1 );.  pItem = p
27430 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
27440 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74  >a;.  pTab = pIt
27450 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20  em->pTab;.  if( 
27460 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
27470 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
27480 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  ( pItem->fg.isIn
27490 64 65 78 65 64 42 79 20 29 20 72 65 74 75 72 6e  dexedBy ) return
274a0 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74   0;.  iCur = pIt
274b0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
274c0 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
274d0 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75  C;.  pLoop = pBu
274e0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
274f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
27500 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  0;.  pLoop->nSki
27510 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d  p = 0;.  pTerm =
27520 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e   sqlite3WhereFin
27530 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
27540 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f   -1, 0, WO_EQ|WO
27550 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _IS, 0);.  if( p
27560 54 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73 74  Term ){.    test
27570 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
27580 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
27590 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ;.    pLoop->wsF
275a0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
275b0 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b  UMN_EQ|WHERE_IPK
275c0 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20  |WHERE_ONEROW;. 
275d0 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
275e0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
275f0 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
27600 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75   1;.    pLoop->u
27610 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
27620 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
27630 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c  ost of a rowid l
27640 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20  ookup is 10 */. 
27650 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
27660 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c   33;  /* 33==sql
27670 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a  ite3LogEst(10) *
27680 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
27690 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
276a0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
276b0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
276c0 20 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b       int opMask;
276d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
276e0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
276f0 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  e==pLoop->aLTerm
27700 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49   );.      if( !I
27710 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
27720 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  x).       || pId
27730 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
27740 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  !=0 .       || p
27750 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72  Idx->nKeyCol>Arr
27760 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c  aySize(pLoop->aL
27770 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20  TermSpace) .    
27780 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20    ) continue;.  
27790 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64      opMask = pId
277a0 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f  x->uniqNotNull ?
277b0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a   (WO_EQ|WO_IS) :
277c0 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f   WO_EQ;.      fo
277d0 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
277e0 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
277f0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71        pTerm = sq
27800 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
27810 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
27820 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78   0, opMask, pIdx
27830 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
27840 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
27850 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
27860 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
27870 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
27880 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
27890 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b  Term[j] = pTerm;
278a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
278b0 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79  f( j!=pIdx->nKey
278c0 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Col ) continue;.
278d0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
278e0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
278f0 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45  UMN_EQ|WHERE_ONE
27900 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  ROW|WHERE_INDEXE
27910 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  D;.      if( pId
27920 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c  x->isCovering ||
27930 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64   (pItem->colUsed
27940 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
27950 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a  ex(pIdx))==0 ){.
27960 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77          pLoop->w
27970 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27980 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  IDX_ONLY;.      
27990 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  }.      pLoop->n
279a0 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  LTerm = j;.     
279b0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
279c0 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  nEq = j;.      p
279d0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
279e0 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20  ndex = pIdx;.   
279f0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
27a00 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69  st of a unique i
27a10 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31  ndex lookup is 1
27a20 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70  5 */.      pLoop
27a30 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a  ->rRun = 39;  /*
27a40 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   39==sqlite3LogE
27a50 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20  st(15) */.      
27a60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
27a70 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
27a80 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f  Flags ){.    pLo
27a90 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45  op->nOut = (LogE
27aa0 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f  st)1;.    pWInfo
27ab0 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20  ->a[0].pWLoop = 
27ac0 70 4c 6f 6f 70 3b 0a 20 20 20 20 61 73 73 65 72  pLoop;.    asser
27ad0 74 28 20 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  t( pWInfo->sMask
27ae0 53 65 74 2e 6e 3d 3d 31 20 26 26 20 69 43 75 72  Set.n==1 && iCur
27af0 3d 3d 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  ==pWInfo->sMaskS
27b00 65 74 2e 69 78 5b 30 5d 20 29 3b 0a 20 20 20 20  et.ix[0] );.    
27b10 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  pLoop->maskSelf 
27b20 3d 20 31 3b 20 2f 2a 20 73 71 6c 69 74 65 33 57  = 1; /* sqlite3W
27b30 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49  hereGetMask(&pWI
27b40 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
27b50 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 70 57 49  Cur); */.    pWI
27b60 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75  nfo->a[0].iTabCu
27b70 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57  r = iCur;.    pW
27b80 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
27b90 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  1;.    if( pWInf
27ba0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57  o->pOrderBy ) pW
27bb0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20  Info->nOBSat =  
27bc0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
27bd0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
27be0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
27bf0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
27c00 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
27c10 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
27c20 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
27c30 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
27c40 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
27c50 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f  E_DEBUG.    pLoo
27c60 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65  p->cId = '0';.#e
27c70 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
27c80 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
27c90 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  0;.}../*.** Help
27ca0 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
27cb0 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73  exprIsDeterminis
27cc0 74 69 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tic()..*/.static
27cd0 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 44   int exprNodeIsD
27ce0 65 74 65 72 6d 69 6e 69 73 74 69 63 28 57 61 6c  eterministic(Wal
27cf0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
27d00 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
27d10 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
27d20 46 55 4e 43 54 49 4f 4e 20 26 26 20 45 78 70 72  FUNCTION && Expr
27d30 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
27d40 72 2c 20 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29  r, EP_ConstFunc)
27d50 3d 3d 30 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  ==0 ){.    pWalk
27d60 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
27d70 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
27d80 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ort;.  }.  retur
27d90 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
27da0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
27db0 74 72 75 65 20 69 66 20 74 68 65 20 65 78 70 72  true if the expr
27dc0 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
27dd0 6e 6f 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  no non-determini
27de0 73 74 69 63 20 53 51 4c 20 0a 2a 2a 20 66 75 6e  stic SQL .** fun
27df0 63 74 69 6f 6e 73 2e 20 44 6f 20 6e 6f 74 20 63  ctions. Do not c
27e00 6f 6e 73 69 64 65 72 20 6e 6f 6e 2d 64 65 74 65  onsider non-dete
27e10 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20 66 75  rministic SQL fu
27e20 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  nctions that are
27e30 20 0a 2a 2a 20 70 61 72 74 20 6f 66 20 73 75 62   .** part of sub
27e40 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
27e50 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
27e60 74 20 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e  t exprIsDetermin
27e70 69 73 74 69 63 28 45 78 70 72 20 2a 70 29 7b 0a  istic(Expr *p){.
27e80 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
27e90 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
27ea0 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64  of(w));.  w.eCod
27eb0 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
27ec0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
27ed0 6f 64 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74  odeIsDeterminist
27ee0 69 63 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ic;.  w.xSelectC
27ef0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
27f00 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b  3SelectWalkFail;
27f10 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
27f20 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
27f30 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
27f40 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
27f50 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
27f60 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
27f70 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
27f80 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
27f90 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
27fa0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
27fb0 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
27fc0 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
27fd0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
27fe0 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
27ff0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
28000 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
28010 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
28020 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
28030 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
28040 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
28050 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
28060 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
28070 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
28080 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
28090 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
280a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
280b0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
280c0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
280d0 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
280e0 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
280f0 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
28100 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
28110 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
28120 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
28130 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
28140 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
28150 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
28160 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
28170 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
28180 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
28190 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
281a0 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
281b0 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
281c0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
281d0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
281e0 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
281f0 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
28200 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
28210 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
28220 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
28230 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
28240 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
28250 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
28260 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
28270 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
28280 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
28290 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
282a0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
282b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
282c0 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
282d0 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
282e0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
282f0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
28310 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
28320 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28340 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
28350 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
28360 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28380 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
28390 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
283a0 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
283b0 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
283c0 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
283d0 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
283e0 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
283f0 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
28400 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
28410 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
28420 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
28430 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
28440 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
28450 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
28460 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
28470 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
28480 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
28490 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
284a0 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
284b0 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
284c0 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
284d0 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
284e0 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
284f0 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
28500 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
28510 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
28520 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
28530 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
28540 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
28550 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
28560 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
28570 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
28580 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
28590 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
285a0 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
285b0 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
285c0 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
285d0 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
285e0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
285f0 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
28600 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
28610 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28620 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
28630 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
28640 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
28650 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
28660 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
28670 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
28680 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
28690 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
286a0 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
286b0 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
286c0 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
286d0 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
286e0 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
286f0 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
28700 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
28710 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
28720 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
28730 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
28740 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
28750 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
28760 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
28770 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
28780 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
28790 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
287a0 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
287b0 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
287c0 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
287d0 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
287e0 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
287f0 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
28800 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
28810 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
28820 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
28830 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
28840 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
28850 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
28860 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
28870 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
28880 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
28890 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
288a0 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
288b0 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
288c0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
288d0 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
288e0 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
288f0 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
28900 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
28910 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
28920 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
28930 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
28940 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
28950 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
28960 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
28970 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
28980 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
28990 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
289a0 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
289b0 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
289c0 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
289d0 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
289e0 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
289f0 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
28a00 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
28a10 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
28a20 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
28a30 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
28a40 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
28a50 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
28a60 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
28a70 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
28a80 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
28a90 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
28aa0 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
28ab0 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
28ac0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
28ad0 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
28ae0 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
28af0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
28b00 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
28b10 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
28b20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
28b30 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
28b40 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
28b50 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
28b60 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
28b70 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
28b80 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
28b90 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
28ba0 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
28bb0 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
28bc0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
28bd0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
28be0 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  (or the GROUP BY
28bf0 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68   clause.** if th
28c00 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
28c10 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77  flag is set in w
28c20 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20  ctrlFlags) of a 
28c30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28c40 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
28c50 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
28c60 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
28c70 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
28c80 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
28c90 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
28ca0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
28cb0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f  atement, then pO
28cc0 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
28cd0 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75  **.** The iIdxCu
28ce0 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  r parameter is t
28cf0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
28d00 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49   of an index.  I
28d10 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53  f .** WHERE_OR_S
28d20 55 42 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c  UBCLAUSE is set,
28d30 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20   iIdxCur is the 
28d40 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
28d50 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20   an index.** to 
28d60 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73  use for OR claus
28d70 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  e processing.  T
28d80 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
28d90 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a  should use this.
28da0 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73  ** specific curs
28db0 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e  or.  If WHERE_ON
28dc0 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73  EPASS_DESIRED is
28dd0 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43   set, then iIdxC
28de0 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  ur is.** the fir
28df0 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20  st cursor in an 
28e00 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73  array of cursors
28e10 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73   for all indices
28e20 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c  .  iIdxCur shoul
28e30 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  d.** be used to 
28e40 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72  compute the appr
28e50 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64  opriate cursor d
28e60 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63  epending on whic
28e70 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73  h index is.** us
28e80 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f  ed..*/.WhereInfo
28e90 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
28ea0 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
28eb0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
28ec0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
28ed0 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
28ee0 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
28ef0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
28f00 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  : A list of all 
28f10 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
28f20 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
28f30 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
28f40 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
28f50 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
28f60 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
28f70 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
28f80 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  Y (or GROUP BY) 
28f90 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
28fa0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
28fb0 52 65 73 75 6c 74 53 65 74 2c 20 20 20 2f 2a 20  ResultSet,   /* 
28fc0 51 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  Query result set
28fd0 2e 20 20 52 65 71 27 64 20 66 6f 72 20 44 49 53  .  Req'd for DIS
28fe0 54 49 4e 43 54 20 2a 2f 0a 20 20 75 31 36 20 77  TINCT */.  u16 w
28ff0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
29000 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 5f     /* The WHERE_
29010 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20  * flags defined 
29020 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a  in sqliteInt.h *
29030 2f 0a 20 20 69 6e 74 20 69 41 75 78 41 72 67 20  /.  int iAuxArg 
29040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
29050 66 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  f WHERE_OR_SUBCL
29060 41 55 53 45 20 69 73 20 73 65 74 2c 20 69 6e 64  AUSE is set, ind
29070 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ex cursor number
29080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29090 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66             ** If
290a0 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
290b0 2c 20 74 68 65 6e 20 74 68 65 20 6c 69 6d 69 74  , then the limit
290c0 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20   amount */.){.  
290d0 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20  int nByteWInfo; 
290e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
290f0 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  m. bytes allocat
29100 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f  ed for WhereInfo
29110 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74   struct */.  int
29120 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20   nTabList;      
29130 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29140 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
29150 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
29160 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
29170 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
29180 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
29190 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
291a0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
291b0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
291c0 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
291d0 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
291e0 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
291f0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
29200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
29210 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
29220 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
29230 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
29240 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20  uilder sWLB;    
29250 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
29260 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57  p builder */.  W
29270 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
29280 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65  skSet;    /* The
29290 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
292a0 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c   set */.  WhereL
292b0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
292c0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
292d0 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f   level in pWInfo
292e0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  ->a[] */.  Where
292f0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
29300 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
29310 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65   to a single Whe
29320 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
29330 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
29340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29350 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
29360 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
29370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29380 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
29390 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
293a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
293b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
293c0 6f 64 65 20 2a 2f 0a 20 20 75 38 20 62 46 6f 72  ode */.  u8 bFor
293d0 64 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20  delete = 0;     
293e0 20 20 20 20 2f 2a 20 4f 50 46 4c 41 47 5f 46 4f      /* OPFLAG_FO
293f0 52 44 45 4c 45 54 45 20 6f 72 20 7a 65 72 6f 2c  RDELETE or zero,
29400 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   as appropriate 
29410 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  */..  assert( (w
29420 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
29430 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52  E_ONEPASS_MULTIR
29440 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20 20 20  OW)==0 || (.    
29450 20 20 20 20 28 77 63 74 72 6c 46 6c 61 67 73 20      (wctrlFlags 
29460 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
29470 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20  DESIRED)!=0 .   
29480 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
29490 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
294a0 4c 41 55 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b  LAUSE)==0 .  ));
294b0 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20  ..  /* Only one 
294c0 6f 66 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  of WHERE_OR_SUBC
294d0 4c 41 55 53 45 20 6f 72 20 57 48 45 52 45 5f 55  LAUSE or WHERE_U
294e0 53 45 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 61 73  SE_LIMIT */.  as
294f0 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67  sert( (wctrlFlag
29500 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
29510 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20 20 20  CLAUSE)==0.     
29520 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c         || (wctrl
29530 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 53  Flags & WHERE_US
29540 45 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a  E_LIMIT)==0 );..
29550 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e    /* Variable in
29560 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
29570 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
29580 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c  b;.  memset(&sWL
29590 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c  B, 0, sizeof(sWL
295a0 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52  B));..  /* An OR
295b0 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61  DER/GROUP BY cla
295c0 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e  use of more than
295d0 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74   63 terms cannot
295e0 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f   be optimized */
295f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72  .  testcase( pOr
29600 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42  derBy && pOrderB
29610 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20  y->nExpr==BMS-1 
29620 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
29630 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e  y && pOrderBy->n
29640 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64  Expr>=BMS ) pOrd
29650 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42  erBy = 0;.  sWLB
29660 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
29670 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61  erBy;..  /* Disa
29680 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ble the DISTINCT
29690 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
296a0 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
296b0 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20  Opt is set via. 
296c0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   ** sqlite3_test
296d0 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53  _ctrl(SQLITE_TES
296e0 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
296f0 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66  ONS,...) */.  if
29700 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
29710 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
29720 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29  E_DistinctOpt) )
29730 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73  {.    wctrlFlags
29740 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f   &= ~WHERE_WANT_
29750 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20  DISTINCT;.  }.. 
29760 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
29770 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
29780 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
29790 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75  imited by the nu
297a0 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74  mber of.  ** bit
297b0 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a  s in a Bitmask .
297c0 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
297d0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d   pTabList->nSrc=
297e0 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54  =BMS );.  if( pT
297f0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53  abList->nSrc>BMS
29800 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
29810 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
29820 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c  "at most %d tabl
29830 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42  es in a join", B
29840 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MS);.    return 
29850 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  0;.  }..  /* Thi
29860 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61  s function norma
29870 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20  lly generates a 
29880 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20  nested loop for 
29890 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20  all tables in . 
298a0 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42   ** pTabList.  B
298b0 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ut if the WHERE_
298c0 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61  OR_SUBCLAUSE fla
298d0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77  g is set, then w
298e0 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e  e should.  ** on
298f0 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ly generate code
29900 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
29910 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
29920 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74   and assume that
29930 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72  .  ** any cursor
29940 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
29950 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62  h subsequent tab
29960 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61  les are uninitia
29970 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54  lized..  */.  nT
29980 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46  abList = (wctrlF
29990 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f  lags & WHERE_OR_
299a0 53 55 42 43 4c 41 55 53 45 29 20 3f 20 31 20 3a  SUBCLAUSE) ? 1 :
299b0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
299c0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
299d0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
299e0 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
299f0 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
29a00 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
29a10 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41   return value. A
29a20 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
29a30 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  on is used to st
29a40 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ore the WhereInf
29a50 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74  o.  ** struct, t
29a60 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57  he contents of W
29a70 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68  hereInfo.a[], th
29a80 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
29a90 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64  ructure.  ** and
29aa0 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   the WhereMaskSe
29ab0 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e  t structure. Sin
29ac0 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  ce WhereClause c
29ad0 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74  ontains an 8-byt
29ae0 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79  e.  ** field (ty
29af0 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d  pe Bitmask) it m
29b00 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f  ust be aligned o
29b10 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  n an 8-byte boun
29b20 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d  dary on.  ** som
29b30 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  e architectures.
29b40 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44   Hence the ROUND
29b50 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  8() below..  */.
29b60 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52    nByteWInfo = R
29b70 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65  OUND8(sizeof(Whe
29b80 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73  reInfo)+(nTabLis
29b90 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  t-1)*sizeof(Wher
29ba0 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e  eLevel));.  pWIn
29bb0 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
29bc0 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42  llocRawNN(db, nB
29bd0 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f  yteWInfo + sizeo
29be0 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
29bf0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
29c00 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
29c10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
29c20 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e  WInfo);.    pWIn
29c30 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  fo = 0;.    goto
29c40 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
29c50 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
29c60 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
29c70 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
29c80 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
29c90 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
29ca0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
29cb0 20 70 57 49 6e 66 6f 2d 3e 70 57 68 65 72 65 20   pWInfo->pWhere 
29cc0 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 57 49 6e  = pWhere;.  pWIn
29cd0 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d  fo->pResultSet =
29ce0 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70   pResultSet;.  p
29cf0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
29d00 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d  ass[0] = pWInfo-
29d10 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
29d20 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d   = -1;.  pWInfo-
29d30 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69  >nLevel = nTabLi
29d40 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  st;.  pWInfo->iB
29d50 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69  reak = pWInfo->i
29d60 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
29d70 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
29d80 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  v);.  pWInfo->wc
29d90 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
29da0 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
29db0 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72  >iLimit = iAuxAr
29dc0 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  g;.  pWInfo->sav
29dd0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
29de0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
29df0 70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49  p;.  memset(&pWI
29e00 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30 2c 20  nfo->nOBSat, 0, 
29e10 0a 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  .         offset
29e20 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 73 57 43  of(WhereInfo,sWC
29e30 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 57 68 65  ) - offsetof(Whe
29e40 72 65 49 6e 66 6f 2c 6e 4f 42 53 61 74 29 29 3b  reInfo,nOBSat));
29e50 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49 6e 66  .  memset(&pWInf
29e60 6f 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65  o->a[0], 0, size
29e70 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 2b 6e 54  of(WhereLoop)+nT
29e80 61 62 4c 69 73 74 2a 73 69 7a 65 6f 66 28 57 68  abList*sizeof(Wh
29e90 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 61 73  ereLevel));.  as
29ea0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  sert( pWInfo->eO
29eb0 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
29ec0 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45 50 41  OFF );  /* ONEPA
29ed0 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f 20 4f  SS defaults to O
29ee0 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53 65 74  FF */.  pMaskSet
29ef0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73   = &pWInfo->sMas
29f00 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49  kSet;.  sWLB.pWI
29f10 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20  nfo = pWInfo;.  
29f20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e  sWLB.pWC = &pWIn
29f30 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e  fo->sWC;.  sWLB.
29f40 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f  pNew = (WhereLoo
29f50 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e  p*)(((char*)pWIn
29f60 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b  fo)+nByteWInfo);
29f70 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
29f80 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
29f90 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20  sWLB.pNew) );.  
29fa0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57  whereLoopInit(sW
29fb0 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66  LB.pNew);.#ifdef
29fc0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
29fd0 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d  sWLB.pNew->cId =
29fe0 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   '*';.#endif..  
29ff0 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
2a000 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
2a010 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
2a020 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
2a030 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
2a040 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
2a050 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
2a060 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
2a070 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
2a080 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  t);.  sqlite3Whe
2a090 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57  reClauseInit(&pW
2a0a0 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66  Info->sWC, pWInf
2a0b0 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  o);.  sqlite3Whe
2a0c0 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d  reSplit(&pWInfo-
2a0d0 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b  >sWC, pWhere, TK
2a0e0 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a  _AND);.    .  /*
2a0f0 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e   Special case: N
2a100 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  o FROM clause.  
2a110 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73  */.  if( nTabLis
2a120 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
2a130 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
2a140 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64  o->nOBSat = pOrd
2a150 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
2a160 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
2a170 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
2a180 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
2a190 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2a1a0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2a1b0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
2a1c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2a1d0 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f  Assign a bit fro
2a1e0 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f  m the bitmask to
2a1f0 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
2a200 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
2a210 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2a220 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74  e N-th term of t
2a230 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
2a240 73 20 61 73 73 69 67 6e 65 64 20 61 20 62 69 74  s assigned a bit
2a250 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20  mask of 1<<N..  
2a260 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2a270 72 75 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76  rule of the prev
2a280 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e  ious sentence en
2a290 73 75 72 65 73 20 74 68 74 61 20 69 66 20 58 20  sures thta if X 
2a2a0 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
2a2b0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c  or.    ** a tabl
2a2c0 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69 73  e T, then X-1 is
2a2d0 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
2a2e0 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65   all other table
2a2f0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
2a300 20 54 2e 0a 20 20 20 20 2a 2a 20 4b 6e 6f 77 69   T..    ** Knowi
2a310 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  ng the bitmask f
2a320 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
2a330 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c   the left of a l
2a340 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 20 20  eft join is.    
2a350 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54  ** important.  T
2a360 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 20  icket #3015..   
2a370 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
2a380 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72  that bitmasks ar
2a390 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
2a3a0 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  l pTabList->nSrc
2a3b0 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 20 20 2a   tables in.    *
2a3c0 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20  * pTabList, not 
2a3d0 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  just the first n
2a3e0 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20  TabList tables. 
2a3f0 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72   nTabList is nor
2a400 6d 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 65 71 75  mally.    ** equ
2a410 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
2a420 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
2a430 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
2a440 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 57   if the.    ** W
2a450 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2a460 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  E flag is set.. 
2a470 20 20 20 2a 2f 0a 20 20 20 20 69 69 20 3d 20 30     */.    ii = 0
2a480 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
2a490 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b  createMask(pMask
2a4a0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
2a4b0 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
2a4c0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2a4d0 65 54 61 62 46 75 6e 63 41 72 67 73 28 70 50 61  eTabFuncArgs(pPa
2a4e0 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e  rse, &pTabList->
2a4f0 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e  a[ii], &pWInfo->
2a500 73 57 43 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  sWC);.    }while
2a510 28 20 28 2b 2b 69 69 29 3c 70 54 61 62 4c 69 73  ( (++ii)<pTabLis
2a520 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 23 69 66  t->nSrc );.  #if
2a530 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2a540 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 42 69 74  .    {.      Bit
2a550 6d 61 73 6b 20 6d 78 20 3d 20 30 3b 0a 20 20 20  mask mx = 0;.   
2a560 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2a570 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2a580 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42  ii++){.        B
2a590 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74  itmask m = sqlit
2a5a0 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70  e3WhereGetMask(p
2a5b0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
2a5c0 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
2a5d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2a5e0 74 28 20 6d 3e 3d 6d 78 20 29 3b 0a 20 20 20 20  t( m>=mx );.    
2a5f0 20 20 20 20 6d 78 20 3d 20 6d 3b 0a 20 20 20 20      mx = m;.    
2a600 20 20 7d 0a 20 20 20 20 7d 0a 20 20 23 65 6e 64    }.    }.  #end
2a610 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 41  if.  }.  .  /* A
2a620 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68  nalyze all of th
2a630 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
2a640 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68  . */.  sqlite3Wh
2a650 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70  ereExprAnalyze(p
2a660 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
2a670 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62  ->sWC);.  if( db
2a680 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2a690 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2a6a0 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 70 65  Error;..  /* Spe
2a6b0 63 69 61 6c 20 63 61 73 65 3a 20 57 48 45 52 45  cial case: WHERE
2a6c0 20 74 65 72 6d 73 20 74 68 61 74 20 64 6f 20 6e   terms that do n
2a6d0 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  ot refer to any 
2a6e0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
2a6f0 69 6e 0a 20 20 2a 2a 20 28 63 6f 6e 73 74 61 6e  in.  ** (constan
2a700 74 20 65 78 70 72 65 73 73 69 6f 6e 73 29 2e 20  t expressions). 
2a710 45 76 61 6c 75 61 74 65 20 65 61 63 68 20 73 75  Evaluate each su
2a720 63 68 20 74 65 72 6d 2c 20 61 6e 64 20 6a 75 6d  ch term, and jum
2a730 70 20 6f 76 65 72 20 61 6c 6c 20 74 68 65 0a 20  p over all the. 
2a740 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 63 6f   ** generated co
2a750 64 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  de if the result
2a760 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 20 0a   is not true.  .
2a770 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74    **.  ** Do not
2a780 20 64 6f 20 74 68 69 73 20 69 66 20 74 68 65 20   do this if the 
2a790 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
2a7a0 69 6e 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  ins non-determin
2a7b0 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 0a  istic functions.
2a7c0 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
2a7d0 74 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d 73  t within a sub-s
2a7e0 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20 6e  elect. This is n
2a7f0 6f 74 20 73 74 72 69 63 74 6c 79 20 72 65 71 75  ot strictly requ
2a800 69 72 65 64 2c 20 62 75 74 0a 20 20 2a 2a 20 70  ired, but.  ** p
2a810 72 65 73 65 72 76 65 73 20 53 51 4c 69 74 65 27  reserves SQLite'
2a820 73 20 6c 65 67 61 63 79 20 62 65 68 61 76 69 6f  s legacy behavio
2a830 75 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ur in the follow
2a840 69 6e 67 20 74 77 6f 20 63 61 73 65 73 3a 0a 20  ing two cases:. 
2a850 20 2a 2a 0a 20 20 2a 2a 20 20 20 46 52 4f 4d 20   **.  **   FROM 
2a860 2e 2e 2e 20 57 48 45 52 45 20 72 61 6e 64 6f 6d  ... WHERE random
2a870 28 29 3e 30 3b 20 20 20 20 20 20 20 20 20 20 20  ()>0;           
2a880 2d 2d 20 65 76 61 6c 20 72 61 6e 64 6f 6d 28 29  -- eval random()
2a890 20 6f 6e 63 65 20 70 65 72 20 72 6f 77 0a 20 20   once per row.  
2a8a0 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48  **   FROM ... WH
2a8b0 45 52 45 20 28 53 45 4c 45 43 54 20 72 61 6e 64  ERE (SELECT rand
2a8c0 6f 6d 28 29 29 3e 30 3b 20 20 2d 2d 20 65 76 61  om())>0;  -- eva
2a8d0 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20  l random() once 
2a8e0 6f 76 65 72 61 6c 6c 0a 20 20 2a 2f 0a 20 20 66  overall.  */.  f
2a8f0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42  or(ii=0; ii<sWLB
2a900 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  .pWC->nTerm; ii+
2a910 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72  +){.    WhereTer
2a920 6d 20 2a 70 54 20 3d 20 26 73 57 4c 42 2e 70 57  m *pT = &sWLB.pW
2a930 43 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 69 66  C->a[ii];.    if
2a940 28 20 70 54 2d 3e 77 74 46 6c 61 67 73 20 26 20  ( pT->wtFlags & 
2a950 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 63  TERM_VIRTUAL ) c
2a960 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2a970 20 70 54 2d 3e 70 72 65 72 65 71 41 6c 6c 3d 3d   pT->prereqAll==
2a980 30 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d  0 && (nTabList==
2a990 30 20 7c 7c 20 65 78 70 72 49 73 44 65 74 65 72  0 || exprIsDeter
2a9a0 6d 69 6e 69 73 74 69 63 28 70 54 2d 3e 70 45 78  ministic(pT->pEx
2a9b0 70 72 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71  pr)) ){.      sq
2a9c0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
2a9d0 28 70 50 61 72 73 65 2c 20 70 54 2d 3e 70 45 78  (pParse, pT->pEx
2a9e0 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  pr, pWInfo->iBre
2a9f0 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ak, SQLITE_JUMPI
2aa00 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54  FNULL);.      pT
2aa10 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
2aa20 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
2aa30 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46   }..  if( wctrlF
2aa40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
2aa50 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
2aa60 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
2aa70 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65  Redundant(pParse
2aa80 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  , pTabList, &pWI
2aa90 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c  nfo->sWC, pResul
2aaa0 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  tSet) ){.      /
2aab0 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d  * The DISTINCT m
2aac0 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c  arking is pointl
2aad0 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e  ess.  Ignore it.
2aae0 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   */.      pWInfo
2aaf0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
2ab00 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
2ab10 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  QUE;.    }else i
2ab20 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
2ab30 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74  {.      /* Try t
2ab40 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72  o ORDER BY the r
2ab50 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b  esult set to mak
2ab60 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65  e distinct proce
2ab70 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a  ssing easier */.
2ab80 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63        pWInfo->wc
2ab90 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  trlFlags |= WHER
2aba0 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20  E_DISTINCTBY;.  
2abb0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
2abc0 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65  erBy = pResultSe
2abd0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2abe0 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
2abf0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2ac00 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ts */.#if define
2ac10 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
2ac20 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69  BLED).  if( sqli
2ac30 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
2ac40 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 73 71  0xffff ){.    sq
2ac50 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2ac60 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
2ac70 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c  Start *** (wctrl
2ac80 46 6c 61 67 73 3a 20 30 78 25 78 22 2c 77 63 74  Flags: 0x%x",wct
2ac90 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  rlFlags);.    if
2aca0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2acb0 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29  HERE_USE_LIMIT )
2acc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2acd0 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 6c 69  ebugPrintf(", li
2ace0 6d 69 74 3a 20 25 64 22 2c 20 69 41 75 78 41 72  mit: %d", iAuxAr
2acf0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
2ad00 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2ad10 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  (")\n");.  }.  i
2ad20 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2ad30 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 20  race & 0x100 ){ 
2ad40 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74  /* Display all t
2ad50 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2ad60 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  E clause */.    
2ad70 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
2ad80 73 65 50 72 69 6e 74 28 73 57 4c 42 2e 70 57 43  sePrint(sWLB.pWC
2ad90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2ada0 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31   if( nTabList!=1
2adb0 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75   || whereShortCu
2adc0 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20  t(&sWLB)==0 ){. 
2add0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2ade0 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a  pAddAll(&sWLB);.
2adf0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2ae00 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2ae10 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45  r;.  .#ifdef WHE
2ae20 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
2ae30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2ae40 68 65 72 65 54 72 61 63 65 20 29 7b 20 20 20 20  hereTrace ){    
2ae50 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f  /* Display all o
2ae60 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
2ae70 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  objects */.     
2ae80 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
2ae90 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2aea0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
2aeb0 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22  har zLabel[] = "
2aec0 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
2aed0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
2aee0 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20  wyxz".          
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af10 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
2af20 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b  MNOPQRSTUVWYXZ";
2af30 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49  .      for(p=pWI
2af40 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30  nfo->pLoops, i=0
2af50 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c  ; p; p=p->pNextL
2af60 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  oop, i++){.     
2af70 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62     p->cId = zLab
2af80 65 6c 5b 69 25 28 73 69 7a 65 6f 66 28 7a 4c 61  el[i%(sizeof(zLa
2af90 62 65 6c 29 2d 31 29 5d 3b 0a 20 20 20 20 20 20  bel)-1)];.      
2afa0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
2afb0 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  (p, sWLB.pWC);. 
2afc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2afd0 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65  dif.  .    where
2afe0 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
2aff0 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  o, 0);.    if( d
2b000 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2b010 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2b020 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  nError;.    if( 
2b030 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
2b040 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65   ){.       where
2b050 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
2b060 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  o, pWInfo->nRowO
2b070 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66  ut+1);.       if
2b080 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2b090 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
2b0a0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
2b0b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
2b0c0 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  o->pOrderBy==0 &
2b0d0 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
2b0e0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
2b0f0 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70  er)!=0 ){.     p
2b100 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
2b110 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20   ALLBITS;.  }.  
2b120 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2b130 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61   || NEVER(db->ma
2b140 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20  llocFailed) ){. 
2b150 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
2b160 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66  inError;.  }.#if
2b170 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2b180 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2b190 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
2b1a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
2b1b0 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53  ugPrintf("---- S
2b1c0 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22  olution nRow=%d"
2b1d0 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
2b1e0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  t);.    if( pWIn
2b1f0 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  fo->nOBSat>0 ){.
2b200 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2b210 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52  ugPrintf(" ORDER
2b220 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70  BY=%d,0x%llx", p
2b230 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70  WInfo->nOBSat, p
2b240 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b  WInfo->revMask);
2b250 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
2b260 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  h( pWInfo->eDist
2b270 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61  inct ){.      ca
2b280 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
2b290 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20  T_UNIQUE: {.    
2b2a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2b2b0 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
2b2c0 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20  CT=unique");.   
2b2d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b2e0 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
2b2f0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
2b300 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
2b310 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2b320 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
2b330 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
2b340 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b350 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
2b360 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
2b370 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
2b380 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2b390 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
2b3a0 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  unordered");.   
2b3b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b3c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2b3d0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2b3e0 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ("\n");.    for(
2b3f0 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d  ii=0; ii<pWInfo-
2b400 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a  >nLevel; ii++){.
2b410 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
2b420 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69  rint(pWInfo->a[i
2b430 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e  i].pWLoop, sWLB.
2b440 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pWC);.    }.  }.
2b450 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 74  #endif..  /* Att
2b460 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62  empt to omit tab
2b470 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69  les from the joi
2b480 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61 66  n that do not af
2b490 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 2e  fect the result.
2b4a0 0a 20 20 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  .  ** For a tabl
2b4b0 65 20 74 6f 20 6e 6f 74 20 61 66 66 65 63 74 20  e to not affect 
2b4c0 74 68 65 20 72 65 73 75 6c 74 2c 20 74 68 65 20  the result, the 
2b4d0 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62  following must b
2b4e0 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  e true:.  **.  *
2b4f0 2a 20 20 20 31 29 20 54 68 65 20 71 75 65 72 79  *   1) The query
2b500 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 6e 20   must not be an 
2b510 61 67 67 72 65 67 61 74 65 2e 0a 20 20 2a 2a 20  aggregate..  ** 
2b520 20 20 32 29 20 54 68 65 20 74 61 62 6c 65 20 6d    2) The table m
2b530 75 73 74 20 62 65 20 74 68 65 20 52 48 53 20 6f  ust be the RHS o
2b540 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20  f a LEFT JOIN.. 
2b550 20 2a 2a 20 20 20 33 29 20 45 69 74 68 65 72 20   **   3) Either 
2b560 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 62  the query must b
2b570 65 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 20 65  e DISTINCT, or e
2b580 6c 73 65 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  lse the ON or US
2b590 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20  ING clause.  ** 
2b5a0 20 20 20 20 20 6d 75 73 74 20 63 6f 6e 74 61 69       must contai
2b5b0 6e 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  n a constraint t
2b5c0 68 61 74 20 6c 69 6d 69 74 73 20 74 68 65 20 73  hat limits the s
2b5d0 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  can of the table
2b5e0 20 74 6f 20 0a 20 20 2a 2a 20 20 20 20 20 20 61   to .  **      a
2b5f0 74 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65 20  t most a single 
2b600 72 6f 77 2e 0a 20 20 2a 2a 20 20 20 34 29 20 54  row..  **   4) T
2b610 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f  he table must no
2b620 74 20 62 65 20 72 65 66 65 72 65 6e 63 65 64 20  t be referenced 
2b630 62 79 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  by any part of t
2b640 68 65 20 71 75 65 72 79 20 61 70 61 72 74 0a 20  he query apart. 
2b650 20 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 69 74   **      from it
2b660 73 20 6f 77 6e 20 55 53 49 4e 47 20 6f 72 20 4f  s own USING or O
2b670 4e 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  N clause..  **. 
2b680 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c   ** For example,
2b690 20 67 69 76 65 6e 3a 0a 20 20 2a 2a 0a 20 20 2a   given:.  **.  *
2b6a0 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
2b6b0 4c 45 20 74 31 28 69 70 6b 20 49 4e 54 45 47 45  LE t1(ipk INTEGE
2b6c0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76  R PRIMARY KEY, v
2b6d0 31 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  1);.  **     CRE
2b6e0 41 54 45 20 54 41 42 4c 45 20 74 32 28 69 70 6b  ATE TABLE t2(ipk
2b6f0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2b700 20 4b 45 59 2c 20 76 32 29 3b 0a 20 20 2a 2a 20   KEY, v2);.  ** 
2b710 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2b720 20 74 33 28 69 70 6b 20 49 4e 54 45 47 45 52 20   t3(ipk INTEGER 
2b730 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 33 29  PRIMARY KEY, v3)
2b740 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 74 68 65 6e  ;.  **.  ** then
2b750 20 74 61 62 6c 65 20 74 32 20 63 61 6e 20 62 65   table t2 can be
2b760 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
2b770 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
2b780 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
2b790 54 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31  T v1, v3 FROM t1
2b7a0 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46   .  **       LEF
2b7b0 54 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 20  T JOIN t2 USING 
2b7c0 28 74 31 2e 69 70 6b 3d 74 32 2e 69 70 6b 29 0a  (t1.ipk=t2.ipk).
2b7d0 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20    **       LEFT 
2b7e0 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47 20 28 74  JOIN t3 USING (t
2b7f0 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20 20  1.ipk=t3.ipk).  
2b800 2a 2a 0a 20 20 2a 2a 20 6f 72 20 66 72 6f 6d 3a  **.  ** or from:
2b810 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
2b820 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 76  ELECT DISTINCT v
2b830 31 2c 20 76 33 20 46 52 4f 4d 20 74 31 20 0a 20  1, v3 FROM t1 . 
2b840 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a   **       LEFT J
2b850 4f 49 4e 20 74 32 0a 20 20 2a 2a 20 20 20 20 20  OIN t2.  **     
2b860 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20 55    LEFT JOIN t3 U
2b870 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33 2e  SING (t1.ipk=t3.
2b880 69 70 6b 29 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ipk).  */.  notR
2b890 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
2b8a0 29 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  )0;.  if( pWInfo
2b8b0 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26  ->nLevel>=2.   &
2b8c0 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 20  & pResultSet!=0 
2b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b8e0 20 67 75 61 72 61 6e 74 65 65 73 20 63 6f 6e 64   guarantees cond
2b8f0 69 74 69 6f 6e 20 28 31 29 20 61 62 6f 76 65 20  ition (1) above 
2b900 2a 2f 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  */.   && Optimiz
2b910 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
2b920 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
2b930 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 69  Join).  ){.    i
2b940 6e 74 20 69 3b 0a 20 20 20 20 42 69 74 6d 61 73  nt i;.    Bitmas
2b950 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69  k tabUsed = sqli
2b960 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74  te3WhereExprList
2b970 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2b980 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20  pResultSet);.   
2b990 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72   if( sWLB.pOrder
2b9a0 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55  By ){.      tabU
2b9b0 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68  sed |= sqlite3Wh
2b9c0 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65  ereExprListUsage
2b9d0 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e  (pMaskSet, sWLB.
2b9e0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d  pOrderBy);.    }
2b9f0 0a 20 20 20 20 66 6f 72 28 69 3d 70 57 49 6e 66  .    for(i=pWInf
2ba00 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d  o->nLevel-1; i>=
2ba10 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 57  1; i--){.      W
2ba20 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
2ba30 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 73 74   *pEnd;.      st
2ba40 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ba50 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
2ba60 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  pLoop = pWInfo->
2ba70 61 5b 69 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20  a[i].pWLoop;.   
2ba80 20 20 20 70 49 74 65 6d 20 3d 20 26 70 57 49 6e     pItem = &pWIn
2ba90 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2baa0 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 3b 0a 20 20  pLoop->iTab];.  
2bab0 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e      if( (pItem->
2bac0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
2bad0 5f 4c 45 46 54 29 3d 3d 30 20 29 20 63 6f 6e 74  _LEFT)==0 ) cont
2bae0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
2baf0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2bb00 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
2bb10 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  T)==0.       && 
2bb20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2bb30 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
2bb40 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
2bb50 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2bb60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2bb70 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70  (tabUsed & pLoop
2bb80 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29  ->maskSelf)!=0 )
2bb90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2bba0 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43   pEnd = sWLB.pWC
2bbb0 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e  ->a + sWLB.pWC->
2bbc0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  nTerm;.      for
2bbd0 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d  (pTerm=sWLB.pWC-
2bbe0 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20  >a; pTerm<pEnd; 
2bbf0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
2bc00 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
2bc10 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
2bc20 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 7b  >maskSelf)!=0 ){
2bc30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2bc40 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2bc50 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
2bc60 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
2bc70 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d 3e        || pTerm->
2bc80 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
2bc90 6e 54 61 62 6c 65 21 3d 70 49 74 65 6d 2d 3e 69  nTable!=pItem->i
2bca0 43 75 72 73 6f 72 0a 20 20 20 20 20 20 20 20 20  Cursor.         
2bcb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bcc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2bcd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2bce0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2bcf0 54 65 72 6d 3c 70 45 6e 64 20 29 20 63 6f 6e 74  Term<pEnd ) cont
2bd00 69 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52  inue;.      WHER
2bd10 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28  ETRACE(0xffff, (
2bd20 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63  "-> drop loop %c
2bd30 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c   not used\n", pL
2bd40 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20  oop->cId));.    
2bd50 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 70    notReady &= ~p
2bd60 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
2bd70 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
2bd80 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65  sWLB.pWC->a; pTe
2bd90 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  rm<pEnd; pTerm++
2bda0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
2bdb0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
2bdc0 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
2bdd0 6c 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  lf)!=0 ){.      
2bde0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
2bdf0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
2be00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2be10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 21    }.      if( i!
2be20 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
2be30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  1 ){.        int
2be40 20 6e 42 79 74 65 20 3d 20 28 70 57 49 6e 66 6f   nByte = (pWInfo
2be50 2d 3e 6e 4c 65 76 65 6c 2d 31 2d 69 29 20 2a 20  ->nLevel-1-i) * 
2be60 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
2be70 6c 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d  l);.        memm
2be80 6f 76 65 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  ove(&pWInfo->a[i
2be90 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 2b  ], &pWInfo->a[i+
2bea0 31 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  1], nByte);.    
2beb0 20 20 7d 0a 20 20 20 20 20 20 70 57 49 6e 66 6f    }.      pWInfo
2bec0 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20  ->nLevel--;.    
2bed0 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20    nTabList--;.  
2bee0 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
2bef0 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
2bf00 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
2bf10 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
2bf20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
2bf30 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70  >nQueryLoop += p
2bf40 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
2bf50 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
2bf60 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
2bf70 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
2bf80 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
2bf90 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
2bfa0 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
2bfb0 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
2bfc0 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
2bfd0 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
2bfe0 0a 20 20 2a 2a 20 41 20 6f 6e 65 2d 70 61 73 73  .  ** A one-pass
2bff0 20 61 70 70 72 6f 61 63 68 20 63 61 6e 20 62 65   approach can be
2c000 20 75 73 65 64 20 69 66 20 74 68 65 20 63 61 6c   used if the cal
2c010 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65  ler has requeste
2c020 64 20 6f 6e 65 0a 20 20 2a 2a 20 61 6e 64 20 65  d one.  ** and e
2c030 69 74 68 65 72 20 28 61 29 20 74 68 65 20 73 63  ither (a) the sc
2c040 61 6e 20 76 69 73 69 74 73 20 61 74 20 6d 6f 73  an visits at mos
2c050 74 20 6f 6e 65 20 72 6f 77 20 6f 72 20 28 62 29  t one row or (b)
2c060 20 65 61 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68   each.  ** of th
2c070 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
2c080 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
2c090 20 20 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 68    * the caller h
2c0a0 61 73 20 69 6e 64 69 63 61 74 65 64 20 74 68 61  as indicated tha
2c0b0 74 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70  t a one-pass app
2c0c0 72 6f 61 63 68 20 63 61 6e 20 62 65 20 75 73 65  roach can be use
2c0d0 64 0a 20 20 2a 2a 20 20 20 20 20 77 69 74 68 20  d.  **     with 
2c0e0 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 28 62  multiple rows (b
2c0f0 79 20 73 65 74 74 69 6e 67 20 57 48 45 52 45 5f  y setting WHERE_
2c100 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
2c110 29 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20  ), and.  **   * 
2c120 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  the table is not
2c130 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2c140 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 65  , and.  **   * e
2c150 69 74 68 65 72 20 74 68 65 20 73 63 61 6e 20 64  ither the scan d
2c160 6f 65 73 20 6e 6f 74 20 75 73 65 20 74 68 65 20  oes not use the 
2c170 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
2c180 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20  or the caller.  
2c190 2a 2a 20 20 20 20 20 69 73 20 61 20 44 45 4c 45  **     is a DELE
2c1a0 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 28 57 48  TE operation (WH
2c1b0 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
2c1c0 4b 20 69 73 20 6f 6e 6c 79 20 73 70 65 63 69 66  K is only specif
2c1d0 69 65 64 0a 20 20 2a 2a 20 20 20 20 20 66 6f 72  ied.  **     for
2c1e0 20 44 45 4c 45 54 45 29 2e 0a 20 20 2a 2a 0a 20   DELETE)..  **. 
2c1f0 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 71 75 61   ** The last qua
2c200 6c 69 66 69 63 61 74 69 6f 6e 20 69 73 20 62 65  lification is be
2c210 63 61 75 73 65 20 61 6e 20 55 50 44 41 54 45 20  cause an UPDATE 
2c220 73 74 61 74 65 6d 65 6e 74 20 75 73 65 73 0a 20  statement uses. 
2c230 20 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61 69   ** WhereInfo.ai
2c240 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 74 6f  CurOnePass[1] to
2c250 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
2c260 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 72 65 61  er or not it rea
2c270 6c 6c 79 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65  lly can.  ** use
2c280 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72   a one-pass appr
2c290 6f 61 63 68 2c 20 61 6e 64 20 74 68 69 73 20 69  oach, and this i
2c2a0 73 20 6e 6f 74 20 73 65 74 20 61 63 63 75 72 61  s not set accura
2c2b0 74 65 6c 79 20 66 6f 72 20 73 63 61 6e 73 0a 20  tely for scans. 
2c2c0 20 2a 2a 20 74 68 61 74 20 75 73 65 20 74 68 65   ** that use the
2c2d0 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
2c2e0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2c2f0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2c300 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2c310 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
2c320 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
2c330 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
2c340 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2c350 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29  SS_DESIRED)!=0 )
2c360 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  {.    int wsFlag
2c370 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  s = pWInfo->a[0]
2c380 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
2c390 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f  ;.    int bOnero
2c3a0 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57  w = (wsFlags & W
2c3b0 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b  HERE_ONEROW)!=0;
2c3c0 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77  .    if( bOnerow
2c3d0 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 30 21   || (.        0!
2c3e0 3d 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  =(wctrlFlags & W
2c3f0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c  HERE_ONEPASS_MUL
2c400 54 49 52 4f 57 29 0a 20 20 20 20 20 26 26 20 30  TIROW).     && 0
2c410 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  ==(wsFlags & WHE
2c420 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
2c430 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 77 73  .     && (0==(ws
2c440 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
2c450 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72  LTI_OR) || (wctr
2c460 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
2c470 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 29 0a 20  UPLICATES_OK)). 
2c480 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 57 49     )){.      pWI
2c490 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20  nfo->eOnePass = 
2c4a0 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53  bOnerow ? ONEPAS
2c4b0 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41  S_SINGLE : ONEPA
2c4c0 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20  SS_MULTI;.      
2c4d0 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
2c4e0 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
2c4f0 29 20 26 26 20 28 77 73 46 6c 61 67 73 20 26 20  ) && (wsFlags & 
2c500 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
2c510 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  ){.        if( w
2c520 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2c530 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52  E_ONEPASS_MULTIR
2c540 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
2c550 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46  bFordelete = OPF
2c560 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20  LAG_FORDELETE;. 
2c570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c580 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
2c590 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
2c5a0 28 77 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52  (wsFlags & ~WHER
2c5b0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20  E_IDX_ONLY);.   
2c5c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2c5d0 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
2c5e0 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
2c5f0 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
2c600 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
2c610 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
2c620 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
2c630 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20   */.  for(ii=0, 
2c640 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
2c650 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
2c660 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
2c670 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
2c680 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
2c690 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
2c6a0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
2c6b0 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
2c6c0 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
2c6d0 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
2c6e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2c6f0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a  item *pTabItem;.
2c700 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
2c710 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
2c720 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
2c730 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d   pTab = pTabItem
2c740 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20  ->pTab;.    iDb 
2c750 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2c760 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
2c770 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70  >pSchema);.    p
2c780 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
2c790 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28  WLoop;.    if( (
2c7a0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2c7b0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
2c7c0 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
2c7d0 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  ct ){.      /* D
2c7e0 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
2c7f0 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53   }else.#ifndef S
2c800 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2c810 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
2c820 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2c830 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2c840 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
2c850 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56    const char *pV
2c860 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Tab = (const cha
2c870 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54  r *)sqlite3GetVT
2c880 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
2c890 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
2c8a0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2c8b0 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
2c8c0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2c8d0 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30  P_VOpen, iCur, 0
2c8e0 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56  , 0, pVTab, P4_V
2c8f0 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TAB);.    }else 
2c900 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
2c910 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ab) ){.      /* 
2c920 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  noop */.    }els
2c930 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2c940 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2c950 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2c960 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  Y)==0.         &
2c970 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
2c980 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2c990 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)==0 ){.      
2c9a0 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e  int op = OP_Open
2c9b0 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20  Read;.      if( 
2c9c0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2c9d0 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b  !=ONEPASS_OFF ){
2c9e0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
2c9f0 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
2ca00 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75      pWInfo->aiCu
2ca10 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54  rOnePass[0] = pT
2ca20 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
2ca30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
2ca40 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
2ca50 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
2ca60 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c  m->iCursor, iDb,
2ca70 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20   pTab, op);.    
2ca80 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74    assert( pTabIt
2ca90 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65  em->iCursor==pLe
2caa0 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a  vel->iTabCur );.
2cab0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2cac0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2cad0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
2cae0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
2caf0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
2cb00 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  case( pWInfo->eO
2cb10 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
2cb20 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  OFF && pTab->nCo
2cb30 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
2cb40 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
2cb50 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2cb60 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c  F && pTab->nCol<
2cb70 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64 28  BMS && HasRowid(
2cb80 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
2cb90 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
2cba0 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
2cbb0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
2cbc0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
2cbd0 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
2cbe0 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
2cbf0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
2cc00 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54  , -1, SQLITE_INT
2cc10 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49  _TO_PTR(n), P4_I
2cc20 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61  NT32);.        a
2cc30 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e  ssert( n<=pTab->
2cc40 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a  nCol );.      }.
2cc50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2cc60 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
2cc70 53 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  S.      if( pLoo
2cc80 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2cc90 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x!=0 ){.        
2cca0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2ccb0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45  eP5(v, OPFLAG_SE
2ccc0 45 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29  EKEQ|bFordelete)
2ccd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
2cce0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
2ccf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cd00 43 68 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72  ChangeP5(v, bFor
2cd10 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d  delete);.      }
2cd20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2cd30 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
2cd40 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c  D_MASK.      sql
2cd50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
2cd60 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73  p8(v, OP_Columns
2cd70 55 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e  Used, pTabItem->
2cd80 69 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20  iCursor, 0, 0,. 
2cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cda0 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
2cdb0 74 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d  t u8*)&pTabItem-
2cdc0 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54  >colUsed, P4_INT
2cdd0 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  64);.#endif.    
2cde0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2cdf0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
2ce00 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
2ce10 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
2ce20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
2ce30 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2ce40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
2ce50 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e  EXED ){.      In
2ce60 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70  dex *pIx = pLoop
2ce70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2ce80 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64  ;.      int iInd
2ce90 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74  exCur;.      int
2cea0 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61   op = OP_OpenRea
2ceb0 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 41 75 78  d;.      /* iAux
2cec0 41 72 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  Arg is always se
2ced0 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20  t to a positive 
2cee0 76 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53  value if ONEPASS
2cef0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   is possible */.
2cf00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 41        assert( iA
2cf10 75 78 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49  uxArg!=0 || (pWI
2cf20 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2cf30 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2cf40 44 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20  DESIRED)==0 );. 
2cf50 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
2cf60 69 64 28 70 54 61 62 29 20 26 26 20 49 73 50 72  id(pTab) && IsPr
2cf70 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
2cf80 78 29 0a 20 20 20 20 20 20 20 26 26 20 28 77 63  x).       && (wc
2cf90 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2cfa0 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d  _OR_SUBCLAUSE)!=
2cfb0 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
2cfc0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e     /* This is on
2cfd0 65 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d  e term of an OR-
2cfe0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69  optimization usi
2cff0 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
2d000 45 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20  EY of a.        
2d010 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  ** WITHOUT ROWID
2d020 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64   table.  No need
2d030 20 66 6f 72 20 61 20 73 65 70 61 72 61 74 65 20   for a separate 
2d040 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
2d050 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65   iIndexCur = pLe
2d060 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20  vel->iTabCur;.  
2d070 20 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20        op = 0;.  
2d080 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
2d090 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
2d0a0 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
2d0b0 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a         Index *pJ
2d0c0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2d0d0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
2d0e0 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69     iIndexCur = i
2d0f0 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20  AuxArg;.        
2d100 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61  assert( wctrlFla
2d110 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2d120 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20  SS_DESIRED );.  
2d130 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
2d140 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70  AYS(pJ) && pJ!=p
2d150 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Ix ){.          
2d160 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20  iIndexCur++;.   
2d170 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e         pJ = pJ->
2d180 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
2d190 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
2d1a0 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
2d1b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75      pWInfo->aiCu
2d1c0 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49  rOnePass[1] = iI
2d1d0 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d  ndexCur;.      }
2d1e0 65 6c 73 65 20 69 66 28 20 69 41 75 78 41 72 67  else if( iAuxArg
2d1f0 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
2d200 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2d210 41 55 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  AUSE)!=0 ){.    
2d220 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
2d230 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20  iAuxArg;.       
2d240 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49   op = OP_ReopenI
2d250 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dx;.      }else{
2d260 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
2d270 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
2d280 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b++;.      }.   
2d290 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
2d2a0 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  ur = iIndexCur;.
2d2b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2d2c0 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
2d2d0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
2d2e0 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65     assert( iInde
2d2f0 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
2d300 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20   if( op ){.     
2d310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d320 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64  dOp3(v, op, iInd
2d330 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  exCur, pIx->tnum
2d340 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
2d350 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
2d360 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
2d370 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pIx);.        if
2d380 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2d390 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
2d3a0 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20  AINT)!=0.       
2d3b0 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
2d3c0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
2d3d0 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
2d3e0 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20  _SKIPSCAN))==0. 
2d3f0 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
2d400 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57  fo->wctrlFlags&W
2d410 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
2d420 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2d430 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2d440 63 74 21 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  ct!=WHERE_DISTIN
2d450 43 54 5f 4f 52 44 45 52 45 44 0a 20 20 20 20 20  CT_ORDERED.     
2d460 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2d470 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2d480 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45  eP5(v, OPFLAG_SE
2d490 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74  EKEQ); /* Hint t
2d4a0 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20  o COMDB2 */.    
2d4b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64      }.        Vd
2d4c0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
2d4d0 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29  s", pIx->zName))
2d4e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2d4f0 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
2d500 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20  ED_MASK.        
2d510 7b 0a 20 20 20 20 20 20 20 20 20 20 75 36 34 20  {.          u64 
2d520 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20  colUsed = 0;.   
2d530 20 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a         int ii, j
2d540 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  j;.          for
2d550 28 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e  (ii=0; ii<pIx->n
2d560 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20  Column; ii++){. 
2d570 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
2d580 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69  pIx->aiColumn[ii
2d590 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
2d5a0 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e  f( jj<0 ) contin
2d5b0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2d5c0 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d  if( jj>63 ) jj =
2d5d0 20 36 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20   63;.           
2d5e0 20 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e   if( (pTabItem->
2d5f0 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
2d600 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74  T(jj))==0 ) cont
2d610 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2d620 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75    colUsed |= ((u
2d630 36 34 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20  64)1)<<(ii<63 ? 
2d640 69 69 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20  ii : 63);.      
2d650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d660 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d670 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
2d680 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43  mnsUsed, iIndexC
2d690 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ur, 0, 0,.      
2d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6b0 20 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 26            (u8*)&
2d6c0 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36  colUsed, P4_INT6
2d6d0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  4);.        }.#e
2d6e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
2d6f0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
2d700 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20  D_MASK */.      
2d710 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2d720 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33  iDb>=0 ) sqlite3
2d730 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
2d740 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
2d750 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
2d760 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
2d770 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2d780 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2d790 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
2d7a0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
2d7b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
2d7c0 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
2d7d0 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
2d7e0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
2d7f0 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
2d800 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
2d810 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
2d820 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
2d830 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
2d840 6d 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  m..  */.  for(ii
2d850 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  =0; ii<nTabList;
2d860 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   ii++){.    int 
2d870 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20  addrExplain;.   
2d880 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20 20   int wsFlags;.  
2d890 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
2d8a0 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77  fo->a[ii];.    w
2d8b0 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d  sFlags = pLevel-
2d8c0 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
2d8d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2d8e0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
2d8f0 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70  INDEX.    if( (p
2d900 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77  Level->pWLoop->w
2d910 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
2d920 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  UTO_INDEX)!=0 ){
2d930 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74  .      construct
2d940 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
2d950 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e  Parse, &pWInfo->
2d960 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sWC,.           
2d970 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e       &pTabList->
2d980 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2d990 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
2d9a0 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  el);.      if( d
2d9b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2d9c0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2d9d0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65  nError;.    }.#e
2d9e0 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45 78 70  ndif.    addrExp
2d9f0 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68  lain = sqlite3Wh
2da00 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61  ereExplainOneSca
2da10 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  n(.        pPars
2da20 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  e, pTabList, pLe
2da30 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d  vel, ii, pLevel-
2da40 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61  >iFrom, wctrlFla
2da50 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 4c  gs.    );.    pL
2da60 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d  evel->addrBody =
2da70 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2da80 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2da90 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69 74  notReady = sqlit
2daa0 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f  e3WhereCodeOneLo
2dab0 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
2dac0 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20  ii, notReady);. 
2dad0 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
2dae0 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
2daf0 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28  ddrCont;.    if(
2db00 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f   (wsFlags&WHERE_
2db10 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20  MULTI_OR)==0 && 
2db20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
2db30 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
2db40 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2db50 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53  te3WhereAddScanS
2db60 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73  tatus(v, pTabLis
2db70 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45  t, pLevel, addrE
2db80 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  xplain);.    }. 
2db90 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a   }..  /* Done. *
2dba0 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
2dbb0 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
2dbc0 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
2dbd0 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
2dbe0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
2dbf0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
2dc00 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
2dc10 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
2dc20 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
2dc30 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
2dc40 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2dc50 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
2dc60 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
2dc70 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
2dc80 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
2dc90 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
2dca0 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
2dcb0 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
2dcc0 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
2dcd0 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
2dce0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2dcf0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
2dd00 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2dd10 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2dd20 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
2dd30 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
2dd40 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
2dd50 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2dd60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
2dd70 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
2dd80 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
2dd90 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  op;.  SrcList *p
2dda0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2ddb0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71  ->pTabList;.  sq
2ddc0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2ddd0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65  se->db;..  /* Ge
2dde0 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d  nerate loop term
2ddf0 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20  ination code..  
2de00 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  */.  VdbeModuleC
2de10 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
2de20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20  WHERE-core"));. 
2de30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2de40 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2de50 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
2de60 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
2de70 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  i--){.    int ad
2de80 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  dr;.    pLevel =
2de90 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
2dea0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
2deb0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
2dec0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
2ded0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 23 69 66 6e 64  OP_Noop ){.#ifnd
2dee0 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2def0 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54  E_SKIPAHEAD_DIST
2df00 49 4e 43 54 0a 20 20 20 20 20 20 69 6e 74 20 61  INCT.      int a
2df10 64 64 72 53 65 65 6b 20 3d 20 30 3b 0a 20 20 20  ddrSeek = 0;.   
2df20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
2df30 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
2df40 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65     if( pWInfo->e
2df50 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
2df60 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
2df70 0a 20 20 20 20 20 20 20 26 26 20 69 3d 3d 70 57  .       && i==pW
2df80 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20 20  Info->nLevel-1  
2df90 2f 2a 20 54 69 63 6b 65 74 20 5b 65 66 39 33 31  /* Ticket [ef931
2dfa0 38 37 35 37 62 31 35 32 65 33 5d 20 32 30 31 37  8757b152e3] 2017
2dfb0 2d 31 30 2d 32 31 20 2a 2f 0a 20 20 20 20 20 20  -10-21 */.      
2dfc0 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
2dfd0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
2dfe0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26  XED)!=0.       &
2dff0 26 20 28 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d  & (pIdx = pLoop-
2e000 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
2e010 2d 3e 68 61 73 53 74 61 74 31 0a 20 20 20 20 20  ->hasStat1.     
2e020 20 20 26 26 20 28 6e 20 3d 20 70 4c 6f 6f 70 2d    && (n = pLoop-
2e030 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c  >u.btree.nIdxCol
2e040 29 3e 30 0a 20 20 20 20 20 20 20 26 26 20 70 49  )>0.       && pI
2e050 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  dx->aiRowLogEst[
2e060 6e 5d 3e 3d 33 36 0a 20 20 20 20 20 20 29 7b 0a  n]>=36.      ){.
2e070 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
2e080 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2e090 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20  .        int j, 
2e0a0 6f 70 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  op;.        for(
2e0b0 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a  j=0; j<n; j++){.
2e0c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e0d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2e0e0 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4c 65 76 65 6c  P_Column, pLevel
2e0f0 2d 3e 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 31  ->iIdxCur, j, r1
2e100 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
2e110 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
2e120 4d 65 6d 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20  Mem += n+1;.    
2e130 20 20 20 20 6f 70 20 3d 20 70 4c 65 76 65 6c 2d      op = pLevel-
2e140 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 20 3f 20 4f  >op==OP_Prev ? O
2e150 50 5f 53 65 65 6b 4c 54 20 3a 20 4f 50 5f 53 65  P_SeekLT : OP_Se
2e160 65 6b 47 54 3b 0a 20 20 20 20 20 20 20 20 61 64  ekGT;.        ad
2e170 64 72 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33  drSeek = sqlite3
2e180 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
2e190 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64   op, pLevel->iId
2e1a0 78 43 75 72 2c 20 30 2c 20 72 31 2c 20 6e 29 3b  xCur, 0, r1, n);
2e1b0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
2e1c0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
2e1d0 50 5f 53 65 65 6b 4c 54 29 3b 0a 20 20 20 20 20  P_SeekLT);.     
2e1e0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2e1f0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
2e200 47 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  GT);.        sql
2e210 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2e220 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 70 4c  , OP_Goto, 1, pL
2e230 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20  evel->p2);.     
2e240 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
2e250 49 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50  ITE_DISABLE_SKIP
2e260 41 48 45 41 44 5f 44 49 53 54 49 4e 43 54 20 2a  AHEAD_DISTINCT *
2e270 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  /.      /* The c
2e280 6f 6d 6d 6f 6e 20 63 61 73 65 3a 20 41 64 76 61  ommon case: Adva
2e290 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
2e2a0 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  row */.      sql
2e2b0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2e2c0 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
2e2d0 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 20  addrCont);.     
2e2e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e2f0 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p3(v, pLevel->op
2e300 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
2e310 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c  evel->p2, pLevel
2e320 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p3);.      sql
2e330 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2e340 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
2e350 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
2e360 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
2e370 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
2e380 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e  pLevel->op==OP_N
2e390 65 78 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ext);.      Vdbe
2e3a0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
2e3b0 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65  evel->op==OP_Pre
2e3c0 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
2e3d0 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
2e3e0 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74  el->op==OP_VNext
2e3f0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2e400 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48  E_DISABLE_SKIPAH
2e410 45 41 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20  EAD_DISTINCT.   
2e420 20 20 20 69 66 28 20 61 64 64 72 53 65 65 6b 20     if( addrSeek 
2e430 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
2e440 70 48 65 72 65 28 76 2c 20 61 64 64 72 53 65 65  pHere(v, addrSee
2e450 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  k);.#endif.    }
2e460 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2e470 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2e480 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
2e490 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a  ddrCont);.    }.
2e4a0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
2e4b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2e4c0 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c  N_ABLE && pLevel
2e4d0 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a  ->u.in.nIn>0 ){.
2e4e0 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
2e4f0 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
2e500 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
2e510 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2e520 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
2e530 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
2e540 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e  for(j=pLevel->u.
2e550 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  in.nIn, pIn=&pLe
2e560 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
2e570 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
2e580 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
2e590 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2e5a0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
2e5b0 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
2e5c0 20 20 20 20 69 66 28 20 70 49 6e 2d 3e 65 45 6e      if( pIn->eEn
2e5d0 64 4c 6f 6f 70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70  dLoopOp!=OP_Noop
2e5e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2e5f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e600 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
2e610 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  Op, pIn->iCur, p
2e620 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
2e630 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2e640 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2e650 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2e660 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64  eIf(v, pIn->eEnd
2e670 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49  LoopOp==OP_PrevI
2e680 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  fOpen);.        
2e690 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2e6a0 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
2e6b0 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70  pOp==OP_NextIfOp
2e6c0 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  en);.        }. 
2e6d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2e6e0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
2e6f0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b  n->addrInTop-1);
2e700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e710 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2e720 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
2e730 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
2e740 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2e750 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20  addrSkip ){.    
2e760 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
2e770 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  o(v, pLevel->add
2e780 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64  rSkip);.      Vd
2e790 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
2e7a0 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e  ext skip-scan on
2e7b0 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62   %s", pLoop->u.b
2e7c0 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
2e7d0 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
2e7e0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2e7f0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
2e800 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  kip);.      sqli
2e810 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2e820 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
2e830 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 23 69  kip-2);.    }.#i
2e840 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b  fndef SQLITE_LIK
2e850 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42  E_DOESNT_MATCH_B
2e860 4c 4f 42 53 0a 20 20 20 20 69 66 28 20 70 4c 65  LOBS.    if( pLe
2e870 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70  vel->addrLikeRep
2e880 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e890 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2e8a0 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
2e8b0 28 69 6e 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c  (int)(pLevel->iL
2e8c0 69 6b 65 52 65 70 43 6e 74 72 3e 3e 31 29 2c 0a  ikeRepCntr>>1),.
2e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8e0 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
2e8f0 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20  addrLikeRep);.  
2e900 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2e910 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  (v);.    }.#endi
2e920 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  f.    if( pLevel
2e930 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
2e940 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c       int ws = pL
2e950 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
2e960 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
2e970 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2e980 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c  OP_IfPos, pLevel
2e990 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64  ->iLeftJoin); Vd
2e9a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2e9b0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 77 73       assert( (ws
2e9c0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2e9d0 59 29 3d 3d 30 20 7c 7c 20 28 77 73 20 26 20 57  Y)==0 || (ws & W
2e9e0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
2e9f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77   );.      if( (w
2ea00 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2ea10 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
2ea20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
2ea30 2d 3e 69 54 61 62 43 75 72 3d 3d 70 54 61 62 4c  ->iTabCur==pTabL
2ea40 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2ea50 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 20 29 3b  From].iCursor );
2ea60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ea70 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2ea80 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
2ea90 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 20 20  ->iTabCur);.    
2eaa0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77    }.      if( (w
2eab0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2eac0 44 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 28  D) .       || ((
2ead0 77 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  ws & WHERE_MULTI
2eae0 5f 4f 52 29 20 26 26 20 70 4c 65 76 65 6c 2d 3e  _OR) && pLevel->
2eaf0 75 2e 70 43 6f 76 69 64 78 29 20 0a 20 20 20 20  u.pCovidx) .    
2eb00 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
2eb10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2eb20 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
2eb30 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
2eb40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2eb50 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  ( pLevel->op==OP
2eb60 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20  _Return ){.     
2eb70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2eb80 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2eb90 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
2eba0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
2ebb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2ebc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ebd0 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c  beGoto(v, pLevel
2ebe0 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
2ebf0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2ec00 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2ec10 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a  v, addr);.    }.
2ec20 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f      VdbeModuleCo
2ec30 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57  mment((v, "End W
2ec40 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22  HERE-loop%d: %s"
2ec50 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , i,.           
2ec60 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
2ec70 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2ec80 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61  evel->iFrom].pTa
2ec90 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  b->zName));.  }.
2eca0 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
2ecb0 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
2ecc0 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
2ecd0 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
2ece0 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
2ecf0 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
2ed00 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2ed10 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
2ed20 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  eak);..  assert(
2ed30 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c   pWInfo->nLevel<
2ed40 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  =pTabList->nSrc 
2ed50 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  );.  for(i=0, pL
2ed60 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
2ed70 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
2ed80 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
2ed90 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73  {.    int k, las
2eda0 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  t;.    VdbeOp *p
2edb0 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  Op;.    Index *p
2edc0 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  Idx = 0;.    str
2edd0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2ede0 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54   *pTabItem = &pT
2edf0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2ee00 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61  ->iFrom];.    Ta
2ee10 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
2ee20 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
2ee30 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
2ee40 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  );.    pLoop = p
2ee50 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a  Level->pWLoop;..
2ee60 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d      /* For a co-
2ee70 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20  routine, change 
2ee80 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65  all OP_Column re
2ee90 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
2eea0 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20  table of.    ** 
2eeb0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  the co-routine i
2eec0 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72  nto OP_Copy of r
2eed0 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20  esult contained 
2eee0 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20  in a register.. 
2eef0 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62     ** OP_Rowid b
2ef00 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a  ecomes OP_Null..
2ef10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2ef20 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  TabItem->fg.viaC
2ef30 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
2ef40 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 72    testcase( pPar
2ef50 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2ef60 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 74 72  iled );.      tr
2ef70 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43  anslateColumnToC
2ef80 6f 70 79 28 70 50 61 72 73 65 2c 20 70 4c 65 76  opy(pParse, pLev
2ef90 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c  el->addrBody, pL
2efa0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20  evel->iTabCur,. 
2efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efc0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 49             pTabI
2efd0 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20  tem->regResult, 
2efe0 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  0);.      contin
2eff0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
2f000 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75  * If this scan u
2f010 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61  ses an index, ma
2f020 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62  ke VDBE code sub
2f030 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
2f040 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
2f050 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
2f060 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68  stead of from th
2f070 65 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f  e table where po
2f080 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65  ssible.  In some
2f090 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68   cases.    ** th
2f0a0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
2f0b0 70 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62  prevents the tab
2f0c0 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69  le from ever bei
2f0d0 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63  ng read, which c
2f0e0 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20  an.    ** yield 
2f0f0 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65  a significant pe
2f100 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e  rformance boost.
2f110 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
2f120 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
2f130 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
2f140 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
2f150 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
2f160 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
2f170 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
2f180 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
2f190 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
2f1a0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
2f1b0 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
2f1c0 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
2f1d0 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
2f1e0 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
2f1f0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
2f200 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
2f210 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
2f220 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
2f230 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
2f240 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
2f250 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
2f260 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
2f270 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44  INDEXED|WHERE_ID
2f280 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20  X_ONLY) ){.     
2f290 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
2f2a0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
2f2b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f     }else if( pLo
2f2c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2f2d0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
2f2e0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65        pIdx = pLe
2f2f0 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a  vel->u.pCovidx;.
2f300 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
2f310 64 78 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e  dx.     && (pWIn
2f320 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
2f330 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61  EPASS_OFF || !Ha
2f340 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61  sRowid(pIdx->pTa
2f350 62 6c 65 29 29 0a 20 20 20 20 20 26 26 20 21 64  ble)).     && !d
2f360 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
2f370 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6c 61 73      ){.      las
2f380 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
2f390 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2f3a0 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d       k = pLevel-
2f3b0 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20  >addrBody;.     
2f3c0 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
2f3d0 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20  beGetOp(v, k);. 
2f3e0 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73       for(; k<las
2f3f0 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; k++, pOp++){.
2f400 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
2f410 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
2f420 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
2f430 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
2f440 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
2f450 75 6d 6e 0a 23 69 66 64 65 66 20 53 51 4c 49 54  umn.#ifdef SQLIT
2f460 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f  E_ENABLE_OFFSET_
2f470 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 20  SQL_FUNC.       
2f480 20 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65    || pOp->opcode
2f490 3d 3d 4f 50 5f 4f 66 66 73 65 74 0a 23 65 6e 64  ==OP_Offset.#end
2f4a0 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  if.        ){.  
2f4b0 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
2f4c0 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
2f4d0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
2f4e0 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  >pTable==pTab );
2f4f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2f500 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
2f510 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  {.            In
2f520 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
2f530 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
2f540 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
2f550 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69       x = pPk->ai
2f560 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20  Column[x];.     
2f570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78         assert( x
2f580 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  >=0 );.         
2f590 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d   }.          x =
2f5a0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
2f5b0 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a  Index(pIdx, x);.
2f5c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e            if( x>
2f5d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2f5e0 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20    pOp->p2 = x;. 
2f5f0 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
2f600 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
2f610 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
2f620 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
2f630 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
2f640 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2f650 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30  ONLY)==0 || x>=0
2f660 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2f670 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  || pWInfo->eOneP
2f680 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ass );.        }
2f690 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
2f6a0 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
2f6b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
2f6c0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
2f6d0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
2f6e0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
2f6f0 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
2f700 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
2f710 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66  p->opcode==OP_If
2f720 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20  NullRow ){.     
2f730 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
2f740 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
2f750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f760 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2f770 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
2f780 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e    */.  pParse->n
2f790 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
2f7a0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
2f7b0 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  oop;.  whereInfo
2f7c0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2f7d0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.