/ Hex Artifact Content
Login

Artifact d6e5f2056e9a60251e79780fc598a5943e88a3c0fa0019d54922e59f99019287:


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 73      ){.        s
1bf30 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1bf40 50 61 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49  Parse,"%s.xBestI
1bf50 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ndex malfunction
1bf60 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e  ",pSrc->pTab->zN
1bf70 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ame);.        te
1bf80 73 74 63 61 73 65 28 20 70 49 64 78 49 6e 66 6f  stcase( pIdxInfo
1bf90 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1bfa0 74 72 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  tr );.        re
1bfb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1bfc0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
1bfd0 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
1bfe0 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20  ==nConstraint-1 
1bff0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c000 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
1c010 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57   testcase( j==pW
1c020 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20  C->nTerm-1 );.  
1c030 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
1c040 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e  ->a[j];.      pN
1c050 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54  ew->prereq |= pT
1c060 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
1c070 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c080 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c  iTerm<pNew->nLSl
1c090 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ot );.      pNew
1c0a0 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20  ->aLTerm[iTerm] 
1c0b0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  = pTerm;.      i
1c0c0 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
1c0d0 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
1c0e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c0f0 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20  ( iTerm==15 );. 
1c100 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1c110 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
1c120 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26    if( iTerm<16 &
1c130 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  & pUsage[i].omit
1c140 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e   ) pNew->u.vtab.
1c150 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  omitMask |= 1<<i
1c160 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  Term;.      if( 
1c170 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
1c180 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
1c190 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69  .        /* A vi
1c1a0 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74  rtual table that
1c1b0 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
1c1c0 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20  by an IN clause 
1c1d0 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  may not.        
1c1e0 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
1c1f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
1c200 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
1c210 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
1c220 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  .        ** is n
1c230 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72  ot necessarily r
1c240 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72  elated to the or
1c250 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65  der of output te
1c260 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  rms and.        
1c270 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
1c280 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
1c290 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
1c2a0 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
1c2b0 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65        ** togethe
1c2c0 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  r.  */.        p
1c2d0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
1c2e0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
1c2f0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
1c300 69 64 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c  idxFlags &= ~SQL
1c310 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55  ITE_INDEX_SCAN_U
1c320 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a  NIQUE;.        *
1c330 70 62 49 6e 20 3d 20 31 3b 20 61 73 73 65 72 74  pbIn = 1; assert
1c340 28 20 28 6d 45 78 63 6c 75 64 65 20 26 20 57 4f  ( (mExclude & WO
1c350 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  _IN)==0 );.     
1c360 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
1c370 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
1c380 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69 74  Mask &= ~mNoOmit
1c390 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  ;..  pNew->nLTer
1c3a0 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20  m = mxTerm+1;.  
1c3b0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 54 65  for(i=0; i<=mxTe
1c3c0 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rm; i++){.    if
1c3d0 28 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ( pNew->aLTerm[i
1c3e0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ]==0 ){.      /*
1c3f0 20 54 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 61 72   The non-zero ar
1c400 67 76 49 64 78 20 76 61 6c 75 65 73 20 6d 75 73  gvIdx values mus
1c410 74 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 2e  t be contiguous.
1c420 20 20 52 61 69 73 65 20 61 6e 0a 20 20 20 20 20    Raise an.     
1c430 20 2a 2a 20 65 72 72 6f 72 20 69 66 20 74 68 65   ** error if the
1c440 79 20 61 72 65 20 6e 6f 74 20 2a 2f 0a 20 20 20  y are not */.   
1c450 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c460 73 67 28 70 50 61 72 73 65 2c 22 25 73 2e 78 42  sg(pParse,"%s.xB
1c470 65 73 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63  estIndex malfunc
1c480 74 69 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62  tion",pSrc->pTab
1c490 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1c4a0 74 65 73 74 63 61 73 65 28 20 70 49 64 78 49 6e  testcase( pIdxIn
1c4b0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1c4c0 78 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65  xStr );.      re
1c4d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1c4e0 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  R;.    }.  }.  a
1c4f0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54  ssert( pNew->nLT
1c500 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  erm<=pNew->nLSlo
1c510 74 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  t );.  pNew->u.v
1c520 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64  tab.idxNum = pId
1c530 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20  xInfo->idxNum;. 
1c540 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
1c550 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66  edFree = pIdxInf
1c560 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
1c570 53 74 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  Str;.  pIdxInfo-
1c580 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1c590 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  r = 0;.  pNew->u
1c5a0 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70  .vtab.idxStr = p
1c5b0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b  IdxInfo->idxStr;
1c5c0 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1c5d0 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29  isOrdered = (i8)
1c5e0 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72  (pIdxInfo->order
1c5f0 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20  ByConsumed ?.   
1c600 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72     pIdxInfo->nOr
1c610 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 70 4e  derBy : 0);.  pN
1c620 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
1c630 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
1c640 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d  qlite3LogEstFrom
1c650 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d  Double(pIdxInfo-
1c660 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
1c670 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20  .  pNew->nOut = 
1c680 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49  sqlite3LogEst(pI
1c690 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
1c6a0 64 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53 65  dRows);..  /* Se
1c6b0 74 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52  t the WHERE_ONER
1c6c0 4f 57 20 66 6c 61 67 20 69 66 20 74 68 65 20 78  OW flag if the x
1c6d0 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68  BestIndex() meth
1c6e0 6f 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20 2a  od indicated.  *
1c6f0 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20  * that the scan 
1c700 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d 6f  will visit at mo
1c710 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61  st one row. Clea
1c720 72 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e 20  r it otherwise. 
1c730 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  */.  if( pIdxInf
1c740 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 20 53 51  o->idxFlags & SQ
1c750 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f  LITE_INDEX_SCAN_
1c760 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 70 4e  UNIQUE ){.    pN
1c770 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
1c780 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d  HERE_ONEROW;.  }
1c790 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
1c7a0 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
1c7b0 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20 20  E_ONEROW;.  }.  
1c7c0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
1c7d0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
1c7e0 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  New);.  if( pNew
1c7f0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
1c800 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1c810 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
1c820 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
1c830 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1c840 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  dFree = 0;.  }. 
1c850 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
1c860 66 66 2c 20 28 22 20 20 62 49 6e 3d 25 64 20 70  ff, ("  bIn=%d p
1c870 72 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20 70  rereqIn=%04llx p
1c880 72 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78 5c  rereqOut=%04llx\
1c890 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1c8a0 20 20 20 20 20 20 20 20 20 20 2a 70 62 49 6e 2c            *pbIn,
1c8b0 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34   (sqlite3_uint64
1c8c0 29 6d 50 72 65 72 65 71 2c 0a 20 20 20 20 20 20  )mPrereq,.      
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8e0 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1c8f0 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20  (pNew->prereq & 
1c900 7e 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a 20 20  ~mPrereq)));..  
1c910 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c920 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
1c930 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
1c940 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 78  from within an x
1c950 42 65 73 74 49 6e 64 65 78 28 29 20 63 61 6c 6c  BestIndex() call
1c960 62 61 63 6b 2c 20 69 74 0a 2a 2a 20 72 65 74 75  back, it.** retu
1c970 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
1c980 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1c990 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  ning the name of
1c9a0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a   the collation.*
1c9b0 2a 20 73 65 71 75 65 6e 63 65 20 61 73 73 6f 63  * sequence assoc
1c9c0 69 61 74 65 64 20 77 69 74 68 20 65 6c 65 6d 65  iated with eleme
1c9d0 6e 74 20 69 43 6f 6e 73 20 6f 66 20 74 68 65 20  nt iCons of the 
1c9e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1c9f0 66 6f 2e 61 43 6f 6e 73 74 72 61 69 6e 74 0a 2a  fo.aConstraint.*
1ca00 2a 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20  * array. Or, if 
1ca10 69 43 6f 6e 73 20 69 73 20 6f 75 74 20 6f 66 20  iCons is out of 
1ca20 72 61 6e 67 65 20 6f 72 20 74 68 65 72 65 20 69  range or there i
1ca30 73 20 6e 6f 20 61 63 74 69 76 65 20 78 42 65 73  s no active xBes
1ca40 74 49 6e 64 65 78 0a 2a 2a 20 63 61 6c 6c 2c 20  tIndex.** call, 
1ca50 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
1ca60 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1ca70 74 65 33 5f 76 74 61 62 5f 63 6f 6c 6c 61 74 69  te3_vtab_collati
1ca80 6f 6e 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  on(sqlite3_index
1ca90 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c  _info *pIdxInfo,
1caa0 20 69 6e 74 20 69 43 6f 6e 73 29 7b 0a 20 20 48   int iCons){.  H
1cab0 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20 2a  iddenIndexInfo *
1cac0 70 48 69 64 64 65 6e 20 3d 20 28 48 69 64 64 65  pHidden = (Hidde
1cad0 6e 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49 64  nIndexInfo*)&pId
1cae0 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 63 6f 6e 73  xInfo[1];.  cons
1caf0 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30  t char *zRet = 0
1cb00 3b 0a 20 20 69 66 28 20 69 43 6f 6e 73 3e 3d 30  ;.  if( iCons>=0
1cb10 20 26 26 20 69 43 6f 6e 73 3c 70 49 64 78 49 6e   && iCons<pIdxIn
1cb20 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
1cb30 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  ){.    CollSeq *
1cb40 70 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  pC = 0;.    int 
1cb50 69 54 65 72 6d 20 3d 20 70 49 64 78 49 6e 66 6f  iTerm = pIdxInfo
1cb60 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 43  ->aConstraint[iC
1cb70 6f 6e 73 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  ons].iTermOffset
1cb80 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d  ;.    Expr *pX =
1cb90 20 70 48 69 64 64 65 6e 2d 3e 70 57 43 2d 3e 61   pHidden->pWC->a
1cba0 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
1cbb0 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74     if( pX->pLeft
1cbc0 20 29 7b 0a 20 20 20 20 20 20 70 43 20 3d 20 73   ){.      pC = s
1cbd0 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
1cbe0 61 72 65 43 6f 6c 6c 53 65 71 28 70 48 69 64 64  areCollSeq(pHidd
1cbf0 65 6e 2d 3e 70 50 61 72 73 65 2c 20 70 58 2d 3e  en->pParse, pX->
1cc00 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
1cc10 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52  t);.    }.    zR
1cc20 65 74 20 3d 20 28 70 43 20 3f 20 70 43 2d 3e 7a  et = (pC ? pC->z
1cc30 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 29  Name : "BINARY")
1cc40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
1cc50 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  Ret;.}../*.** Ad
1cc60 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
1cc70 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61  objects for a ta
1cc80 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
1cc90 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
1cca0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
1ccb0 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
1ccc0 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
1ccd0 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c   to be a virtual
1cce0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
1ccf0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45   there are no LE
1cd00 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
1cd10 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75   joins in the qu
1cd20 65 72 79 2c 20 62 6f 74 68 20 6d 50 72 65 72 65  ery, both mPrere
1cd30 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62  q and.** mUnusab
1cd40 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e  le are set to 0.
1cd50 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 50 72 65   Otherwise, mPre
1cd60 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66  req is a mask of
1cd70 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
1cd80 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74  .** entries that
1cd90 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
1cda0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
1cdb0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1cdc0 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65  se and are.** se
1cdd0 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20  parated from it 
1cde0 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  by at least one 
1cdf0 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1ce00 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74  IN. Similarly, t
1ce10 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20  he.** mUnusable 
1ce20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c  mask contains al
1ce30 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  l FROM clause en
1ce40 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72  tries that occur
1ce50 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69   after the.** vi
1ce60 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20  rtual table and 
1ce70 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66 72  are separated fr
1ce80 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73  om it by at leas
1ce90 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a  t one LEFT or .*
1cea0 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a  * CROSS JOIN. .*
1ceb0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1cec0 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 77  , if the query w
1ced0 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  ere:.**.**   ...
1cee0 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46   FROM t1, t2 LEF
1cef0 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76  T JOIN t3, t4, v
1cf00 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c  t CROSS JOIN t5,
1cf10 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   t6;.**.** then 
1cf20 6d 50 72 65 72 65 71 20 63 6f 72 72 65 73 70 6f  mPrereq correspo
1cf30 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20  nds to (t1, t2) 
1cf40 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f  and mUnusable to
1cf50 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a   (t5, t6)..**.**
1cf60 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20   All the tables 
1cf70 69 6e 20 6d 50 72 65 72 65 71 20 6d 75 73 74 20  in mPrereq must 
1cf80 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
1cf90 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69  e the current vi
1cfa0 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e  rtual .** table.
1cfb0 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f   So any terms fo
1cfc0 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72  r which all prer
1cfd0 65 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61  equisites are sa
1cfe0 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d  tisfied by .** m
1cff0 50 72 65 72 65 71 20 6d 61 79 20 62 65 20 73 70  Prereq may be sp
1d000 65 63 69 66 69 65 64 20 61 73 20 22 75 73 61 62  ecified as "usab
1d010 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73  le" in all calls
1d020 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20   to xBestIndex. 
1d030 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20  .** Conversely, 
1d040 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55  all tables in mU
1d050 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20  nusable must be 
1d060 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68  scanned after th
1d070 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72  e current.** vir
1d080 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61  tual table, so a
1d090 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69  ny terms for whi
1d0a0 63 68 20 74 68 65 20 70 72 65 72 65 71 75 69 73  ch the prerequis
1d0b0 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74  ites overlap wit
1d0c0 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73  h.** mUnusable s
1d0d0 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
1d0e0 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e  configured as "n
1d0f0 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78  ot-usable" for x
1d100 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74  BestIndex..*/.st
1d110 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
1d120 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20  opAddVirtual(.  
1d130 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1d140 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20   *pBuilder,  /* 
1d150 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
1d160 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
1d170 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20  tmask mPrereq,  
1d180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1d190 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1d1a0 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
1d1b0 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42   this one */.  B
1d1c0 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
1d1d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d1e0 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
1d1f0 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72  be scanned after
1d200 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a   this one */.){.
1d210 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d220 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1d230 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1d240 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1d250 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
1d260 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
1d270 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  s context */.  P
1d280 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
1d290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d2a0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1d2b0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
1d2c0 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
1d2d0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1d2e0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
1d2f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1d300 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68  m *pSrc;   /* Th
1d310 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1d320 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
1d330 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
1d340 69 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f  info *p;       /
1d350 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 61 73 73  * Object to pass
1d360 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1d370 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74   */.  int nConst
1d380 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
1d390 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d3a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 70  constraints in p
1d3b0 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20   */.  int bIn;  
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6c     /* True if pl
1d3e0 61 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20  an uses IN(...) 
1d3f0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68  operator */.  Wh
1d400 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1d410 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20   Bitmask mBest; 
1d420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d430 20 54 61 62 6c 65 73 20 75 73 65 64 20 62 79 20   Tables used by 
1d440 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 6c  best possible pl
1d450 61 6e 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f  an */.  u16 mNoO
1d460 6d 69 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  mit;..  assert( 
1d470 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e 75 73  (mPrereq & mUnus
1d480 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57  able)==0 );.  pW
1d490 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
1d4a0 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
1d4b0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
1d4c0 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  se;.  pWC = pBui
1d4d0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65  lder->pWC;.  pNe
1d4e0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1d4f0 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57  ew;.  pSrc = &pW
1d500 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1d510 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20  a[pNew->iTab];. 
1d520 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
1d530 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
1d540 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65  ;.  p = allocate
1d550 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
1d560 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65  , pWC, mUnusable
1d570 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72  , pSrc, pBuilder
1d580 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  ->pOrderBy, .   
1d590 20 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20 20     &mNoOmit);.  
1d5a0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1d5b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1d5c0 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  KPT;.  pNew->rSe
1d5d0 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
1d5e0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
1d5f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
1d600 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1d610 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  0;.  pNew->u.vta
1d620 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
1d630 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
1d640 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  p->nConstraint;.
1d650 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
1d660 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62  esize(pParse->db
1d670 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
1d680 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
1d690 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1d6a0 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 72 65  ->db, p);.    re
1d6b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1d6c0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  M_BKPT;.  }..  /
1d6d0 2a 20 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65  * First call xBe
1d6e0 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61  stIndex() with a
1d6f0 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75  ll constraints u
1d700 73 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52  sable. */.  WHER
1d710 45 54 52 41 43 45 28 30 78 38 30 30 2c 20 28 22  ETRACE(0x800, ("
1d720 42 45 47 49 4e 20 25 73 2e 61 64 64 56 69 72 74  BEGIN %s.addVirt
1d730 75 61 6c 28 29 5c 6e 22 2c 20 70 53 72 63 2d 3e  ual()\n", pSrc->
1d740 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
1d750 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1d760 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1d770 3a 20 61 6c 6c 20 75 73 61 62 6c 65 5c 6e 22 29  : all usable\n")
1d780 29 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c  );.  rc = whereL
1d790 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1d7a0 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1d7b0 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 30 2c 20  eq, ALLBITS, 0, 
1d7c0 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e  p, mNoOmit, &bIn
1d7d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1d7e0 63 61 6c 6c 20 74 6f 20 78 42 65 73 74 49 6e 64  call to xBestInd
1d7f0 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20 74 65  ex() with all te
1d800 72 6d 73 20 65 6e 61 62 6c 65 64 20 70 72 6f 64  rms enabled prod
1d810 75 63 65 64 20 61 20 70 6c 61 6e 0a 20 20 2a 2a  uced a plan.  **
1d820 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1d830 65 71 75 69 72 65 20 61 6e 79 20 73 6f 75 72 63  equire any sourc
1d840 65 20 74 61 62 6c 65 73 20 28 49 4f 57 3a 20 61  e tables (IOW: a
1d850 20 70 6c 61 6e 20 77 69 74 68 20 6d 42 65 73 74   plan with mBest
1d860 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ==0),.  ** then 
1d870 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  there is no poin
1d880 74 20 69 6e 20 6d 61 6b 69 6e 67 20 61 6e 79 20  t in making any 
1d890 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f  further calls to
1d8a0 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 0a 20   xBestIndex() . 
1d8b0 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 79 20 77   ** since they w
1d8c0 69 6c 6c 20 61 6c 6c 20 72 65 74 75 72 6e 20 74  ill all return t
1d8d0 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 28  he same result (
1d8e0 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  if the xBestInde
1d8f0 78 28 29 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65  x().  ** impleme
1d900 6e 74 61 74 69 6f 6e 20 69 73 20 73 61 6e 65 29  ntation is sane)
1d910 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
1d920 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6d 42 65  QLITE_OK && (mBe
1d930 73 74 20 3d 20 28 70 4e 65 77 2d 3e 70 72 65 72  st = (pNew->prer
1d940 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29 21  eq & ~mPrereq))!
1d950 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  =0 ){.    int se
1d960 65 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20  enZero = 0;     
1d970 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d980 69 66 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6e  if a plan with n
1d990 6f 20 70 72 65 72 65 71 73 20 73 65 65 6e 20 2a  o prereqs seen *
1d9a0 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65  /.    int seenZe
1d9b0 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20  roNoIN = 0;     
1d9c0 20 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69 74 68      /* Plan with
1d9d0 20 6e 6f 20 70 72 65 72 65 71 73 20 61 6e 64 20   no prereqs and 
1d9e0 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65 6e 20  no IN(...) seen 
1d9f0 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  */.    Bitmask m
1da00 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 42 69  Prev = 0;.    Bi
1da10 74 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49 6e 20  tmask mBestNoIn 
1da20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
1da30 74 68 65 20 70 6c 61 6e 20 70 72 6f 64 75 63 65  the plan produce
1da40 64 20 62 79 20 74 68 65 20 65 61 72 6c 69 65 72  d by the earlier
1da50 20 63 61 6c 6c 20 75 73 65 73 20 61 6e 20 49 4e   call uses an IN
1da60 28 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61 6c 6c  (...) term, call
1da70 0a 20 20 20 20 2a 2a 20 78 42 65 73 74 49 6e 64  .    ** xBestInd
1da80 65 78 20 61 67 61 69 6e 2c 20 74 68 69 73 20 74  ex again, this t
1da90 69 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e 2e 29  ime with IN(...)
1daa0 20 74 65 72 6d 73 20 64 69 73 61 62 6c 65 64 2e   terms disabled.
1dab0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 6e 20   */.    if( bIn 
1dac0 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ){.      WHERETR
1dad0 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1dae0 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73  rtualOne: all us
1daf0 61 62 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22 29 29  able w/o IN\n"))
1db00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
1db10 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1db20 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  One(.          p
1db30 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1db40 2c 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f 49 4e  , ALLBITS, WO_IN
1db50 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1db60 49 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  In);.      asser
1db70 74 28 20 62 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  t( bIn==0 );.   
1db80 20 20 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 70     mBestNoIn = p
1db90 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d  New->prereq & ~m
1dba0 50 72 65 72 65 71 3b 0a 20 20 20 20 20 20 69 66  Prereq;.      if
1dbb0 28 20 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30 20 29  ( mBestNoIn==0 )
1dbc0 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65  {.        seenZe
1dbd0 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ro = 1;.        
1dbe0 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31  seenZeroNoIN = 1
1dbf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1dc00 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78 42 65  .    /* Call xBe
1dc10 73 74 49 6e 64 65 78 20 6f 6e 63 65 20 66 6f 72  stIndex once for
1dc20 20 65 61 63 68 20 64 69 73 74 69 6e 63 74 20 76   each distinct v
1dc30 61 6c 75 65 20 6f 66 20 28 70 72 65 72 65 71 52  alue of (prereqR
1dc40 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71 29  ight & ~mPrereq)
1dc50 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20   .    ** in the 
1dc60 73 65 74 20 6f 66 20 74 65 72 6d 73 20 74 68 61  set of terms tha
1dc70 74 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 63  t apply to the c
1dc80 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 74  urrent virtual t
1dc90 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 77 68  able.  */.    wh
1dca0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1dcb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
1dcc0 69 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  i;.      Bitmask
1dcd0 20 6d 4e 65 78 74 20 3d 20 41 4c 4c 42 49 54 53   mNext = ALLBITS
1dce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1dcf0 6d 4e 65 78 74 3e 30 20 29 3b 0a 20 20 20 20 20  mNext>0 );.     
1dd00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
1dd10 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
1dd20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
1dd30 54 68 69 73 20 3d 20 28 0a 20 20 20 20 20 20 20  This = (.       
1dd40 20 20 20 20 20 70 57 43 2d 3e 61 5b 70 2d 3e 61       pWC->a[p->a
1dd50 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
1dd60 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65  ermOffset].prere
1dd70 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65  qRight & ~mPrere
1dd80 71 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  q.        );.   
1dd90 20 20 20 20 20 69 66 28 20 6d 54 68 69 73 3e 6d       if( mThis>m
1dda0 50 72 65 76 20 26 26 20 6d 54 68 69 73 3c 6d 4e  Prev && mThis<mN
1ddb0 65 78 74 20 29 20 6d 4e 65 78 74 20 3d 20 6d 54  ext ) mNext = mT
1ddc0 68 69 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  his;.      }.   
1ddd0 20 20 20 6d 50 72 65 76 20 3d 20 6d 4e 65 78 74     mPrev = mNext
1dde0 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78  ;.      if( mNex
1ddf0 74 3d 3d 41 4c 4c 42 49 54 53 20 29 20 62 72 65  t==ALLBITS ) bre
1de00 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e  ak;.      if( mN
1de10 65 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e  ext==mBest || mN
1de20 65 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29  ext==mBestNoIn )
1de30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1de40 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1de50 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1de60 3a 20 6d 50 72 65 76 3d 25 30 34 6c 6c 78 20 6d  : mPrev=%04llx m
1de70 4e 65 78 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a  Next=%04llx\n",.
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
1dea0 75 69 6e 74 36 34 29 6d 50 72 65 76 2c 20 28 73  uint64)mPrev, (s
1deb0 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 4e  qlite3_uint64)mN
1dec0 65 78 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20  ext));.      rc 
1ded0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1dee0 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20  rtualOne(.      
1def0 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50      pBuilder, mP
1df00 72 65 72 65 71 2c 20 6d 4e 65 78 74 7c 6d 50 72  rereq, mNext|mPr
1df10 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f  ereq, 0, p, mNoO
1df20 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20  mit, &bIn);.    
1df30 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 72 65 72    if( pNew->prer
1df40 65 71 3d 3d 6d 50 72 65 72 65 71 20 29 7b 0a 20  eq==mPrereq ){. 
1df50 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20         seenZero 
1df60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
1df70 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65   bIn==0 ) seenZe
1df80 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  roNoIN = 1;.    
1df90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1dfa0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74  * If the calls t
1dfb0 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 69  o xBestIndex() i
1dfc0 6e 20 74 68 65 20 61 62 6f 76 65 20 6c 6f 6f 70  n the above loop
1dfd0 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
1dfe0 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74  plan.    ** that
1dff0 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75   requires no sou
1e000 72 63 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c  rce tables at al
1e010 6c 20 28 69 2e 65 2e 20 6f 6e 65 20 67 75 61 72  l (i.e. one guar
1e020 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 20 20 20  anteed to be.   
1e030 20 2a 2a 20 75 73 61 62 6c 65 29 2c 20 6d 61 6b   ** usable), mak
1e040 65 20 61 20 63 61 6c 6c 20 68 65 72 65 20 77 69  e a call here wi
1e050 74 68 20 61 6c 6c 20 73 6f 75 72 63 65 20 74 61  th all source ta
1e060 62 6c 65 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  bles disabled */
1e070 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e080 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65  ITE_OK && seenZe
1e090 72 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  ro==0 ){.      W
1e0a0 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1e0b0 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1e0c0 61 6c 6c 20 64 69 73 61 62 6c 65 64 5c 6e 22 29  all disabled\n")
1e0d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
1e0e0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1e0f0 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20  lOne(.          
1e100 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1e110 71 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c 20 70  q, mPrereq, 0, p
1e120 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1e130 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d  ;.      if( bIn=
1e140 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49  =0 ) seenZeroNoI
1e150 4e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  N = 1;.    }..  
1e160 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
1e170 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28  s to xBestIndex(
1e180 29 20 68 61 76 65 20 73 6f 20 66 61 72 20 66 61  ) have so far fa
1e190 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70  iled to find a p
1e1a0 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  lan.    ** that 
1e1b0 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72  requires no sour
1e1c0 63 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c  ce tables at all
1e1d0 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 75 73   and does not us
1e1e0 65 20 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20 20 20  e an IN(...).   
1e1f0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2c 20 6d 61   ** operator, ma
1e200 6b 65 20 61 20 66 69 6e 61 6c 20 63 61 6c 6c 20  ke a final call 
1e210 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 20 68 65  to obtain one he
1e220 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  re.  */.    if( 
1e230 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e240 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30   seenZeroNoIN==0
1e250 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54   ){.      WHERET
1e260 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1e270 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64  irtualOne: all d
1e280 69 73 61 62 6c 65 64 20 61 6e 64 20 77 2f 6f 20  isabled and w/o 
1e290 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  IN\n"));.      r
1e2a0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1e2b0 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20  VirtualOne(.    
1e2c0 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20        pBuilder, 
1e2d0 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71  mPrereq, mPrereq
1e2e0 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f  , WO_IN, p, mNoO
1e2f0 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20  mit, &bIn);.    
1e300 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
1e310 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1e320 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
1e330 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
1e340 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70 50  lite3DbFreeNN(pP
1e350 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20  arse->db, p);.  
1e360 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30  WHERETRACE(0x800
1e370 2c 20 28 22 45 4e 44 20 25 73 2e 61 64 64 56 69  , ("END %s.addVi
1e380 72 74 75 61 6c 28 29 2c 20 72 63 3d 25 64 5c 6e  rtual(), rc=%d\n
1e390 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  ", pSrc->pTab->z
1e3a0 4e 61 6d 65 2c 20 72 63 29 29 3b 0a 20 20 72 65  Name, rc));.  re
1e3b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1e3c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1e3d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1e3e0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72  ../*.** Add Wher
1e3f0 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f  eLoop entries to
1e400 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73   handle OR terms
1e410 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f  .  This works fo
1e420 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65  r either.** btre
1e430 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61  es or virtual ta
1e440 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1e450 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1e460 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  Or(.  WhereLoopB
1e470 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1e480 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  , .  Bitmask mPr
1e490 65 72 65 71 2c 20 0a 20 20 42 69 74 6d 61 73 6b  ereq, .  Bitmask
1e4a0 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20   mUnusable.){.  
1e4b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1e4c0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
1e4d0 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61  Info;.  WhereCla
1e4e0 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
1e4f0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57  eLoop *pNew;.  W
1e500 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
1e510 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20   *pWCEnd;.  int 
1e520 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e530 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68    int iCur;.  Wh
1e540 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
1e550 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  ;.  WhereLoopBui
1e560 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a  lder sSubBuild;.
1e570 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75    WhereOrSet sSu
1e580 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63  m, sCur;.  struc
1e590 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1e5a0 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20  pItem;.  .  pWC 
1e5b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
1e5c0 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  .  pWCEnd = pWC-
1e5d0 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
1e5e0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
1e5f0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73  er->pNew;.  mems
1e600 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a  et(&sSum, 0, siz
1e610 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49  eof(sSum));.  pI
1e620 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
1e630 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77  abList->a + pNew
1e640 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d  ->iTab;.  iCur =
1e650 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
1e660 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ..  for(pTerm=pW
1e670 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
1e680 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  nd && rc==SQLITE
1e690 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  _OK; pTerm++){. 
1e6a0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
1e6b0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
1e6c0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
1e6d0 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
1e6e0 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77  indexable & pNew
1e6f0 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a  ->maskSelf)!=0 .
1e700 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65      ){.      Whe
1e710 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74  reClause * const
1e720 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d   pOrWC = &pTerm-
1e730 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
1e740 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1e750 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64  * const pOrWCEnd
1e760 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72   = &pOrWC->a[pOr
1e770 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20  WC->nTerm];.    
1e780 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
1e790 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
1e7a0 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  once = 1;.      
1e7b0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20  int i, j;.    . 
1e7c0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d       sSubBuild =
1e7d0 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20   *pBuilder;.    
1e7e0 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64    sSubBuild.pOrd
1e7f0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
1e800 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74  sSubBuild.pOrSet
1e810 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20   = &sCur;..     
1e820 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1e830 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65  0, ("Begin proce
1e840 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  ssing OR-clause 
1e850 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a  %p\n", pTerm));.
1e860 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
1e870 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
1e880 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
1e890 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
1e8a0 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
1e8b0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
1e8c0 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
1e8d0 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
1e8e0 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e  C = &pOrTerm->u.
1e8f0 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
1e900 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e910 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
1e920 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20  sor==iCur ){.   
1e930 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57         tempWC.pW
1e940 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
1e950 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  fo;.          te
1e960 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57  mpWC.pOuter = pW
1e970 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  C;.          tem
1e980 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  pWC.op = TK_AND;
1e990 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1e9a0 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  C.nTerm = 1;.   
1e9b0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
1e9c0 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
1e9d0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1e9e0 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20  WC = &tempWC;.  
1e9f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ea00 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1ea10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ea20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23     sCur.n = 0;.#
1ea30 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
1ea40 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20  _ENABLED.       
1ea50 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1ea60 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20  0, ("OR-term %d 
1ea70 6f 66 20 25 70 20 68 61 73 20 25 64 20 73 75 62  of %p has %d sub
1ea80 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20  terms:\n", .    
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1eaa0 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72  int)(pOrTerm-pOr
1eab0 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73  WC->a), pTerm, s
1eac0 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54  SubBuild.pWC->nT
1ead0 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69  erm));.        i
1eae0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
1eaf0 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
1eb00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1eb10 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e  3WhereClausePrin
1eb20 74 28 73 53 75 62 42 75 69 6c 64 2e 70 57 43 29  t(sSubBuild.pWC)
1eb30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
1eb40 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
1eb50 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1eb60 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  BLE.        if( 
1eb70 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
1eb80 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
1eb90 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1eba0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53  opAddVirtual(&sS
1ebb0 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71  ubBuild, mPrereq
1ebc0 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
1ebd0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
1ebe0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
1ebf0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1ec00 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73  eLoopAddBtree(&s
1ec10 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65  SubBuild, mPrere
1ec20 71 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  q);.        }.  
1ec30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ec40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ec50 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1ec60 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42 75  oopAddOr(&sSubBu
1ec70 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55  ild, mPrereq, mU
1ec80 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  nusable);.      
1ec90 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1eca0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1ecb0 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29  K || sCur.n==0 )
1ecc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43  ;.        if( sC
1ecd0 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ur.n==0 ){.     
1ece0 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
1ecf0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1ed00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1ed10 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
1ed20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
1ed30 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b  e(&sSum, &sCur);
1ed40 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20  .          once 
1ed50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
1ed60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68  se{.          Wh
1ed70 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b 0a  ereOrSet sPrev;.
1ed80 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
1ed90 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73  rMove(&sPrev, &s
1eda0 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sum);.          
1edb0 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
1edc0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1edd0 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a  <sPrev.n; i++){.
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1edf0 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a  j=0; j<sCur.n; j
1ee00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1ee10 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
1ee20 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b  (&sSum, sPrev.a[
1ee30 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72  i].prereq | sCur
1ee40 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20  .a[j].prereq,.  
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ee70 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
1ee80 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72  .a[i].rRun, sCur
1ee90 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20  .a[j].rRun),.   
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eeb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1eec0 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e  LogEstAdd(sPrev.
1eed0 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e  a[i].nOut, sCur.
1eee0 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20  a[j].nOut));.   
1eef0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ef00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1ef10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ef20 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
1ef30 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  .      pNew->aLT
1ef40 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
1ef50 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
1ef60 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54  ags = WHERE_MULT
1ef70 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77  I_OR;.      pNew
1ef80 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
1ef90 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
1efa0 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65  dx = 0;.      me
1efb0 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30  mset(&pNew->u, 0
1efc0 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75  , sizeof(pNew->u
1efd0 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
1efe0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
1eff0 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b   && i<sSum.n; i+
1f000 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  +){.        /* T
1f010 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79  UNING: Currently
1f020 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20   sSum.a[i].rRun 
1f030 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 75  is set to the su
1f040 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  m of the costs. 
1f050 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c         ** of all
1f060 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75 69   sub-scans requi
1f070 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73 63  red by the OR-sc
1f080 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75 65  an. However, due
1f090 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20   to rounding.   
1f0a0 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20       ** errors, 
1f0b0 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20 74  it may be that t
1f0c0 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 4f  he cost of the O
1f0d0 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c 20  R-scan is equal 
1f0e0 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a  to its.        *
1f0f0 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65  * most expensive
1f100 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20 74   sub-scan. Add t
1f110 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73  he smallest poss
1f120 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20 20  ible penalty .  
1f130 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76 61        ** (equiva
1f140 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79  lent to multiply
1f150 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79 20  ing the cost by 
1f160 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65 20  1.07) to ensure 
1f170 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  that .        **
1f180 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 68   this does not h
1f190 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73 65  appen. Otherwise
1f1a0 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  , for WHERE clau
1f1b0 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65 0a  ses such as the.
1f1c0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f          ** follo
1f1d0 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72 65  wing where there
1f1e0 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
1f1f0 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  "y":.        **.
1f200 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 57          **     W
1f210 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  HERE likelihood(
1f220 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d  x=?, 0.99) OR y=
1f230 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ?.        **.   
1f240 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e       ** the plan
1f250 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74 6f  ner may elect to
1f260 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20 61   "OR" together a
1f270 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
1f280 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20 20   and an.        
1f290 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e  ** index lookup.
1f2a0 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69 6c   And other simil
1f2b0 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74 73  arly odd results
1f2c0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
1f2d0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e  ew->rRun = sSum.
1f2e0 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20  a[i].rRun + 1;. 
1f2f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
1f300 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f  t = sSum.a[i].nO
1f310 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ut;.        pNew
1f320 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e  ->prereq = sSum.
1f330 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20  a[i].prereq;.   
1f340 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1f350 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
1f360 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
1f370 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52   }.      WHERETR
1f380 41 43 45 28 30 78 32 30 30 2c 20 28 22 45 6e 64  ACE(0x200, ("End
1f390 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63   processing OR-c
1f3a0 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65  lause %p\n", pTe
1f3b0 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rm));.    }.  }.
1f3c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f3d0 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
1f3e0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
1f3f0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a  for all tables .
1f400 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1f410 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68  ereLoopAddAll(Wh
1f420 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1f430 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
1f440 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
1f450 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1f460 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  o;.  Bitmask mPr
1f470 65 72 65 71 20 3d 20 30 3b 0a 20 20 42 69 74 6d  ereq = 0;.  Bitm
1f480 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a  ask mPrior = 0;.
1f490 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72    int iTab;.  Sr
1f4a0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
1f4b0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1f4c0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
1f4d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1f4e0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1f4f0 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20 3d 20  st_item *pEnd = 
1f500 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 57 49  &pTabList->a[pWI
1f510 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  nfo->nLevel];.  
1f520 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
1f530 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1f540 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1f550 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c  ITE_OK;.  WhereL
1f560 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75 38 20  oop *pNew;.  u8 
1f570 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20  priorJointype = 
1f580 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  0;..  /* Loop ov
1f590 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  er the tables in
1f5a0 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20   the join, from 
1f5b0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f  left to right */
1f5c0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
1f5d0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72  er->pNew;.  wher
1f5e0 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b  eLoopInit(pNew);
1f5f0 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70  .  for(iTab=0, p
1f600 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  Item=pTabList->a
1f610 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20 69 54  ; pItem<pEnd; iT
1f620 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a  ab++, pItem++){.
1f630 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75      Bitmask mUnu
1f640 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70  sable = 0;.    p
1f650 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62  New->iTab = iTab
1f660 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b  ;.    pNew->mask
1f670 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68  Self = sqlite3Wh
1f680 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e  ereGetMask(&pWIn
1f690 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49  fo->sMaskSet, pI
1f6a0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
1f6b0 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e     if( ((pItem->
1f6c0 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f  fg.jointype|prio
1f6d0 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28 4a 54  rJointype) & (JT
1f6e0 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
1f6f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1f700 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
1f710 73 20 74 72 75 65 20 77 68 65 6e 20 70 49 74 65  s true when pIte
1f720 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20 63 6c  m is the FROM cl
1f730 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74 68 65  ause term on the
1f740 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2d  .      ** right-
1f750 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20 4c  hand-side of a L
1f760 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49  EFT or CROSS JOI
1f770 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d 50 72  N.  */.      mPr
1f780 65 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b 0a 20  ereq = mPrior;. 
1f790 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f     }.    priorJo
1f7a0 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e  intype = pItem->
1f7b0 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23 69 66  fg.jointype;.#if
1f7c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f7d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1f7e0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1f7f0 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
1f800 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1f810 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20  List_item *p;.  
1f820 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65 6d      for(p=&pItem
1f830 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [1]; p<pEnd; p++
1f840 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ){.        if( m
1f850 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e  Unusable || (p->
1f860 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a  fg.jointype & (J
1f870 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
1f880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ) ){.          m
1f890 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69  Unusable |= sqli
1f8a0 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1f8b0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
1f8c0 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  t, p->iCursor);.
1f8d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f8e0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  }.      rc = whe
1f8f0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1f900 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1f910 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1f920 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1f930 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1f940 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
1f950 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d      {.      rc =
1f960 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
1f970 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  ee(pBuilder, mPr
1f980 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ereq);.    }.   
1f990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f9a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1f9b0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1f9c0 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1f9d0 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  q, mUnusable);. 
1f9e0 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20     }.    mPrior 
1f9f0 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  |= pNew->maskSel
1fa00 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  f;.    if( rc ||
1fa10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1fa20 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a  d ) break;.  }..
1fa30 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
1fa40 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  (db, pNew);.  re
1fa50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1fa60 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72  * Examine a Wher
1fa70 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20  ePath (with the 
1fa80 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
1fa90 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20  extra WhereLoop 
1faa0 6f 66 20 74 68 65 20 36 74 68 0a 2a 2a 20 70 61  of the 6th.** pa
1fab0 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65  rameters) to see
1fac0 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72   if it outputs r
1fad0 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65  ows in the reque
1fae0 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a  sted ORDER BY.**
1faf0 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77   (or GROUP BY) w
1fb00 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67  ithout requiring
1fb10 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
1fb20 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74   operation.  Ret
1fb30 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  urn N:.** .**   
1fb40 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f  N>0:   N terms o
1fb50 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1fb60 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
1fb70 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20  ied.**   N==0:  
1fb80 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  No terms of the 
1fb90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1fba0 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
1fbb0 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77     N<0:   Unknow
1fbc0 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74  n yet how many t
1fbd0 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59  erms of ORDER BY
1fbe0 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66   might be satisf
1fbf0 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ied.   .**.** No
1fc00 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69  te that processi
1fc10 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f  ng for WHERE_GRO
1fc20 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44  UPBY and WHERE_D
1fc30 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74  ISTINCTBY is not
1fc40 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20   as.** strict.  
1fc50 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e  With GROUP BY an
1fc60 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f  d DISTINCT the o
1fc70 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20  nly requirement 
1fc80 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76  is that.** equiv
1fc90 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61  alent rows appea
1fca0 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64  r immediately ad
1fcb0 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e  jacent to one an
1fcc0 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59  other.  GROUP BY
1fcd0 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54  .** and DISTINCT
1fce0 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
1fcf0 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69  rows to appear i
1fd00 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  n any particular
1fd10 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a   order as long.*
1fd20 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * as equivalent 
1fd30 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64  rows are grouped
1fd40 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73   together.  Thus
1fd50 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e   for GROUP BY an
1fd60 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68  d DISTINCT.** th
1fd70 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  e pOrderBy terms
1fd80 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
1fd90 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57  in any order.  W
1fda0 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68  ith ORDER BY, th
1fdb0 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74  e .** pOrderBy t
1fdc0 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74  erms must be mat
1fdd0 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c  ched in strict l
1fde0 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64  eft-to-right ord
1fdf0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38  er..*/.static i8
1fe00 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
1fe10 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68  iesOrderBy(.  Wh
1fe20 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
1fe30 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1fe40 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
1fe50 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
1fe60 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f     /* ORDER BY o
1fe70 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49  r GROUP BY or DI
1fe80 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f  STINCT clause to
1fe90 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72   check */.  Wher
1fea0 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20  ePath *pPath,   
1feb0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61    /* The WherePa
1fec0 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  th to check */. 
1fed0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
1fee0 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 5f         /* WHERE_
1fef0 47 52 4f 55 50 42 59 20 6f 72 20 5f 44 49 53 54  GROUPBY or _DIST
1ff00 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44 45 52  INCTBY or _ORDER
1ff10 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 75 31  BY_LIMIT */.  u1
1ff20 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  6 nLoop,        
1ff30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ff40 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74   entries in pPat
1ff50 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
1ff60 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
1ff70 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69  ,     /* Add thi
1ff80 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74  s WhereLoop to t
1ff90 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d  he end of pPath-
1ffa0 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69  >aLoop[] */.  Bi
1ffb0 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20  tmask *pRevMask 
1ffc0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b      /* OUT: Mask
1ffd0 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74   of WhereLoops t
1ffe0 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65  o run in reverse
1fff0 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75   order */.){.  u
20000 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20  8 revSet;       
20010 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20020 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a  rev is known */.
20030 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20    u8 rev;       
20040 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f          /* Compo
20050 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20  site sort order 
20060 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20  */.  u8 revIdx; 
20070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20080 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  dex sort order *
20090 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69  /.  u8 isOrderDi
200a0 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c  stinct;   /* All
200b0 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70   prior WhereLoop
200c0 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74  s are order-dist
200d0 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73  inct */.  u8 dis
200e0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20  tinctColumns;   
200f0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c  /* True if the l
20100 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e  oop has UNIQUE N
20110 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
20120 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b  */.  u8 isMatch;
20130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43             /* iC
20140 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20  olumn matches a 
20150 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
20160 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
20170 20 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b 20 20   u16 eqOpMask;  
20180 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65         /* Allowe
20190 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61  d equality opera
201a0 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20 6e 4b  tors */.  u16 nK
201b0 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
201c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
201d0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
201e0 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  ex */.  u16 nCol
201f0 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
20200 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
20210 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73   ordered columns
20220 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
20230 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
20240 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20250 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
20260 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20270 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
20280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20290 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
202a0 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
202b0 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
202c0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
202d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
202e0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
202f0 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
20300 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
20310 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
20320 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
20330 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
20340 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
20350 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
20360 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
20370 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
20380 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
20390 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
203a0 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
203b0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
203c0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
203d0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
203e0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
203f0 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
20400 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
20410 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
20420 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
20430 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
20440 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
20450 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
20460 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
20470 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
20480 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
20490 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
204a0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
204b0 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
204c0 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
204d0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
204e0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
204f0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
20500 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
20510 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
20520 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
20530 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
20540 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
20550 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
20560 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
20570 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
20580 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
20590 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
205a0 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
205b0 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
205c0 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
205d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
205e0 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
205f0 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
20600 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
20610 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
20620 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
20630 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
20640 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
20650 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
20660 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
20670 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
20680 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
20690 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
206a0 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
206b0 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
206c0 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
206d0 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
206e0 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
206f0 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
20700 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
20710 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
20720 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
20730 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
20740 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
20750 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
20760 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
20770 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
20780 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
20790 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
207a0 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
207b0 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
207c0 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
207d0 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
207e0 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
207f0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
20800 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
20810 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
20820 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
20830 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
20840 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
20850 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
20860 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
20870 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
20880 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
20890 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
208a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
208b0 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
208c0 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
208d0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
208e0 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
208f0 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
20900 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
20910 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
20920 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
20930 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
20940 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
20950 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
20960 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
20970 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
20980 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
20990 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
209a0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
209b0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
209c0 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
209d0 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
209e0 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
209f0 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
20a00 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
20a10 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
20a20 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
20a30 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
20a40 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
20a50 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
20a60 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
20a70 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
20a80 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
20a90 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
20aa0 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
20ab0 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20   );.  if( nLoop 
20ac0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
20ad0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
20ae0 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
20af0 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
20b00 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
20b10 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
20b20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
20b30 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
20b40 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
20b50 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
20b60 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
20b70 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
20b80 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
20b90 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
20ba0 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
20bb0 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
20bc0 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
20bd0 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
20be0 61 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f 70 4d  ady = 0;.  eqOpM
20bf0 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20 57 4f  ask = WO_EQ | WO
20c00 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c 3b  _IS | WO_ISNULL;
20c10 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
20c20 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
20c30 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70 4d 61  Y_LIMIT ) eqOpMa
20c40 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20 66  sk |= WO_IN;.  f
20c50 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72  or(iLoop=0; isOr
20c60 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f  derDistinct && o
20c70 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69  bSat<obDone && i
20c80 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f  Loop<=nLoop; iLo
20c90 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69  op++){.    if( i
20ca0 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c  Loop>0 ) ready |
20cb0 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
20cc0 66 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  f;.    if( iLoop
20cd0 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  <nLoop ){.      
20ce0 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d 3e 61  pLoop = pPath->a
20cf0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
20d00 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
20d10 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
20d20 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74 69 6e  Y_LIMIT ) contin
20d30 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ue;.    }else{. 
20d40 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 61       pLoop = pLa
20d50 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  st;.    }.    if
20d60 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
20d70 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
20d80 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69  TABLE ){.      i
20d90 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  f( pLoop->u.vtab
20da0 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53  .isOrdered ) obS
20db0 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20  at = obDone;.   
20dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
20dd0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  lse{.      pLoop
20de0 2d 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f  ->u.btree.nIdxCo
20df0 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  l = 0;.    }.   
20e00 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e   iCur = pWInfo->
20e10 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
20e20 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72  p->iTab].iCursor
20e30 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  ;..    /* Mark o
20e40 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20  ff any ORDER BY 
20e50 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61  term X that is a
20e60 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
20e70 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
20e80 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20  he current loop 
20e90 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
20ea0 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  is term in the W
20eb0 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75  HERE.    ** clau
20ec0 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  se of the form X
20ed0 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20   IS NULL or X=? 
20ee0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f  that reference o
20ef0 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  nly outer.    **
20f00 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20   loops..    */. 
20f10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
20f20 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
20f30 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
20f40 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
20f50 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42  tinue;.      pOB
20f60 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
20f70 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
20f80 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
20f90 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
20fa0 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
20fb0 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
20fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
20fd0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
20fe0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
20ff0 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69      pTerm = sqli
21000 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d  te3WhereFindTerm
21010 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69  (&pWInfo->sWC, i
21020 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43  Cur, pOBExpr->iC
21030 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72                ~r
21050 65 61 64 79 2c 20 65 71 4f 70 4d 61 73 6b 2c 20  eady, eqOpMask, 
21060 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  0);.      if( pT
21070 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
21080 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  e;.      if( pTe
21090 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
210a0 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
210b0 2f 2a 20 49 4e 20 74 65 72 6d 73 20 61 72 65 20  /* IN terms are 
210c0 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 73  only valid for s
210d0 6f 72 74 69 6e 67 20 69 6e 20 74 68 65 20 4f 52  orting in the OR
210e0 44 45 52 20 42 59 20 4c 49 4d 49 54 20 0a 20 20  DER BY LIMIT .  
210f0 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a        ** optimiz
21100 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 6e 20  ation, and then 
21110 6f 6e 6c 79 20 69 66 20 74 68 65 79 20 61 72 65  only if they are
21120 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 0a 20   actually used. 
21130 20 20 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65         ** by the
21140 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20   query plan */. 
21150 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77         assert( w
21160 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21170 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
21180 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
21190 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54  =0; j<pLoop->nLT
211a0 65 72 6d 20 26 26 20 70 54 65 72 6d 21 3d 70 4c  erm && pTerm!=pL
211b0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 20  oop->aLTerm[j]; 
211c0 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 69  j++){}.        i
211d0 66 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54  f( j>=pLoop->nLT
211e0 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  erm ) continue;.
211f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21200 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
21210 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  tor&(WO_EQ|WO_IS
21220 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72  ))!=0 && pOBExpr
21230 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
21240 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
21250 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61  te3ExprCollSeqMa
21260 74 63 68 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  tch(pWInfo->pPar
21270 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
21280 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
21290 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 54 65  >a[i].pExpr, pTe
212a0 72 6d 2d 3e 70 45 78 70 72 29 3d 3d 30 20 29 7b  rm->pExpr)==0 ){
212b0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
212c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
212d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
212e0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f   pTerm->pExpr->o
212f0 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
21300 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20    }.      obSat 
21310 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
21320 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
21330 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
21340 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
21350 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
21360 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21370 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20  HERE_IPK ){.    
21380 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
21390 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
213a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  = 0;.        nCo
213b0 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  lumn = 1;.      
213c0 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65  }else if( (pInde
213d0 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
213e0 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c  ee.pIndex)==0 ||
213f0 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
21400 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
21410 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
21420 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b  else{.        nK
21430 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e  eyCol = pIndex->
21440 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nKeyCol;.       
21450 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   nColumn = pInde
21460 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
21470 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
21480 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c  umn==nKeyCol+1 |
21490 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64  | !HasRowid(pInd
214a0 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20  ex->pTable) );. 
214b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
214c0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
214d0 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52  nColumn-1]==XN_R
214e0 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 20 20  OWID.           
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
21500 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64  | !HasRowid(pInd
21510 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20  ex->pTable));.  
21520 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
21530 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65  tinct = IsUnique
21540 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
21550 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
21560 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
21570 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
21580 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20   index and deal 
21590 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20  with the ones.  
215a0 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
215b0 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  not constrained 
215c0 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20  by == or IN..   
215d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20     */.      rev 
215e0 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20  = revSet = 0;.  
215f0 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
21600 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  mns = 0;.      f
21610 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d  or(j=0; j<nColum
21620 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
21630 20 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b 20 2f   u8 bOnce = 1; /
21640 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68  * True to run th
21650 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63  e ORDER BY searc
21660 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20  h loop */..     
21670 20 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 70 4c     assert( j>=pL
21680 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
21690 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
216a0 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b   (pLoop->aLTerm[
216b0 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f 6f 70  j]==0)==(j<pLoop
216c0 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20 20 20  ->nSkip).       
216d0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
216e0 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
216f0 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70  .nEq && j>=pLoop
21700 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  ->nSkip ){.     
21710 20 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70       u16 eOp = p
21720 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
21730 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20 20 20  >eOperator;..   
21740 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f         /* Skip o
21750 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 61 6e  ver == and IS an
21760 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73 2e 20  d ISNULL terms. 
21770 20 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e 20 74   (Also skip IN t
21780 65 72 6d 73 20 77 68 65 6e 0a 20 20 20 20 20 20  erms when.      
21790 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57 48 45      ** doing WHE
217a0 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  RE_ORDERBY_LIMIT
217b0 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 20 0a 20   processing). . 
217c0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
217d0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
217e0 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
217f0 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 28  a column of an (
21800 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54  (?,?) IN (SELECT
21810 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20 20 20 20  ...)) .         
21820 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 66   ** expression f
21830 6f 72 20 77 68 69 63 68 20 74 68 65 20 53 45 4c  or which the SEL
21840 45 43 54 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  ECT returns more
21850 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
21860 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  ,.          ** c
21870 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20  heck that it is 
21880 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 20  the only column 
21890 75 73 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f  used by this loo
218a0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  p. Otherwise,.  
218b0 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69 74          ** if it
218c0 20 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f 20 6f   is one of two o
218d0 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f 66 20  r more, none of 
218e0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61 6e 20  the columns can 
218f0 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
21900 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 6d 61  considered to ma
21910 74 63 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  tch an ORDER BY 
21920 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  term.  */.      
21930 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20 65      if( (eOp & e
21940 71 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20  qOpMask)!=0 ){. 
21950 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65             if( e
21960 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
21970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21980 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
21990 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  rDistinct );.   
219a0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
219b0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
219c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
219d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
219e0 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 20 20  ue;  .          
219f0 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
21a00 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 29 7b  (eOp & WO_IN) ){
21a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
21a20 41 4c 57 41 59 53 28 29 20 6a 75 73 74 69 66 69  ALWAYS() justifi
21a30 63 61 74 69 6f 6e 3a 20 65 4f 70 20 69 73 20 61  cation: eOp is a
21a40 6e 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61  n equality opera
21a50 74 6f 72 20 64 75 65 20 74 6f 20 74 68 65 0a 20  tor due to the. 
21a60 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6a 3c             ** j<
21a70 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
21a80 45 71 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 62  Eq constraint ab
21a90 6f 76 65 2e 20 20 41 6e 79 20 65 71 75 61 6c 69  ove.  Any equali
21aa0 74 79 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20  ty other.       
21ab0 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 57 4f 5f       ** than WO_
21ac0 49 4e 20 69 73 20 63 61 70 74 75 72 65 64 20 62  IN is captured b
21ad0 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22  y the previous "
21ae0 69 66 22 2e 20 20 53 6f 20 74 68 69 73 20 6f 6e  if".  So this on
21af0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
21b00 20 61 6c 77 61 79 73 20 68 61 73 20 74 6f 20 62   always has to b
21b10 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20 20 20  e WO_IN. */.    
21b20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
21b30 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
21b40 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  [j]->pExpr;.    
21b50 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 2b          for(i=j+
21b60 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  1; i<pLoop->u.bt
21b70 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20  ree.nEq; i++){. 
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
21b90 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69   pLoop->aLTerm[i
21ba0 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29 7b 0a  ]->pExpr==pX ){.
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bc0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
21bd0 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70 65 72  aLTerm[i]->eOper
21be0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20 29 3b  ator & WO_IN) );
21bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21c00 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20   bOnce = 0;.    
21c10 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
21c20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
21c30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
21c40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21c50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
21c60 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d  /* Get the colum
21c70 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  n number in the 
21c80 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20  table (iColumn) 
21c90 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20  and sort order. 
21ca0 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64         ** (revId
21cb0 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20  x) for the j-th 
21cc0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
21cd0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  dex..        */.
21ce0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64          if( pInd
21cf0 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ex ){.          
21d00 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
21d10 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
21d20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
21d30 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  = pIndex->aSortO
21d40 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
21d50 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
21d60 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
21d70 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20  iPKey ) iColumn 
21d80 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20  = XN_ROWID;.    
21d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21da0 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58       iColumn = X
21db0 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20  N_ROWID;.       
21dc0 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20     revIdx = 0;. 
21dd0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21de0 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72    /* An unconstr
21df0 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61  ained column tha
21e00 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
21e10 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a  means that this.
21e20 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65          ** Where
21e30 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c  Loop is not well
21e40 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  -ordered.       
21e50 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
21e60 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a  isOrderDistinct.
21e70 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c           && iCol
21e80 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  umn>=0.         
21e90 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  && j>=pLoop->u.b
21ea0 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20  tree.nEq.       
21eb0 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61    && pIndex->pTa
21ec0 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
21ed0 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20  n].notNull==0.  
21ee0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21ef0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
21f00 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
21f10 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  }..        /* Fi
21f20 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  nd the ORDER BY 
21f30 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73  term that corres
21f40 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74  ponds to the j-t
21f50 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  h column.       
21f60 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
21f70 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f   and mark that O
21f80 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66  RDER BY term off
21f90 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
21fa0 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30       isMatch = 0
21fb0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
21fc0 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f  0; bOnce && i<nO
21fd0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
21fe0 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
21ff0 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
22000 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22010 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
22020 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
22030 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
22040 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
22050 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22060 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
22070 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
22080 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
22090 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
220a0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
220b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
220c0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
220d0 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57  (WHERE_GROUPBY|W
220e0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
220f0 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30  )==0 ) bOnce = 0
22100 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22110 69 43 6f 6c 75 6d 6e 3e 3d 58 4e 5f 52 4f 57 49  iColumn>=XN_ROWI
22120 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
22130 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
22140 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
22150 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
22160 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
22170 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
22180 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22190 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
221a0 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
221b0 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
221c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
221d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
221e0 72 20 2a 70 49 64 78 45 78 70 72 20 3d 20 70 49  r *pIdxExpr = pI
221f0 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  ndex->aColExpr->
22200 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[j].pExpr;.    
22210 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
22220 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b  te3ExprCompareSk
22230 69 70 28 70 4f 42 45 78 70 72 2c 20 70 49 64 78  ip(pOBExpr, pIdx
22240 45 78 70 72 2c 20 69 43 75 72 29 20 29 7b 0a 20  Expr, iCur) ){. 
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
22260 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
22270 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
22280 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
22290 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 52 4f 57 49 44  Column!=XN_ROWID
222a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
222b0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
222c0 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 49  xprNNCollSeq(pWI
222d0 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
222e0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
222f0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
22300 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
22310 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
22320 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
22330 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  j])!=0 ) continu
22340 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
22350 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
22360 75 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c 20  u.btree.nIdxCol 
22370 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  = j+1;.         
22380 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20   isMatch = 1;.  
22390 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
223a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
223b0 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26 20   if( isMatch && 
223c0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
223d0 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20  ERE_GROUPBY)==0 
223e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
223f0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f  Make sure the so
22400 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70  rt order is comp
22410 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44  atible in an ORD
22420 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
22430 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20          ** Sort 
22440 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76  order is irrelev
22450 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20  ant for a GROUP 
22460 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20  BY clause. */.  
22470 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53          if( revS
22480 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
22490 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76    if( (rev ^ rev
224a0 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e  Idx)!=pOrderBy->
224b0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
224c0 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
224d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
224e0 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20 3d             rev =
224f0 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72   revIdx ^ pOrder
22500 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
22510 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  er;.            
22520 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d  if( rev ) *pRevM
22530 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  ask |= MASKBIT(i
22540 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Loop);.         
22550 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20     revSet = 1;. 
22560 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
22580 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20   isMatch ){.    
22590 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
225a0 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20  n==XN_ROWID ){. 
225b0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
225c0 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c  ase( distinctCol
225d0 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20  umns==0 );.     
225e0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43         distinctC
225f0 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20  olumns = 1;.    
22600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22610 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
22620 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
22630 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22640 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e  /* No match foun
22650 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  d */.          i
22660 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65  f( j==0 || j<nKe
22670 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
22680 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
22690 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30  OrderDistinct!=0
226a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
226b0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
226c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
226d0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
226e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
226f0 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20    } /* end Loop 
22700 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63  over all index c
22710 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
22720 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  if( distinctColu
22730 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74  mns ){.        t
22740 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
22750 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20  Distinct==0 );. 
22760 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
22770 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20  stinct = 1;.    
22780 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64    }.    } /* end
22790 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20  -if not one-row 
227a0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  */..    /* Mark 
227b0 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52  off any other OR
227c0 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
227d0 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f  t reference pLoo
227e0 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f  p */.    if( isO
227f0 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
22800 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69        orderDisti
22810 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70  nctMask |= pLoop
22820 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
22830 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
22840 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
22850 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20       Expr *p;.  
22860 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54        Bitmask mT
22870 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
22880 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
22890 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
228a0 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64          p = pOrd
228b0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
228c0 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20  ;.        mTerm 
228d0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
228e0 70 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d  prUsage(&pWInfo-
228f0 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20  >sMaskSet,p);.  
22900 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d        if( mTerm=
22910 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
22920 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20  prIsConstant(p) 
22930 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22940 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e      if( (mTerm&~
22950 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
22960 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
22970 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
22980 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
22990 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
229a0 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c    } /* End the l
229b0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65  oop over all Whe
229c0 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74  reLoops from out
229d0 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20  er-most down to 
229e0 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20  inner-most */.  
229f0 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e  if( obSat==obDon
22a00 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e  e ) return (i8)n
22a10 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21  OrderBy;.  if( !
22a20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
22a30 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72  ){.    for(i=nOr
22a40 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d  derBy-1; i>0; i-
22a50 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  -){.      Bitmas
22a60 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29  k m = MASKBIT(i)
22a70 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   - 1;.      if( 
22a80 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72  (obSat&m)==m ) r
22a90 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20  eturn i;.    }. 
22aa0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
22ab0 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
22ac0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ../*.** If the W
22ad0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
22ae0 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  g is set in the 
22af0 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73  mask passed to s
22b00 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
22b10 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e  (),.** the plann
22b20 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  er assumes that 
22b30 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f  the specified pO
22b40 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61  rderBy list is a
22b50 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a  ctually a GROUP.
22b60 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61  ** BY clause - a
22b70 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20  nd so any order 
22b80 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73  that groups rows
22b90 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74   as required sat
22ba0 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65  isfies the.** re
22bb0 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  quest..**.** Nor
22bc0 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63  mally, in this c
22bd0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
22be0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63  ssible for the c
22bf0 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69  aller to determi
22c00 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  ne.** whether or
22c10 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72   not the rows ar
22c20 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64  e really being d
22c30 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74  elivered in sort
22c40 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20  ed order, or.** 
22c50 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68  just in some oth
22c60 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72  er order that pr
22c70 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69  ovides the requi
22c80 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f  red grouping. Ho
22c90 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65  wever,.** if the
22ca0 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
22cb0 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20  UP flag is also 
22cc0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
22cd0 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74  3WhereBegin(), t
22ce0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  hen.** this func
22cf0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
22d00 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  ed on the return
22d10 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a  ed WhereInfo obj
22d20 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a  ect. It returns.
22d30 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72  ** true if the r
22d40 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20  ows really will 
22d50 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65  be sorted in the
22d60 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72   specified order
22d70 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74  , or false.** ot
22d80 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46  herwise..**.** F
22d90 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
22da0 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  ming:.**.**   CR
22db0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
22dc0 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a   t1(x, Y);.**.**
22dd0 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45   then.**.**   SE
22de0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47  LECT * FROM t1 G
22df0 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45  ROUP BY x,y ORDE
22e00 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49  R BY x,y;   -- I
22e10 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20  sSorted()==1.** 
22e20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
22e30 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20  t1 GROUP BY y,x 
22e40 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20  ORDER BY y,x;   
22e50 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30  -- IsSorted()==0
22e60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
22e70 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65  hereIsSorted(Whe
22e80 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
22e90 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
22ea0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
22eb0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b  WHERE_GROUPBY );
22ec0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
22ed0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
22ee0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
22ef0 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  P );.  return pW
22f00 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a  Info->sorted;.}.
22f10 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
22f20 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f  CE_ENABLED./* Fo
22f30 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  r debugging use 
22f40 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20  only: */.static 
22f50 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72  const char *wher
22f60 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50  ePathName(WhereP
22f70 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20  ath *pPath, int 
22f80 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70  nLoop, WhereLoop
22f90 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74   *pLast){.  stat
22fa0 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35  ic char zName[65
22fb0 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ];.  int i;.  fo
22fc0 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20  r(i=0; i<nLoop; 
22fd0 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d  i++){ zName[i] =
22fe0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d   pPath->aLoop[i]
22ff0 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70  ->cId; }.  if( p
23000 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b  Last ) zName[i++
23010 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a  ] = pLast->cId;.
23020 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a    zName[i] = 0;.
23030 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
23040 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
23050 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20  Return the cost 
23060 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20  of sorting nRow 
23070 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74  rows, assuming t
23080 68 61 74 20 74 68 65 20 6b 65 79 73 20 68 61 76  hat the keys hav
23090 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63  e .** nOrderby c
230a0 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20  olumns and that 
230b0 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65  the first nSorte
230c0 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c  d columns are al
230d0 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65  ready in.** orde
230e0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  r..*/.static Log
230f0 45 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67  Est whereSorting
23100 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66  Cost(.  WhereInf
23110 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67  o *pWInfo,.  Log
23120 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20  Est nRow,.  int 
23130 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20  nOrderBy,.  int 
23140 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20  nSorted.){.  /* 
23150 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65  TUNING: Estimate
23160 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c  d cost of a full
23170 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20   external sort, 
23180 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a  where N is .  **
23190 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
231a0 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a  ows to sort is:.
231b0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74    **.  **   cost
231c0 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f   = (3.0 * N * lo
231d0 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a  g(N))..  ** .  *
231e0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64  * Or, if the ord
231f0 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73  er-by clause has
23200 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c   X terms but onl
23210 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20  y the last Y .  
23220 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74  ** terms are out
23230 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20   of order, then 
23240 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69  block-sorting wi
23250 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a 20  ll reduce the . 
23260 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74   ** sorting cost
23270 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
23280 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e   cost = (3.0 * N
23290 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f   * log(N)) * (Y/
232a0 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  X).  **.  ** The
232b0 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69   (Y/X) term is i
232c0 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
232d0 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20   stack variable 
232e0 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f  rScale.  ** belo
232f0 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  w.  */.  LogEst 
23300 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73  rScale, rSortCos
23310 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72  t;.  assert( nOr
23320 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73  derBy>0 && 66==s
23330 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30  qlite3LogEst(100
23340 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20  ) );.  rScale = 
23350 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e  sqlite3LogEst((n
23360 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29  OrderBy-nSorted)
23370 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d  *100/nOrderBy) -
23380 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74   66;.  rSortCost
23390 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c 65   = nRow + rScale
233a0 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c   + 16;..  /* Mul
233b0 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29 20  tiple by log(M) 
233c0 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20 6e  where M is the n
233d0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
233e0 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74  rows..  ** Use t
233f0 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20 69  he LIMIT for M i
23400 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  f it is smaller 
23410 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f  */.  if( (pWInfo
23420 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
23430 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 21  HERE_USE_LIMIT)!
23440 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69 4c  =0 && pWInfo->iL
23450 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20 20  imit<nRow ){.   
23460 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e   nRow = pWInfo->
23470 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 53  iLimit;.  }.  rS
23480 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f  ortCost += estLo
23490 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75 72  g(nRow);.  retur
234a0 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a  n rSortCost;.}..
234b0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
234c0 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
234d0 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49  p objects at pWI
234e0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69  nfo->pLoops, thi
234f0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74  s routine.** att
23500 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68  empts to find th
23510 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
23520 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65  th that visits e
23530 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a  ach WhereLoop.**
23540 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74   once.  This pat
23550 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64  h is then loaded
23560 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f   into the pWInfo
23570 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65  ->a[].pWLoop fie
23580 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d  lds..**.** Assum
23590 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c  e that the total
235a0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
235b0 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  t rows that will
235c0 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74   need to be sort
235d0 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52  ed.** will be nR
235e0 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30  owEst (in the 10
235f0 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61  *log2 representa
23600 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f  tion).  Or, igno
23610 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f  re sorting.** co
23620 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d  sts if nRowEst==
23630 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0..**.** Return 
23640 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
23650 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
23660 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79  OMEM of a memory
23670 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65   allocation.** e
23680 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
23690 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
236a0 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65  PathSolver(Where
236b0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f  Info *pWInfo, Lo
236c0 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20  gEst nRowEst){. 
236d0 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20   int mxChoice;  
236e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
236f0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
23700 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74  simultaneous pat
23710 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20  hs tracked */.  
23720 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20  int nLoop;      
23730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23740 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
23750 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61  the join */.  Pa
23760 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
23770 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
23780 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
23790 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
237a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
237b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
237c0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  tion */.  int iL
237d0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
237e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
237f0 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72  ter over the ter
23800 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ms of the join *
23810 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20  /.  int ii, jj; 
23820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23830 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
23840 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b  /.  int mxI = 0;
23850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23860 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65   Index of next e
23870 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20  ntry to replace 
23880 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
23890 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
238a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
238b0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
238c0 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78  s */.  LogEst mx
238d0 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Cost = 0;       
238e0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74   /* Maximum cost
238f0 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74   of a set of pat
23900 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  hs */.  LogEst m
23910 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20  xUnsorted = 0;  
23920 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73    /* Maximum uns
23930 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20  orted cost of a 
23940 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20  set of path */. 
23950 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b   int nTo, nFrom;
23960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23970 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e  mber of valid en
23980 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61  tries in aTo[] a
23990 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20  nd aFrom[] */.  
239a0 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d  WherePath *aFrom
239b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ;         /* All
239c0 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20   nFrom paths at 
239d0 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76  the previous lev
239e0 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
239f0 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20  h *aTo;         
23a00 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73    /* The nTo bes
23a10 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63  t paths at the c
23a20 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a  urrent level */.
23a30 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72    WherePath *pFr
23a40 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
23a50 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72  n element of aFr
23a60 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  om[] that we are
23a70 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
23a80 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b   WherePath *pTo;
23a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
23aa0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b   element of aTo[
23ab0 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
23ac0 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
23ad0 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b  ereLoop *pWLoop;
23ae0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
23af0 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
23b00 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65  objects */.  Whe
23b10 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20  reLoop **pX;    
23b20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
23b30 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53  o divy up the pS
23b40 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  pace memory */. 
23b50 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f   LogEst *aSortCo
23b60 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f  st = 0;    /* So
23b70 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61  rting and partia
23b80 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20  l sorting costs 
23b90 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
23ba0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
23bb0 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f  * Temporary memo
23bc0 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ry used by this 
23bd0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
23be0 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20 20   nSpace;        
23bf0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
23c00 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
23c10 65 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a  ed at pSpace */.
23c20 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
23c30 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
23c40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
23c50 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   nLoop = pWInfo-
23c60 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55  >nLevel;.  /* TU
23c70 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65  NING: For simple
23c80 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74   queries, only t
23c90 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20  he best path is 
23ca0 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f  tracked..  ** Fo
23cb0 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74  r 2-way joins, t
23cc0 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20  he 5 best paths 
23cd0 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20  are followed..  
23ce0 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20  ** For joins of 
23cf0 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73  3 or more tables
23d00 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62  , track the 10 b
23d10 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d  est paths */.  m
23d20 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70  xChoice = (nLoop
23d30 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f  <=1) ? 1 : (nLoo
23d40 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a  p==2 ? 5 : 10);.
23d50 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c    assert( nLoop<
23d60 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  =pWInfo->pTabLis
23d70 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45  t->nSrc );.  WHE
23d80 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28  RETRACE(0x002, (
23d90 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76  "---- begin solv
23da0 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64  er.  (nRowEst=%d
23db0 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b  )\n", nRowEst));
23dc0 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73  ..  /* If nRowEs
23dd0 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68  t is zero and th
23de0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
23df0 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72  BY clause, ignor
23e00 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20  e it. In this.  
23e10 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75 72 70  ** case the purp
23e20 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  ose of this call
23e30 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20   is to estimate 
23e40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
23e50 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  ws returned.  **
23e60 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   by the overall 
23e70 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73  query. Once this
23e80 20 65 73 74 69 6d 61 74 65 20 68 61 73 20 62 65   estimate has be
23e90 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  en obtained, the
23ea0 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c   caller.  ** wil
23eb0 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75  l invoke this fu
23ec0 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20  nction a second 
23ed0 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68  time, passing th
23ee0 65 20 65 73 74 69 6d 61 74 65 20 61 73 20 74 68  e estimate as th
23ef0 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70  e.  ** nRowEst p
23f00 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20  arameter.  */.  
23f10 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
23f20 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45  erBy==0 || nRowE
23f30 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72  st==0 ){.    nOr
23f40 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  derBy = 0;.  }el
23f50 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79  se{.    nOrderBy
23f60 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65   = pWInfo->pOrde
23f70 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  rBy->nExpr;.  }.
23f80 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
23f90 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70  nd initialize sp
23fa0 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72  ace for aTo, aFr
23fb0 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74  om and aSortCost
23fc0 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d  [] */.  nSpace =
23fd0 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61   (sizeof(WherePa
23fe0 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65  th)+sizeof(Where
23ff0 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78  Loop*)*nLoop)*mx
24000 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61  Choice*2;.  nSpa
24010 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67  ce += sizeof(Log
24020 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b  Est) * nOrderBy;
24030 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69  .  pSpace = sqli
24040 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
24050 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20  (db, nSpace);.  
24060 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20  if( pSpace==0 ) 
24070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
24080 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f 20  MEM_BKPT;.  aTo 
24090 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53  = (WherePath*)pS
240a0 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20  pace;.  aFrom = 
240b0 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20  aTo+mxChoice;.  
240c0 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c  memset(aFrom, 0,
240d0 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d   sizeof(aFrom[0]
240e0 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72  ));.  pX = (Wher
240f0 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d  eLoop**)(aFrom+m
24100 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28  xChoice);.  for(
24110 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70  ii=mxChoice*2, p
24120 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20  From=aTo; ii>0; 
24130 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70  ii--, pFrom++, p
24140 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20  X += nLoop){.   
24150 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20   pFrom->aLoop = 
24160 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f  pX;.  }.  if( nO
24170 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a  rderBy ){.    /*
24180 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
24190 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
241a0 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65  and it is not be
241b0 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74  ing ignored, set
241c0 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65   up.    ** space
241d0 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f   for the aSortCo
241e0 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68  st[] array. Each
241f0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
24200 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a  aSortCost array.
24210 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
24220 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20   zero - meaning 
24230 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  it has not yet b
24240 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
24250 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  - or the.    ** 
24260 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
24270 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20  nRowEst rows of 
24280 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20 66  data where the f
24290 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a  irst X terms of.
242a0 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
242b0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 61   BY clause are a
242c0 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c  lready in order,
242d0 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65 20   where X is the 
242e0 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e  array .    ** in
242f0 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f  dex.  */.    aSo
24300 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74  rtCost = (LogEst
24310 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74  *)pX;.    memset
24320 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73  (aSortCost, 0, s
24330 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20  izeof(LogEst) * 
24340 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  nOrderBy);.  }. 
24350 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
24360 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st==0 || &pSpace
24370 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
24380 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64  )&aSortCost[nOrd
24390 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72  erBy] );.  asser
243a0 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20  t( aSortCost!=0 
243b0 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
243c0 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b  e]==(char*)pX );
243d0 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
243e0 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
243f0 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
24400 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
24410 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
24420 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
24430 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
24440 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
24450 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49   go above 28.  I
24460 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
24470 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
24480 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
24490 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
244a0 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
244b0 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 28.  ** rows, 
244c0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
244d0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
244e0 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
244f0 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
24500 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
24510 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28 20  , 48);  assert( 
24520 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  48==sqlite3LogEs
24530 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(28) );.  nFrom
24540 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
24550 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
24560 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ed==0 );.  if( n
24570 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
24580 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65  * If nLoop is ze
24590 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61  ro, then there a
245a0 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73  re no FROM terms
245b0 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53   in the query. S
245c0 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  ince.    ** in t
245d0 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75 65  his case the que
245e0 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20  ry may return a 
245f0 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72  maximum of one r
24600 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ow, the results.
24610 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61      ** are alrea
24620 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  dy in the reques
24630 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69  ted order. Set i
24640 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64  sOrdered to nOrd
24650 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69  erBy to.    ** i
24660 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72  ndicate this. Or
24670 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72  , if nLoop is gr
24680 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
24690 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   set isOrdered t
246a0 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64  o.    ** -1, ind
246b0 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
246c0 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20   result set may 
246d0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72  or may not be or
246e0 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64  dered, .    ** d
246f0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
24700 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74  loops added to t
24710 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e  he current plan.
24720 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30    */.    aFrom[0
24730 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c  ].isOrdered = nL
24740 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72  oop>0 ? -1 : nOr
24750 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  derBy;.  }..  /*
24760 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   Compute success
24770 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65  ively longer Whe
24780 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68  rePaths using th
24790 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72  e previous gener
247a0 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68  ation.  ** of Wh
247b0 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20  erePaths as the 
247c0 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65  basis for the ne
247d0 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20  xt.  Keep track 
247e0 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
247f0 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20    ** best paths 
24800 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69  at each generati
24810 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  on */.  for(iLoo
24820 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
24830 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
24840 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nTo = 0;.    for
24850 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72  (ii=0, pFrom=aFr
24860 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  om; ii<nFrom; ii
24870 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
24880 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70      for(pWLoop=p
24890 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70  WInfo->pLoops; p
248a0 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57  WLoop; pWLoop=pW
248b0 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29  Loop->pNextLoop)
248c0 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  {.        LogEst
248d0 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20   nOut;          
248e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
248f0 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 28  ows visited by (
24900 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
24910 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
24920 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  rCost;          
24930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
24940 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f  st of path (pFro
24950 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
24960 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73       LogEst rUns
24970 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  orted;          
24980 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74         /* Unsort
24990 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f  ed cost of (pFro
249a0 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
249b0 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65       i8 isOrdere
249c0 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
249d0 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65  ered;  /* isOrde
249e0 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70  red for (pFrom+p
249f0 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
24a00 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
24a10 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
24a20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
24a30 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28 2e  rc visited by (.
24a40 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  .) */.        Bi
24a50 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
24a60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
24a70 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f  /* Mask of rev-o
24a80 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28  rder loops for (
24a90 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ..) */..        
24aa0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
24ab0 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
24ac0 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
24ad0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
24ae0 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
24af0 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
24b00 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
24b10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
24b20 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  f( (pWLoop->wsFl
24b30 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
24b40 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 46  _INDEX)!=0 && pF
24b50 72 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b 0a  rom->nRow<10 ){.
24b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
24b70 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74 6f 6d  not use an autom
24b80 61 74 69 63 20 69 6e 64 65 78 20 69 66 20 74 68  atic index if th
24b90 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 65  e this loop is e
24ba0 78 70 65 63 74 65 64 0a 20 20 20 20 20 20 20 20  xpected.        
24bb0 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73 73    ** to run less
24bc0 20 74 68 61 6e 20 32 20 74 69 6d 65 73 2e 20 2a   than 2 times. *
24bd0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
24be0 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
24bf0 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
24c00 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
24c10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24c20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
24c30 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20  nt, pWLoop is a 
24c40 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
24c50 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a  the next loop. .
24c60 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75          ** Compu
24c70 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20  te its cost */. 
24c80 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64         rUnsorted
24c90 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
24ca0 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74  Add(pWLoop->rSet
24cb0 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20  up,pWLoop->rRun 
24cc0 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a  + pFrom->nRow);.
24cd0 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
24ce0 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  d = sqlite3LogEs
24cf0 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20  tAdd(rUnsorted, 
24d00 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64  pFrom->rUnsorted
24d10 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20  );.        nOut 
24d20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20  = pFrom->nRow + 
24d30 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20  pWLoop->nOut;.  
24d40 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20        maskNew = 
24d50 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20  pFrom->maskLoop 
24d60 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  | pWLoop->maskSe
24d70 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  lf;.        if( 
24d80 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20  isOrdered<0 ){. 
24d90 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
24da0 65 64 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  ed = wherePathSa
24db0 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
24dc0 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20  WInfo,.         
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
24de0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
24df0 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77  pFrom, pWInfo->w
24e00 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20  ctrlFlags,.     
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c    iLoop, pWLoop,
24e30 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20   &revMask);.    
24e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24e50 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70       revMask = p
24e60 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20  From->revLoop;. 
24e70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24e80 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d   if( isOrdered>=
24e90 30 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e  0 && isOrdered<n
24ea0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
24eb0 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f       if( aSortCo
24ec0 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30  st[isOrdered]==0
24ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24ee0 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
24ef0 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72 74  red] = whereSort
24f00 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20 20  ingCost(.       
24f10 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2c           pWInfo,
24f20 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72   nRowEst, nOrder
24f30 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a 20 20  By, isOrdered.  
24f40 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
24f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24f60 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74     rCost = sqlit
24f70 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73  e3LogEstAdd(rUns
24f80 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73 74  orted, aSortCost
24f90 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20  [isOrdered]);.. 
24fa0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52           WHERETR
24fb0 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20  ACE(0x002,.     
24fc0 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20           ("---- 
24fd0 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28  sort cost=%-3d (
24fe0 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73  %d/%d) increases
24ff0 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33   cost %3d to %-3
25000 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
25010 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69       aSortCost[i
25020 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64  sOrdered], (nOrd
25030 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c  erBy-isOrdered),
25040 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20   nOrderBy, .    
25050 20 20 20 20 20 20 20 20 20 20 20 72 55 6e 73 6f             rUnso
25060 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20  rted, rCost));. 
25070 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25080 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
25090 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20  rUnsorted;.     
250a0 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 2d       rUnsorted -
250b0 3d 20 32 3b 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  = 2;  /* TUNING:
250c0 20 20 53 6c 69 67 68 74 20 62 69 61 73 20 69 6e    Slight bias in
250d0 20 66 61 76 6f 72 20 6f 66 20 6e 6f 2d 73 6f 72   favor of no-sor
250e0 74 20 70 6c 61 6e 73 20 2a 2f 0a 20 20 20 20 20  t plans */.     
250f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
25100 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
25110 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62   pWLoop should b
25120 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73  e added to the s
25130 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  et of.        **
25140 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d 73   mxChoice best-s
25150 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20 20  o-far paths..   
25160 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
25170 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f  ** First look fo
25180 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61  r an existing pa
25190 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f  th among best-so
251a0 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20 20 20  -far paths.     
251b0 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65 72     ** that cover
251c0 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  s the same set o
251d0 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20  f loops and has 
251e0 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72  the same isOrder
251f0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ed.        ** se
25200 74 74 69 6e 67 20 61 73 20 74 68 65 20 63 75 72  tting as the cur
25210 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69 64  rent path candid
25220 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ate..        **.
25230 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74          ** The t
25240 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72  erm "((pTo->isOr
25250 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29  dered^isOrdered)
25260 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65 71  &0x80)==0" is eq
25270 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20  uivalent.       
25280 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f   ** to (pTo->isO
25290 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28  rdered==(-1))==(
252a0 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29  isOrdered==(-1))
252b0 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 0a  " for the range.
252c0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65          ** of le
252d0 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 69  gal values for i
252e0 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34  sOrdered, -1..64
252f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
25300 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70       for(jj=0, p
25310 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20  To=aTo; jj<nTo; 
25320 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
25330 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
25340 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e  >maskLoop==maskN
25350 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ew.           &&
25360 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ((pTo->isOrdere
25370 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38  d^isOrdered)&0x8
25380 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  0)==0.          
25390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
253a0 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f  estcase( jj==nTo
253b0 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
253c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
253d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
253e0 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e         if( jj>=n
253f0 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  To ){.          
25400 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65  /* None of the e
25410 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d  xisting best-so-
25420 66 61 72 20 70 61 74 68 73 20 6d 61 74 63 68 20  far paths match 
25430 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a  the candidate. *
25440 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
25450 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20  nTo>=mxChoice.  
25460 20 20 20 20 20 20 20 20 20 26 26 20 28 72 43 6f           && (rCo
25470 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43  st>mxCost || (rC
25480 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72  ost==mxCost && r
25490 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f  Unsorted>=mxUnso
254a0 72 74 65 64 29 29 0a 20 20 20 20 20 20 20 20 20  rted)).         
254b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
254c0 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 63  /* The current c
254d0 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20 62  andidate is no b
254e0 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20 6f  etter than any o
254f0 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20  f the mxChoice. 
25500 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61             ** pa
25510 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ths currently in
25520 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61 72   the best-so-far
25530 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69 73   buffer.  So dis
25540 63 61 72 64 0a 20 20 20 20 20 20 20 20 20 20 20  card.           
25550 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64 61   ** this candida
25560 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c 65  te as not viable
25570 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  . */.#ifdef WHER
25580 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
25590 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
255a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
255b0 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
255c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
255d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
255e0 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f  tf("Skip   %s co
255f0 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20  st=%-3d,%3d,%3d 
25600 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
25610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
25620 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
25630 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
25640 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
25650 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20   rUnsorted,.    
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
25670 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
25680 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
25690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
256a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
256b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
256c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
256d0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
256e0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69  ch this points i
256f0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
25700 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65 20 70   new candidate p
25710 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ath.          **
25720 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 64   needs to be add
25730 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
25740 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
25750 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  hs. */.         
25760 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63   if( nTo<mxChoic
25770 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
25780 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
25790 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f   size of the aTo
257a0 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20   set by one */. 
257b0 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
257c0 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  nTo++;.         
257d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
257e0 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20      /* New path 
257f0 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69  replaces the pri
25800 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70  or worst to keep
25810 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43   count below mxC
25820 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  hoice */.       
25830 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20       jj = mxI;. 
25840 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25850 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
25860 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
25870 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
25880 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
25890 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
258a0 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
258b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
258c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
258d0 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25  New    %s cost=%
258e0 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65  -3d,%3d,%3d orde
258f0 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
25900 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
25910 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
25920 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
25930 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f  ost, nOut, rUnso
25940 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
25950 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
25960 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
25970 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
25980 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
25990 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
259a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f         /* Contro
259b0 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69  l reaches here i
259c0 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  f best-so-far pa
259d0 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63  th pTo=aTo[jj] c
259e0 6f 76 65 72 73 20 74 68 65 0a 20 20 20 20 20 20  overs the.      
259f0 20 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20      ** same set 
25a00 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73  of loops and has
25a10 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65   the same isOrde
25a20 72 65 64 20 73 65 74 74 69 6e 67 20 61 73 20 74  red setting as t
25a30 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
25a40 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20  candidate path. 
25a50 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
25a60 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73   the candidate s
25a70 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20  hould replace.  
25a80 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f          ** pTo o
25a90 72 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  r if the candida
25aa0 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69  te should be ski
25ab0 70 70 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  pped..          
25ac0 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ** .          **
25ad0 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   The conditional
25ae0 20 69 73 20 61 6e 20 65 78 70 61 6e 64 65 64 20   is an expanded 
25af0 76 65 63 74 6f 72 20 63 6f 6d 70 61 72 69 73 6f  vector compariso
25b00 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  n equivalent to:
25b10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
25b20 28 70 54 6f 2d 3e 72 43 6f 73 74 2c 70 54 6f 2d  (pTo->rCost,pTo-
25b30 3e 6e 52 6f 77 2c 70 54 6f 2d 3e 72 55 6e 73 6f  >nRow,pTo->rUnso
25b40 72 74 65 64 29 20 3c 3d 20 28 72 43 6f 73 74 2c  rted) <= (rCost,
25b50 6e 4f 75 74 2c 72 55 6e 73 6f 72 74 65 64 29 0a  nOut,rUnsorted).
25b60 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
25b70 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
25b80 72 43 6f 73 74 3c 72 43 6f 73 74 20 0a 20 20 20  rCost<rCost .   
25b90 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d          || (pTo-
25ba0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 0a 20 20  >rCost==rCost.  
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
25bc0 28 70 54 6f 2d 3e 6e 52 6f 77 3c 6e 4f 75 74 0a  (pTo->nRow<nOut.
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 6e 52 6f 77     || (pTo->nRow
25bf0 3d 3d 6e 4f 75 74 20 26 26 20 70 54 6f 2d 3e 72  ==nOut && pTo->r
25c00 55 6e 73 6f 72 74 65 64 3c 3d 72 55 6e 73 6f 72  Unsorted<=rUnsor
25c10 74 65 64 29 0a 20 20 20 20 20 20 20 20 20 20 20  ted).           
25c20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
25c30 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
25c40 20 20 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45     ){.#ifdef WHE
25c50 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
25c60 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
25c70 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
25c80 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
25c90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25ca0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25cb0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
25cc0 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25         "Skip   %
25cd0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c  s cost=%-3d,%3d,
25ce0 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d00 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
25d10 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
25d20 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
25d30 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20  t, rUnsorted,.  
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
25d60 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
25d70 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
25d80 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25d90 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20  rintf("   vs %s 
25da0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33  cost=%-3d,%3d,%3
25db0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
25de0 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
25df0 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
25e00 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
25e10 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72            pTo->r
25e20 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e 69  Unsorted, pTo->i
25e30 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
25e40 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
25e50 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
25e60 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
25e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
25e80 63 61 72 64 20 74 68 65 20 63 61 6e 64 69 64 61  card the candida
25e90 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72  te path from fur
25ea0 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69  ther considerati
25eb0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
25ec0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
25ed0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b  >rCost==rCost );
25ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
25ef0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
25f00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
25f10 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
25f20 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20  t==rCost+1 );.  
25f30 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72          /* Contr
25f40 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20  ol reaches here 
25f50 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
25f60 20 70 61 74 68 20 69 73 20 62 65 74 74 65 72 20   path is better 
25f70 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20  than the.       
25f80 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20     ** pTo path. 
25f90 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74   Replace pTo wit
25fa0 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
25fb0 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
25fc0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
25fd0 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
25fe0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25ff0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
26000 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26010 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
26020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
26030 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25  Update %s cost=%
26040 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65  -3d,%3d,%3d orde
26050 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
26060 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
26070 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
26080 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
26090 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74  t, nOut, rUnsort
260a0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
260b0 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
260c0 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
260d0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
260e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
260f0 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25  gPrintf("  was %
26100 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c  s cost=%-3d,%3d,
26110 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
26120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26130 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
26140 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
26150 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
26160 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
26170 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e          pTo->rUn
26180 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f  sorted, pTo->isO
26190 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d  rdered>=0 ? pTo-
261a0 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a  >isOrdered+'0' :
261b0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
261c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
261d0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70    }.        /* p
261e0 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65  WLoop is a winne
261f0 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74 68  r.  Add it to th
26200 65 20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f  e set of best so
26210 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
26220 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20  pTo->maskLoop = 
26230 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20  pFrom->maskLoop 
26240 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  | pWLoop->maskSe
26250 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  lf;.        pTo-
26260 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61  >revLoop = revMa
26270 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  sk;.        pTo-
26280 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20  >nRow = nOut;.  
26290 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74        pTo->rCost
262a0 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20   = rCost;.      
262b0 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64    pTo->rUnsorted
262c0 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20   = rUnsorted;.  
262d0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
262e0 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64  ered = isOrdered
262f0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
26300 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72  (pTo->aLoop, pFr
26310 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f  om->aLoop, sizeo
26320 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c  f(WhereLoop*)*iL
26330 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54  oop);.        pT
26340 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  o->aLoop[iLoop] 
26350 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  = pWLoop;.      
26360 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
26370 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
26380 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20   mxI = 0;.      
26390 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f      mxCost = aTo
263a0 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  [0].rCost;.     
263b0 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20       mxUnsorted 
263c0 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20  = aTo[0].nRow;. 
263d0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
263e0 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20  1, pTo=&aTo[1]; 
263f0 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b  jj<mxChoice; jj+
26400 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
26410 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
26420 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20  rCost>mxCost .  
26430 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
26440 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73  To->rCost==mxCos
26450 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  t && pTo->rUnsor
26460 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20  ted>mxUnsorted) 
26470 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
26490 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73  Cost = pTo->rCos
264a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
264b0 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54   mxUnsorted = pT
264c0 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20  o->rUnsorted;.  
264d0 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49 20              mxI 
264e0 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  = jj;.          
264f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
26500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26510 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  }.    }..#ifdef 
26520 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
26530 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20  ED  /* >=2 */.  
26540 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
26550 72 65 54 72 61 63 65 20 26 20 30 78 30 32 20 29  reTrace & 0x02 )
26560 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
26570 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
26580 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20   after round %d 
26590 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b  ----\n", iLoop);
265a0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  .      for(ii=0,
265b0 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f   pTo=aTo; ii<nTo
265c0 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; ii++, pTo++){.
265d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
265e0 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20  ebugPrintf(" %s 
265f0 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25  cost=%-3d nrow=%
26600 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
26610 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
26620 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
26630 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
26640 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
26650 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d  .           pTo-
26660 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20  >isOrdered>=0 ? 
26670 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b  (pTo->isOrdered+
26680 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  '0') : '?');.   
26690 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73       if( pTo->is
266a0 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20  Ordered>0 ){.   
266b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
266c0 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d  bugPrintf(" rev=
266d0 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e  0x%llx\n", pTo->
266e0 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  revLoop);.      
266f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26700 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26710 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
26720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26730 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
26740 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c   /* Swap the rol
26750 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20  es of aFrom and 
26760 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74  aTo for the next
26770 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
26780 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a     pFrom = aTo;.
26790 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b      aTo = aFrom;
267a0 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72  .    aFrom = pFr
267b0 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20  om;.    nFrom = 
267c0 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nTo;.  }..  if( 
267d0 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nFrom==0 ){.    
267e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
267f0 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72  pParse, "no quer
26800 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20  y solution");.  
26810 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
26820 4e 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  N(db, pSpace);. 
26830 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26840 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
26850 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
26860 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
26870 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
26880 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
26890 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
268a0 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66  rom = aFrom;.  f
268b0 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
268c0 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
268d0 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
268e0 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
268f0 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
26900 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ii];.  }.  asser
26910 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
26920 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a  l==nLoop );.  /*
26930 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74   Load the lowest
26940 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20   cost path into 
26950 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28  pWInfo */.  for(
26960 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
26970 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
26980 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
26990 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
269a0 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20  >a + iLoop;.    
269b0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d  pLevel->pWLoop =
269c0 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d   pWLoop = pFrom-
269d0 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
269e0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
269f0 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b   = pWLoop->iTab;
26a00 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
26a10 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  bCur = pWInfo->p
26a20 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
26a30 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
26a40 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57  r;.  }.  if( (pW
26a50 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
26a60 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
26a70 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26  STINCT)!=0.   &&
26a80 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
26a90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
26aa0 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26  TINCTBY)==0.   &
26ab0 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  & pWInfo->eDisti
26ac0 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
26ad0 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e  NCT_NOOP.   && n
26ae0 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20  RowEst.  ){.    
26af0 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b  Bitmask notUsed;
26b00 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68  .    int rc = wh
26b10 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
26b20 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
26b30 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
26b40 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20  et, pFrom,.     
26b50 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
26b60 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c  E_DISTINCTBY, nL
26b70 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
26b80 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e  oop[nLoop-1], &n
26b90 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
26ba0 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65   rc==pWInfo->pRe
26bb0 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29  sultSet->nExpr )
26bc0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
26bd0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
26be0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
26bf0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
26c00 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
26c10 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
26c20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
26c30 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
26c40 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69  NCTBY ){.      i
26c50 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65  f( pFrom->isOrde
26c60 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  red==pWInfo->pOr
26c70 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
26c80 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
26c90 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
26ca0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
26cb0 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
26cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
26cd0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46  nfo->nOBSat = pF
26ce0 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a  rom->isOrdered;.
26cf0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
26d00 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
26d10 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66  evLoop;.      if
26d20 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
26d30 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  <=0 ){.        p
26d40 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20  WInfo->nOBSat = 
26d50 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  0;.        if( n
26d60 4c 6f 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20 20  Loop>0 ){.      
26d70 20 20 20 20 75 33 32 20 77 73 46 6c 61 67 73 20      u32 wsFlags 
26d80 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  = pFrom->aLoop[n
26d90 4c 6f 6f 70 2d 31 5d 2d 3e 77 73 46 6c 61 67 73  Loop-1]->wsFlags
26da0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26db0 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
26dc0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 0a 20 20 20  _ONEROW)==0 .   
26dd0 20 20 20 20 20 20 20 20 26 26 20 28 77 73 46 6c          && (wsFl
26de0 61 67 73 26 28 57 48 45 52 45 5f 49 50 4b 7c 57  ags&(WHERE_IPK|W
26df0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29  HERE_COLUMN_IN))
26e00 21 3d 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  !=(WHERE_IPK|WHE
26e10 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 0a 20 20  RE_COLUMN_IN).  
26e20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26e30 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
26e40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
26e50 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65    int rc = where
26e60 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
26e70 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
26e80 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  nfo->pOrderBy, p
26e90 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
26eb0 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 2c  E_ORDERBY_LIMIT,
26ec0 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
26ed0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
26ee0 20 26 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &m);.          
26ef0 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c    testcase( wsFl
26f00 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20  ags & WHERE_IPK 
26f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
26f20 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73  estcase( wsFlags
26f30 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
26f40 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  IN );.          
26f50 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f    if( rc==pWInfo
26f60 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
26f70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
26f80 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65     pWInfo->bOrde
26f90 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31  redInnerLoop = 1
26fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26fb0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
26fc0 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = m;.           
26fd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
26fe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
26ff0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
27000 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
27010 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42  gs & WHERE_SORTB
27020 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20  YGROUP).        
27030 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
27040 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  t==pWInfo->pOrde
27050 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e 4c  rBy->nExpr && nL
27060 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20  oop>0.    ){.   
27070 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
27080 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  sk = 0;.      in
27090 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72 65  t nOrder = where
270a0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
270b0 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
270c0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a  nfo->pOrderBy, .
270d0 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2c            pFrom,
270e0 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72   0, nLoop-1, pFr
270f0 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
27100 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20 20  1], &revMask.   
27110 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
27120 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  rt( pWInfo->sort
27130 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ed==0 );.      i
27140 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66  f( nOrder==pWInf
27150 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
27160 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57  pr ){.        pW
27170 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31  Info->sorted = 1
27180 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
27190 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d  ->revMask = revM
271a0 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
271b0 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66   }.  }...  pWInf
271c0 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72  o->nRowOut = pFr
271d0 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20  om->nRow;..  /* 
271e0 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d  Free temporary m
271f0 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e  emory and return
27200 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71   success */.  sq
27210 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
27220 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74  , pSpace);.  ret
27230 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27240 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65  ../*.** Most que
27250 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20  ries use only a 
27260 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68  single table (th
27270 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73  ey are not joins
27280 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69  ) and have.** si
27290 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  mple == constrai
272a0 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65  nts against inde
272b0 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69  xed fields.  Thi
272c0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
272d0 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68  ts.** to plan th
272e0 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73  ose simple cases
272f0 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73   using much less
27300 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74   ceremony than t
27310 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  he.** general-pu
27320 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
27330 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79  ner, and thereby
27340 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71   yield faster sq
27350 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
27360 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  ** times for the
27370 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a   common case..**
27380 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
27390 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
273a0 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61  if this query ca
273b0 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  n be handled by 
273c0 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c  this.** no-frill
273d0 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  s query planner.
273e0 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
273f0 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64   this query need
27400 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61  s the .** genera
27410 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
27420 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74  planner..*/.stat
27430 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72  ic int whereShor
27440 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  tCut(WhereLoopBu
27450 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
27460 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
27470 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  WInfo;.  struct 
27480 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
27490 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  tem;.  WhereClau
274a0 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
274b0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57  Term *pTerm;.  W
274c0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
274d0 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
274e0 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt j;.  Table *p
274f0 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
27500 64 78 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20  dx;..  pWInfo = 
27510 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
27520 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
27530 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27540 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
27550 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
27560 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54  sert( pWInfo->pT
27570 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20  abList->nSrc>=1 
27580 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
27590 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
275a0 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d  ;.  pTab = pItem
275b0 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73  ->pTab;.  if( Is
275c0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
275d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
275e0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
275f0 78 65 64 42 79 20 29 20 72 65 74 75 72 6e 20 30  xedBy ) return 0
27600 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
27610 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43  ->iCursor;.  pWC
27620 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
27630 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c  .  pLoop = pBuil
27640 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f  der->pNew;.  pLo
27650 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b  op->wsFlags = 0;
27660 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20  .  pLoop->nSkip 
27670 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73  = 0;.  pTerm = s
27680 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
27690 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
276a0 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  1, 0, WO_EQ|WO_I
276b0 53 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  S, 0);.  if( pTe
276c0 72 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  rm ){.    testca
276d0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
276e0 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
276f0 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
27700 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
27710 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57  N_EQ|WHERE_IPK|W
27720 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
27730 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
27740 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70  ] = pTerm;.    p
27750 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  Loop->nLTerm = 1
27760 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  ;.    pLoop->u.b
27770 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
27780 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
27790 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f  t of a rowid loo
277a0 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20  kup is 10 */.   
277b0 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
277c0 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74  3;  /* 33==sqlit
277d0 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a  e3LogEst(10) */.
277e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
277f0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
27800 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
27810 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
27820 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20     int opMask;. 
27830 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
27840 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d  op->aLTermSpace=
27850 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29  =pLoop->aLTerm )
27860 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 55  ;.      if( !IsU
27870 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
27880 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
27890 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
278a0 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  0 .       || pId
278b0 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79  x->nKeyCol>Array
278c0 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Size(pLoop->aLTe
278d0 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20  rmSpace) .      
278e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
278f0 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d    opMask = pIdx-
27900 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28  >uniqNotNull ? (
27910 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57  WO_EQ|WO_IS) : W
27920 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28  O_EQ;.      for(
27930 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65  j=0; j<pIdx->nKe
27940 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
27950 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69      pTerm = sqli
27960 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d  te3WhereFindTerm
27970 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30  (pWC, iCur, j, 0
27980 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b  , opMask, pIdx);
27990 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
279a0 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rm==0 ) break;. 
279b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
279c0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
279d0 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
279e0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65       pLoop->aLTe
279f0 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[j] = pTerm;. 
27a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27a10 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   j!=pIdx->nKeyCo
27a20 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
27a30 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
27a40 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
27a50 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  N_EQ|WHERE_ONERO
27a60 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  W|WHERE_INDEXED;
27a70 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
27a80 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28  >isCovering || (
27a90 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  pItem->colUsed &
27aa0 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
27ab0 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20  (pIdx))==0 ){.  
27ac0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
27ad0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
27ae0 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  X_ONLY;.      }.
27af0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54        pLoop->nLT
27b00 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  erm = j;.      p
27b10 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
27b20 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  q = j;.      pLo
27b30 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
27b40 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  ex = pIdx;.     
27b50 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
27b60 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64   of a unique ind
27b70 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20  ex lookup is 15 
27b80 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  */.      pLoop->
27b90 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33  rRun = 39;  /* 3
27ba0 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  9==sqlite3LogEst
27bb0 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72  (15) */.      br
27bc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
27bd0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
27be0 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  ags ){.    pLoop
27bf0 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74  ->nOut = (LogEst
27c00 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  )1;.    pWInfo->
27c10 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c  a[0].pWLoop = pL
27c20 6f 6f 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28  oop;.    assert(
27c30 20 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65   pWInfo->sMaskSe
27c40 74 2e 6e 3d 3d 31 20 26 26 20 69 43 75 72 3d 3d  t.n==1 && iCur==
27c50 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
27c60 2e 69 78 5b 30 5d 20 29 3b 0a 20 20 20 20 70 4c  .ix[0] );.    pL
27c70 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  oop->maskSelf = 
27c80 31 3b 20 2f 2a 20 73 71 6c 69 74 65 33 57 68 65  1; /* sqlite3Whe
27c90 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  reGetMask(&pWInf
27ca0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
27cb0 72 29 3b 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66  r); */.    pWInf
27cc0 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20  o->a[0].iTabCur 
27cd0 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e  = iCur;.    pWIn
27ce0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b  fo->nRowOut = 1;
27cf0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
27d00 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e  >pOrderBy ) pWIn
27d10 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57  fo->nOBSat =  pW
27d20 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
27d30 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  nExpr;.    if( p
27d40 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
27d50 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
27d60 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
27d70 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
27d80 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
27d90 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
27da0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
27db0 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d  DEBUG.    pLoop-
27dc0 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64  >cId = '0';.#end
27dd0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  if.    return 1;
27de0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
27df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
27e00 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 78   function for ex
27e10 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69  prIsDeterministi
27e20 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  c()..*/.static i
27e30 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 44 65 74  nt exprNodeIsDet
27e40 65 72 6d 69 6e 69 73 74 69 63 28 57 61 6c 6b 65  erministic(Walke
27e50 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
27e60 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
27e70 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55  pExpr->op==TK_FU
27e80 4e 43 54 49 4f 4e 20 26 26 20 45 78 70 72 48 61  NCTION && ExprHa
27e90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
27ea0 20 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 3d 3d   EP_ConstFunc)==
27eb0 30 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  0 ){.    pWalker
27ec0 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
27ed0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
27ee0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
27ef0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
27f00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
27f10 75 65 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ue if the expres
27f20 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  sion contains no
27f30 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
27f40 69 63 20 53 51 4c 20 0a 2a 2a 20 66 75 6e 63 74  ic SQL .** funct
27f50 69 6f 6e 73 2e 20 44 6f 20 6e 6f 74 20 63 6f 6e  ions. Do not con
27f60 73 69 64 65 72 20 6e 6f 6e 2d 64 65 74 65 72 6d  sider non-determ
27f70 69 6e 69 73 74 69 63 20 53 51 4c 20 66 75 6e 63  inistic SQL func
27f80 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 0a  tions that are .
27f90 2a 2a 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73  ** part of sub-s
27fa0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
27fb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27fc0 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73  exprIsDeterminis
27fd0 74 69 63 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  tic(Expr *p){.  
27fe0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
27ff0 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
28000 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20  (w));.  w.eCode 
28010 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
28020 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
28030 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63  eIsDeterministic
28040 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
28050 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53  lback = sqlite3S
28060 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 20  electWalkFail;. 
28070 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
28080 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
28090 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
280a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
280b0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
280c0 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
280d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
280e0 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
280f0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
28100 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
28110 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
28120 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
28130 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
28140 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
28150 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
28160 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
28170 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
28180 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
28190 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
281a0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
281b0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
281c0 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
281d0 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
281e0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
281f0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
28200 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
28210 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
28220 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
28230 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
28240 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
28250 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
28260 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
28270 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
28280 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
28290 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
282a0 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
282b0 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
282c0 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
282d0 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
282e0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
282f0 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
28300 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
28310 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
28320 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
28330 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
28340 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
28350 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
28360 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
28370 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
28380 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
28390 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
283a0 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
283b0 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
283c0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
283d0 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
283e0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
283f0 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
28400 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
28410 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
28420 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
28430 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
28440 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
28450 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
28460 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
28470 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
28480 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
284b0 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
284c0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
284f0 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
28500 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
28510 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
28520 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
28530 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
28540 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
28550 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
28560 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
28570 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
28580 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
28590 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
285a0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
285b0 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
285c0 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
285d0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
285e0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
285f0 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
28600 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
28610 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
28620 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
28630 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
28640 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
28650 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
28660 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
28670 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
28680 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
28690 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
286a0 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
286b0 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
286c0 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
286d0 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
286e0 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
286f0 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
28700 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
28710 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
28720 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
28730 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
28740 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
28750 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
28760 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
28770 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
28780 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
28790 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
287a0 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
287b0 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
287c0 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
287d0 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
287e0 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
287f0 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
28800 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
28810 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
28820 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
28830 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
28840 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
28850 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
28860 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
28870 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
28880 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
28890 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
288a0 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
288b0 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
288c0 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
288d0 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
288e0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
288f0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
28900 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
28910 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
28920 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
28930 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
28940 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
28950 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
28960 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
28970 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
28980 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
28990 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
289a0 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
289b0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
289c0 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
289d0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
289e0 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
289f0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
28a00 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
28a10 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
28a20 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
28a30 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
28a40 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
28a50 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
28a60 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
28a70 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
28a80 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
28a90 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
28aa0 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
28ab0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
28ac0 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
28ad0 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
28ae0 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
28af0 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
28b00 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
28b10 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
28b20 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
28b30 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
28b40 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
28b50 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
28b60 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
28b70 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
28b80 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
28b90 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
28ba0 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
28bb0 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
28bc0 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
28bd0 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
28be0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
28bf0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
28c00 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
28c10 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
28c20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
28c30 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
28c40 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
28c50 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
28c60 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
28c70 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
28c80 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
28c90 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
28ca0 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
28cb0 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
28cc0 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
28cd0 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
28ce0 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
28cf0 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
28d00 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
28d10 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
28d20 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
28d30 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f  DER BY clause (o
28d40 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
28d50 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20  lause.** if the 
28d60 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
28d70 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74  ag is set in wct
28d80 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45  rlFlags) of a SE
28d90 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
28da0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
28db0 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
28dc0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
28dd0 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
28de0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
28df0 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
28e00 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
28e10 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
28e20 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
28e30 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20  .** The iIdxCur 
28e40 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
28e50 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
28e60 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20  f an index.  If 
28e70 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  .** WHERE_OR_SUB
28e80 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69  CLAUSE is set, i
28e90 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63 75  IdxCur is the cu
28ea0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
28eb0 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73  n index.** to us
28ec0 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  e for OR clause 
28ed0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
28ee0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 68   WHERE clause sh
28ef0 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a  ould use this.**
28f00 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f 72   specific cursor
28f10 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50  .  If WHERE_ONEP
28f20 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20 73  ASS_DESIRED is s
28f30 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72  et, then iIdxCur
28f40 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
28f50 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72   cursor in an ar
28f60 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66  ray of cursors f
28f70 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20  or all indices. 
28f80 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a   iIdxCur should.
28f90 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f  ** be used to co
28fa0 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f 70  mpute the approp
28fb0 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65 70  riate cursor dep
28fc0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20  ending on which 
28fd0 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64  index is.** used
28fe0 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a  ..*/.WhereInfo *
28ff0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
29000 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
29010 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
29020 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
29030 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
29040 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
29050 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20  /* FROM clause: 
29060 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
29070 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
29080 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
29090 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 20 20  here,           
290a0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
290b0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
290c0 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
290d0 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
290e0 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
290f0 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
29100 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65  .  ExprList *pRe
29110 73 75 6c 74 53 65 74 2c 20 20 20 2f 2a 20 51 75  sultSet,   /* Qu
29120 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 2e 20  ery result set. 
29130 20 52 65 71 27 64 20 66 6f 72 20 44 49 53 54 49   Req'd for DISTI
29140 4e 43 54 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  NCT */.  u16 wct
29150 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  rlFlags,        
29160 20 2f 2a 20 54 68 65 20 57 48 45 52 45 5f 2a 20   /* The WHERE_* 
29170 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
29180 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
29190 20 20 69 6e 74 20 69 41 75 78 41 72 67 20 20 20    int iAuxArg   
291a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
291b0 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
291c0 53 45 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78  SE is set, index
291d0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20   cursor number. 
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291f0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 57           ** If W
29200 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 2c 20  HERE_USE_LIMIT, 
29210 74 68 65 6e 20 74 68 65 20 6c 69 6d 69 74 20 61  then the limit a
29220 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  mount */.){.  in
29230 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
29240 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
29250 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
29260 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
29270 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  truct */.  int n
29280 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
29290 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
292a0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70  of elements in p
292b0 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
292c0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
292d0 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
292e0 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
292f0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
29300 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
29310 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
29320 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
29330 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
29340 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
29350 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
29360 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
29370 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
29380 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
29390 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
293a0 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f  lder sWLB;     /
293b0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
293c0 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65  builder */.  Whe
293d0 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
293e0 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65  Set;    /* The e
293f0 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
29400 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  et */.  WhereLev
29410 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20  el *pLevel;     
29420 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
29430 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e  evel in pWInfo->
29440 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  a[] */.  WhereLo
29450 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
29460 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
29470 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  o a single Where
29480 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
29490 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
294a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
294b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
294c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
294d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
294e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
294f0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29510 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
29520 65 20 2a 2f 0a 20 20 75 38 20 62 46 6f 72 64 65  e */.  u8 bForde
29530 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  lete = 0;       
29540 20 20 2f 2a 20 4f 50 46 4c 41 47 5f 46 4f 52 44    /* OPFLAG_FORD
29550 45 4c 45 54 45 20 6f 72 20 7a 65 72 6f 2c 20 61  ELETE or zero, a
29560 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  s appropriate */
29570 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  ..  assert( (wct
29580 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
29590 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
295a0 29 3d 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20 20  )==0 || (.      
295b0 20 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20    (wctrlFlags & 
295c0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
295d0 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 20 20  SIRED)!=0 .     
295e0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
295f0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
29600 55 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a  USE)==0 .  ));..
29610 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66    /* Only one of
29620 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
29630 55 53 45 20 6f 72 20 57 48 45 52 45 5f 55 53 45  USE or WHERE_USE
29640 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73 65  _LIMIT */.  asse
29650 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
29660 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
29670 41 55 53 45 29 3d 3d 30 0a 20 20 20 20 20 20 20  AUSE)==0.       
29680 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
29690 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f  ags & WHERE_USE_
296a0 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20 20  LIMIT)==0 );..  
296b0 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74  /* Variable init
296c0 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
296d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
296e0 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c  .  memset(&sWLB,
296f0 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29   0, sizeof(sWLB)
29700 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45  );..  /* An ORDE
29710 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  R/GROUP BY claus
29720 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36  e of more than 6
29730 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62  3 terms cannot b
29740 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20  e optimized */. 
29750 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64 65   testcase( pOrde
29760 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
29770 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b  >nExpr==BMS-1 );
29780 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
29790 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  && pOrderBy->nEx
297a0 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72  pr>=BMS ) pOrder
297b0 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70  By = 0;.  sWLB.p
297c0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
297d0 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c  By;..  /* Disabl
297e0 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  e the DISTINCT o
297f0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53  ptimization if S
29800 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
29810 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a  t is set via.  *
29820 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
29830 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  trl(SQLITE_TESTC
29840 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
29850 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20  S,...) */.  if( 
29860 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
29870 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
29880 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a  DistinctOpt) ){.
29890 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26      wctrlFlags &
298a0 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49  = ~WHERE_WANT_DI
298b0 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f  STINCT;.  }..  /
298c0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
298d0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
298e0 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
298f0 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
29900 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
29910 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
29920 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
29930 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
29940 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
29950 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
29960 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
29970 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
29980 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
29990 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
299a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
299b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
299c0 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
299d0 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
299e0 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
299f0 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
29a00 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
29a10 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 52   if the WHERE_OR
29a20 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67 20  _SUBCLAUSE flag 
29a30 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20  is set, then we 
29a40 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79  should.  ** only
29a50 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   generate code f
29a60 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62  or the first tab
29a70 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61  le in pTabList a
29a80 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20  nd assume that. 
29a90 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20   ** any cursors 
29aa0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
29ab0 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65  subsequent table
29ac0 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69  s are uninitiali
29ad0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62  zed..  */.  nTab
29ae0 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61  List = (wctrlFla
29af0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
29b00 42 43 4c 41 55 53 45 29 20 3f 20 31 20 3a 20 70  BCLAUSE) ? 1 : p
29b10 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a  TabList->nSrc;..
29b20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
29b30 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
29b40 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
29b50 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
29b60 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
29b70 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73  eturn value. A s
29b80 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  ingle allocation
29b90 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
29ba0 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a  e the WhereInfo.
29bb0 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65    ** struct, the
29bc0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65   contents of Whe
29bd0 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20  reInfo.a[], the 
29be0 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
29bf0 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74  cture.  ** and t
29c00 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  he WhereMaskSet 
29c10 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65  structure. Since
29c20 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e   WhereClause con
29c30 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a  tains an 8-byte.
29c40 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65    ** field (type
29c50 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73   Bitmask) it mus
29c60 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20  t be aligned on 
29c70 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
29c80 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20  ry on.  ** some 
29c90 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48  architectures. H
29ca0 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28  ence the ROUND8(
29cb0 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  ) below..  */.  
29cc0 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55  nByteWInfo = ROU
29cd0 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65  ND8(sizeof(Where
29ce0 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d  Info)+(nTabList-
29cf0 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  1)*sizeof(WhereL
29d00 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f  evel));.  pWInfo
29d10 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
29d20 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74  ocRawNN(db, nByt
29d30 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28  eWInfo + sizeof(
29d40 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69  WhereLoop));.  i
29d50 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
29d60 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
29d70 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
29d80 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  nfo);.    pWInfo
29d90 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77   = 0;.    goto w
29da0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
29db0 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50    }.  pWInfo->pP
29dc0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
29dd0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
29de0 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
29df0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
29e00 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
29e10 57 49 6e 66 6f 2d 3e 70 57 68 65 72 65 20 3d 20  WInfo->pWhere = 
29e20 70 57 68 65 72 65 3b 0a 20 20 70 57 49 6e 66 6f  pWhere;.  pWInfo
29e30 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70  ->pResultSet = p
29e40 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49  ResultSet;.  pWI
29e50 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
29e60 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  s[0] = pWInfo->a
29e70 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
29e80 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   -1;.  pWInfo->n
29e90 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
29ea0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
29eb0 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ak = pWInfo->iCo
29ec0 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
29ed0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
29ee0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
29ef0 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
29f00 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  ags;.  pWInfo->i
29f10 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72 67 3b  Limit = iAuxArg;
29f20 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64  .  pWInfo->saved
29f30 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
29f40 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
29f50 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49 6e 66  .  memset(&pWInf
29f60 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30 2c 20 0a 20  o->nOBSat, 0, . 
29f70 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 6f 66          offsetof
29f80 28 57 68 65 72 65 49 6e 66 6f 2c 73 57 43 29 20  (WhereInfo,sWC) 
29f90 2d 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72 65  - offsetof(Where
29fa0 49 6e 66 6f 2c 6e 4f 42 53 61 74 29 29 3b 0a 20  Info,nOBSat));. 
29fb0 20 6d 65 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d   memset(&pWInfo-
29fc0 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[0], 0, sizeof
29fd0 28 57 68 65 72 65 4c 6f 6f 70 29 2b 6e 54 61 62  (WhereLoop)+nTab
29fe0 4c 69 73 74 2a 73 69 7a 65 6f 66 28 57 68 65 72  List*sizeof(Wher
29ff0 65 4c 65 76 65 6c 29 29 3b 0a 20 20 61 73 73 65  eLevel));.  asse
2a000 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  rt( pWInfo->eOne
2a010 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2a020 46 20 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53  F );  /* ONEPASS
2a030 20 64 65 66 61 75 6c 74 73 20 74 6f 20 4f 46 46   defaults to OFF
2a040 20 2a 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d   */.  pMaskSet =
2a050 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53   &pWInfo->sMaskS
2a060 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66  et;.  sWLB.pWInf
2a070 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57  o = pWInfo;.  sW
2a080 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  LB.pWC = &pWInfo
2a090 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e  ->sWC;.  sWLB.pN
2a0a0 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  ew = (WhereLoop*
2a0b0 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f  )(((char*)pWInfo
2a0c0 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20  )+nByteWInfo);. 
2a0d0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2a0e0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57  YTE_ALIGNMENT(sW
2a0f0 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68  LB.pNew) );.  wh
2a100 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42  ereLoopInit(sWLB
2a110 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53  .pNew);.#ifdef S
2a120 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57  QLITE_DEBUG.  sW
2a130 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27  LB.pNew->cId = '
2a140 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  *';.#endif..  /*
2a150 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
2a160 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
2a170 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
2a180 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
2a190 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
2a1a0 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
2a1b0 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
2a1c0 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
2a1d0 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29  askSet(pMaskSet)
2a1e0 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ;.  sqlite3Where
2a1f0 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e  ClauseInit(&pWIn
2a200 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29  fo->sWC, pWInfo)
2a210 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ;.  sqlite3Where
2a220 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  Split(&pWInfo->s
2a230 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  WC, pWhere, TK_A
2a240 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53  ND);.    .  /* S
2a250 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20  pecial case: No 
2a260 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
2a270 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d  .  if( nTabList=
2a280 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  =0 ){.    if( pO
2a290 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d  rderBy ) pWInfo-
2a2a0 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72  >nOBSat = pOrder
2a2b0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
2a2c0 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
2a2d0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
2a2e0 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
2a2f0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
2a300 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2a310 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20  UNIQUE;.    }.  
2a320 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 73  }else{.    /* As
2a330 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20  sign a bit from 
2a340 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65  the bitmask to e
2a350 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
2a360 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
2a370 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2a380 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  N-th term of the
2a390 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2a3a0 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61  assigned a bitma
2a3b0 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 20 20  sk of 1<<N..    
2a3c0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
2a3d0 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  le of the previo
2a3e0 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e 73 75  us sentence ensu
2a3f0 72 65 73 20 74 68 74 61 20 69 66 20 58 20 69 73  res thta if X is
2a400 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
2a410 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65 20  .    ** a table 
2a420 54 2c 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74  T, then X-1 is t
2a430 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
2a440 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  ll other tables 
2a450 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54  to the left of T
2a460 2e 0a 20 20 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67  ..    ** Knowing
2a470 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
2a480 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
2a490 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66  he left of a lef
2a4a0 74 20 6a 6f 69 6e 20 69 73 0a 20 20 20 20 2a 2a  t join is.    **
2a4b0 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
2a4c0 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 20 20 2a  ket #3015..    *
2a4d0 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
2a4e0 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20  at bitmasks are 
2a4f0 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
2a500 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74  pTabList->nSrc t
2a510 61 62 6c 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  ables in.    ** 
2a520 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
2a530 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
2a540 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
2a550 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
2a560 6c 6c 79 0a 20 20 20 20 2a 2a 20 65 71 75 61 6c  lly.    ** equal
2a570 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
2a580 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
2a590 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
2a5a0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 57 48 45  f the.    ** WHE
2a5b0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
2a5c0 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 20  flag is set..   
2a5d0 20 2a 2f 0a 20 20 20 20 69 69 20 3d 20 30 3b 0a   */.    ii = 0;.
2a5e0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 63 72      do{.      cr
2a5f0 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
2a600 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
2a610 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2a620 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54     sqlite3WhereT
2a630 61 62 46 75 6e 63 41 72 67 73 28 70 50 61 72 73  abFuncArgs(pPars
2a640 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e, &pTabList->a[
2a650 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ii], &pWInfo->sW
2a660 43 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  C);.    }while( 
2a670 28 2b 2b 69 69 29 3c 70 54 61 62 4c 69 73 74 2d  (++ii)<pTabList-
2a680 3e 6e 53 72 63 20 29 3b 0a 20 20 23 69 66 64 65  >nSrc );.  #ifde
2a690 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2a6a0 20 20 20 7b 0a 20 20 20 20 20 20 42 69 74 6d 61     {.      Bitma
2a6b0 73 6b 20 6d 78 20 3d 20 30 3b 0a 20 20 20 20 20  sk mx = 0;.     
2a6c0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
2a6d0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
2a6e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ++){.        Bit
2a6f0 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33  mask m = sqlite3
2a700 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61  WhereGetMask(pMa
2a710 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
2a720 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
2a730 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a740 20 6d 3e 3d 6d 78 20 29 3b 0a 20 20 20 20 20 20   m>=mx );.      
2a750 20 20 6d 78 20 3d 20 6d 3b 0a 20 20 20 20 20 20    mx = m;.      
2a760 7d 0a 20 20 20 20 7d 0a 20 20 23 65 6e 64 69 66  }.    }.  #endif
2a770 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 41 6e 61  .  }.  .  /* Ana
2a780 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
2a790 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
2a7a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
2a7b0 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61  eExprAnalyze(pTa
2a7c0 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
2a7d0 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
2a7e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2a7f0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2a800 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69  ror;..  /* Speci
2a810 61 6c 20 63 61 73 65 3a 20 57 48 45 52 45 20 74  al case: WHERE t
2a820 65 72 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  erms that do not
2a830 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 74 61   refer to any ta
2a840 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
2a850 0a 20 20 2a 2a 20 28 63 6f 6e 73 74 61 6e 74 20  .  ** (constant 
2a860 65 78 70 72 65 73 73 69 6f 6e 73 29 2e 20 45 76  expressions). Ev
2a870 61 6c 75 61 74 65 20 65 61 63 68 20 73 75 63 68  aluate each such
2a880 20 74 65 72 6d 2c 20 61 6e 64 20 6a 75 6d 70 20   term, and jump 
2a890 6f 76 65 72 20 61 6c 6c 20 74 68 65 0a 20 20 2a  over all the.  *
2a8a0 2a 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65  * generated code
2a8b0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
2a8c0 73 20 6e 6f 74 20 74 72 75 65 2e 20 20 0a 20 20  s not true.  .  
2a8d0 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 64  **.  ** Do not d
2a8e0 6f 20 74 68 69 73 20 69 66 20 74 68 65 20 65 78  o this if the ex
2a8f0 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
2a900 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  s non-determinis
2a910 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  tic functions.  
2a920 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2a930 77 69 74 68 69 6e 20 61 20 73 75 62 2d 73 65 6c  within a sub-sel
2a940 65 63 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ect. This is not
2a950 20 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72   strictly requir
2a960 65 64 2c 20 62 75 74 0a 20 20 2a 2a 20 70 72 65  ed, but.  ** pre
2a970 73 65 72 76 65 73 20 53 51 4c 69 74 65 27 73 20  serves SQLite's 
2a980 6c 65 67 61 63 79 20 62 65 68 61 76 69 6f 75 72  legacy behaviour
2a990 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
2a9a0 67 20 74 77 6f 20 63 61 73 65 73 3a 0a 20 20 2a  g two cases:.  *
2a9b0 2a 0a 20 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e  *.  **   FROM ..
2a9c0 2e 20 57 48 45 52 45 20 72 61 6e 64 6f 6d 28 29  . WHERE random()
2a9d0 3e 30 3b 20 20 20 20 20 20 20 20 20 20 20 2d 2d  >0;           --
2a9e0 20 65 76 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f   eval random() o
2a9f0 6e 63 65 20 70 65 72 20 72 6f 77 0a 20 20 2a 2a  nce per row.  **
2aa00 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52     FROM ... WHER
2aa10 45 20 28 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  E (SELECT random
2aa20 28 29 29 3e 30 3b 20 20 2d 2d 20 65 76 61 6c 20  ())>0;  -- eval 
2aa30 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20 6f 76  random() once ov
2aa40 65 72 61 6c 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72  erall.  */.  for
2aa50 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70  (ii=0; ii<sWLB.p
2aa60 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  WC->nTerm; ii++)
2aa70 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
2aa80 2a 70 54 20 3d 20 26 73 57 4c 42 2e 70 57 43 2d  *pT = &sWLB.pWC-
2aa90 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  >a[ii];.    if( 
2aaa0 70 54 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  pT->wtFlags & TE
2aab0 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e  RM_VIRTUAL ) con
2aac0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2aad0 54 2d 3e 70 72 65 72 65 71 41 6c 6c 3d 3d 30 20  T->prereqAll==0 
2aae0 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20  && (nTabList==0 
2aaf0 7c 7c 20 65 78 70 72 49 73 44 65 74 65 72 6d 69  || exprIsDetermi
2ab00 6e 69 73 74 69 63 28 70 54 2d 3e 70 45 78 70 72  nistic(pT->pExpr
2ab10 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
2ab20 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
2ab30 50 61 72 73 65 2c 20 70 54 2d 3e 70 45 78 70 72  Parse, pT->pExpr
2ab40 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
2ab50 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2ab60 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 2d 3e  ULL);.      pT->
2ab70 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
2ab80 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
2ab90 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ..  if( wctrlFla
2aba0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
2abb0 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
2abc0 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65  if( isDistinctRe
2abd0 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20  dundant(pParse, 
2abe0 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
2abf0 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53  o->sWC, pResultS
2ac00 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  et) ){.      /* 
2ac10 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72  The DISTINCT mar
2ac20 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73  king is pointles
2ac30 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a  s.  Ignore it. *
2ac40 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
2ac50 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
2ac60 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
2ac70 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
2ac80 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
2ac90 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
2aca0 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73  ORDER BY the res
2acb0 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20  ult set to make 
2acc0 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73  distinct process
2acd0 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20  ing easier */.  
2ace0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72      pWInfo->wctr
2acf0 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
2ad00 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20  DISTINCTBY;.    
2ad10 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
2ad20 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  By = pResultSet;
2ad30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2ad40 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57   Construct the W
2ad50 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2ad60 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
2ad70 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2ad80 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ED).  if( sqlite
2ad90 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
2ada0 66 66 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  ffff ){.    sqli
2adb0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2adc0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
2add0 61 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c  art *** (wctrlFl
2ade0 61 67 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c  ags: 0x%x",wctrl
2adf0 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
2ae00 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2ae10 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a  RE_USE_LIMIT ){.
2ae20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2ae30 75 67 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69  ugPrintf(", limi
2ae40 74 3a 20 25 64 22 2c 20 69 41 75 78 41 72 67 29  t: %d", iAuxArg)
2ae50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2ae60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2ae70 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  )\n");.  }.  if(
2ae80 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2ae90 63 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a  ce & 0x100 ){ /*
2aea0 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72   Display all ter
2aeb0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
2aec0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 73 71  clause */.    sq
2aed0 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
2aee0 50 72 69 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b  Print(sWLB.pWC);
2aef0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
2af00 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
2af10 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
2af20 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
2af30 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2af40 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
2af50 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2af60 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2af70 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45  .  .#ifdef WHERE
2af80 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2af90 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2afa0 72 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a  reTrace ){    /*
2afb0 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20   Display all of 
2afc0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
2afd0 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57  jects */.      W
2afe0 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20  hereLoop *p;.   
2aff0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2b000 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2b010 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31  r zLabel[] = "01
2b020 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68  23456789abcdefgh
2b030 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79  ijklmnopqrstuvwy
2b040 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  xz".            
2b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b070 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
2b080 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
2b090 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
2b0a0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20  o->pLoops, i=0; 
2b0b0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
2b0c0 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p, i++){.       
2b0d0 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
2b0e0 5b 69 25 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65  [i%(sizeof(zLabe
2b0f0 6c 29 2d 31 29 5d 3b 0a 20 20 20 20 20 20 20 20  l)-1)];.        
2b100 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
2b110 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
2b120 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
2b130 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61  f.  .    wherePa
2b140 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
2b150 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
2b160 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2b170 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2b180 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57  rror;.    if( pW
2b190 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
2b1a0 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61  {.       wherePa
2b1b0 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
2b1c0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2b1d0 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  +1);.       if( 
2b1e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b1f0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2b200 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  inError;.    }. 
2b210 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
2b220 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
2b230 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
2b240 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
2b250 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49  )!=0 ){.     pWI
2b260 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41  nfo->revMask = A
2b270 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66  LLBITS;.  }.  if
2b280 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2b290 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
2b2a0 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
2b2b0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2b2c0 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
2b2d0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2b2e0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
2b2f0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
2b300 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2b310 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
2b320 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
2b330 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
2b340 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2b350 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
2b360 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2b370 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
2b380 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49  =%d,0x%llx", pWI
2b390 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49  nfo->nOBSat, pWI
2b3a0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
2b3b0 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
2b3c0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2b3d0 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
2b3e0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2b3f0 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
2b400 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2b410 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
2b420 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
2b430 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b440 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
2b450 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
2b460 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
2b470 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2b480 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
2b490 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
2b4a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2b4b0 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
2b4c0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
2b4d0 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
2b4e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2b4f0 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
2b500 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
2b510 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b520 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
2b530 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2b540 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
2b550 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
2b560 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
2b570 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
2b580 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
2b590 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57  .pWLoop, sWLB.pW
2b5a0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
2b5b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 74 65 6d  ndif..  /* Attem
2b5c0 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65  pt to omit table
2b5d0 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20  s from the join 
2b5e0 74 68 61 74 20 64 6f 20 6e 6f 74 20 61 66 66 65  that do not affe
2b5f0 63 74 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  ct the result.. 
2b600 20 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20   ** For a table 
2b610 74 6f 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68  to not affect th
2b620 65 20 72 65 73 75 6c 74 2c 20 74 68 65 20 66 6f  e result, the fo
2b630 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62 65 20  llowing must be 
2b640 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
2b650 20 20 31 29 20 54 68 65 20 71 75 65 72 79 20 6d    1) The query m
2b660 75 73 74 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  ust not be an ag
2b670 67 72 65 67 61 74 65 2e 0a 20 20 2a 2a 20 20 20  gregate..  **   
2b680 32 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73  2) The table mus
2b690 74 20 62 65 20 74 68 65 20 52 48 53 20 6f 66 20  t be the RHS of 
2b6a0 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 2a  a LEFT JOIN..  *
2b6b0 2a 20 20 20 33 29 20 45 69 74 68 65 72 20 74 68  *   3) Either th
2b6c0 65 20 71 75 65 72 79 20 6d 75 73 74 20 62 65 20  e query must be 
2b6d0 44 49 53 54 49 4e 43 54 2c 20 6f 72 20 65 6c 73  DISTINCT, or els
2b6e0 65 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  e the ON or USIN
2b6f0 47 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 20 20  G clause.  **   
2b700 20 20 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20     must contain 
2b710 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 61  a constraint tha
2b720 74 20 6c 69 6d 69 74 73 20 74 68 65 20 73 63 61  t limits the sca
2b730 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  n of the table t
2b740 6f 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 74 20  o .  **      at 
2b750 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65 20 72 6f  most a single ro
2b760 77 2e 0a 20 20 2a 2a 20 20 20 34 29 20 54 68 65  w..  **   4) The
2b770 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20   table must not 
2b780 62 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  be referenced by
2b790 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
2b7a0 20 71 75 65 72 79 20 61 70 61 72 74 0a 20 20 2a   query apart.  *
2b7b0 2a 20 20 20 20 20 20 66 72 6f 6d 20 69 74 73 20  *      from its 
2b7c0 6f 77 6e 20 55 53 49 4e 47 20 6f 72 20 4f 4e 20  own USING or ON 
2b7d0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
2b7e0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67  * For example, g
2b7f0 69 76 65 6e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  iven:.  **.  ** 
2b800 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2b810 20 74 31 28 69 70 6b 20 49 4e 54 45 47 45 52 20   t1(ipk INTEGER 
2b820 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 31 29  PRIMARY KEY, v1)
2b830 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
2b840 45 20 54 41 42 4c 45 20 74 32 28 69 70 6b 20 49  E TABLE t2(ipk I
2b850 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2b860 45 59 2c 20 76 32 29 3b 0a 20 20 2a 2a 20 20 20  EY, v2);.  **   
2b870 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2b880 33 28 69 70 6b 20 49 4e 54 45 47 45 52 20 50 52  3(ipk INTEGER PR
2b890 49 4d 41 52 59 20 4b 45 59 2c 20 76 33 29 3b 0a  IMARY KEY, v3);.
2b8a0 20 20 2a 2a 0a 20 20 2a 2a 20 74 68 65 6e 20 74    **.  ** then t
2b8b0 61 62 6c 65 20 74 32 20 63 61 6e 20 62 65 20 6f  able t2 can be o
2b8c0 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
2b8d0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
2b8e0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2b8f0 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31 20 0a  v1, v3 FROM t1 .
2b900 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20    **       LEFT 
2b910 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 20 28 74  JOIN t2 USING (t
2b920 31 2e 69 70 6b 3d 74 32 2e 69 70 6b 29 0a 20 20  1.ipk=t2.ipk).  
2b930 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f  **       LEFT JO
2b940 49 4e 20 74 33 20 55 53 49 4e 47 20 28 74 31 2e  IN t3 USING (t1.
2b950 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20 20 2a 2a  ipk=t3.ipk).  **
2b960 0a 20 20 2a 2a 20 6f 72 20 66 72 6f 6d 3a 0a 20  .  ** or from:. 
2b970 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
2b980 45 43 54 20 44 49 53 54 49 4e 43 54 20 76 31 2c  ECT DISTINCT v1,
2b990 20 76 33 20 46 52 4f 4d 20 74 31 20 0a 20 20 2a   v3 FROM t1 .  *
2b9a0 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49  *       LEFT JOI
2b9b0 4e 20 74 32 0a 20 20 2a 2a 20 20 20 20 20 20 20  N t2.  **       
2b9c0 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20 55 53 49  LEFT JOIN t3 USI
2b9d0 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33 2e 69 70  NG (t1.ipk=t3.ip
2b9e0 6b 29 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  k).  */.  notRea
2b9f0 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
2ba00 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
2ba10 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20  nLevel>=2.   && 
2ba20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 20 20 20  pResultSet!=0   
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
2ba40 75 61 72 61 6e 74 65 65 73 20 63 6f 6e 64 69 74  uarantees condit
2ba50 69 6f 6e 20 28 31 29 20 61 62 6f 76 65 20 2a 2f  ion (1) above */
2ba60 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
2ba70 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
2ba80 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
2ba90 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  in).  ){.    int
2baa0 20 69 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   i;.    Bitmask 
2bab0 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65  tabUsed = sqlite
2bac0 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
2bad0 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
2bae0 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
2baf0 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
2bb00 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65   ){.      tabUse
2bb10 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  d |= sqlite3Wher
2bb20 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
2bb30 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
2bb40 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20  rderBy);.    }. 
2bb50 20 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d     for(i=pWInfo-
2bb60 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 31 3b  >nLevel-1; i>=1;
2bb70 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 57 68 65   i--){.      Whe
2bb80 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
2bb90 70 45 6e 64 3b 0a 20 20 20 20 20 20 73 74 72 75  pEnd;.      stru
2bba0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2bbb0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 70 4c  *pItem;.      pL
2bbc0 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  oop = pWInfo->a[
2bbd0 69 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  i].pWLoop;.     
2bbe0 20 70 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f   pItem = &pWInfo
2bbf0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2bc00 6f 6f 70 2d 3e 69 54 61 62 5d 3b 0a 20 20 20 20  oop->iTab];.    
2bc10 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67    if( (pItem->fg
2bc20 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
2bc30 45 46 54 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  EFT)==0 ) contin
2bc40 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ue;.      if( (w
2bc50 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2bc60 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
2bc70 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
2bc80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2bc90 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
2bca0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2bcb0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2bcc0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74    }.      if( (t
2bcd0 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e  abUsed & pLoop->
2bce0 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 63  maskSelf)!=0 ) c
2bcf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2bd00 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e  End = sWLB.pWC->
2bd10 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54  a + sWLB.pWC->nT
2bd20 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  erm;.      for(p
2bd30 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61  Term=sWLB.pWC->a
2bd40 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54  ; pTerm<pEnd; pT
2bd50 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
2bd60 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
2bd70 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
2bd80 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 7b 0a 20  askSelf)!=0 ){. 
2bd90 20 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78           if( !Ex
2bda0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
2bdb0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
2bdc0 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
2bdd0 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 45      || pTerm->pE
2bde0 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
2bdf0 61 62 6c 65 21 3d 70 49 74 65 6d 2d 3e 69 43 75  able!=pItem->iCu
2be00 72 73 6f 72 0a 20 20 20 20 20 20 20 20 20 20 29  rsor.          )
2be10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
2be20 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2be30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2be40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 65   }.      if( pTe
2be50 72 6d 3c 70 45 6e 64 20 29 20 63 6f 6e 74 69 6e  rm<pEnd ) contin
2be60 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ue;.      WHERET
2be70 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
2be80 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
2be90 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
2bea0 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
2beb0 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 70 4c 6f  notReady &= ~pLo
2bec0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2bed0 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57      for(pTerm=sW
2bee0 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  LB.pWC->a; pTerm
2bef0 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  <pEnd; pTerm++){
2bf00 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
2bf10 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
2bf20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2bf30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2bf40 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
2bf50 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
2bf60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bf70 7d 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 70  }.      if( i!=p
2bf80 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20  WInfo->nLevel-1 
2bf90 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2bfa0 42 79 74 65 20 3d 20 28 70 57 49 6e 66 6f 2d 3e  Byte = (pWInfo->
2bfb0 6e 4c 65 76 65 6c 2d 31 2d 69 29 20 2a 20 73 69  nLevel-1-i) * si
2bfc0 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
2bfd0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76  ;.        memmov
2bfe0 65 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2c  e(&pWInfo->a[i],
2bff0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 2b 31 5d   &pWInfo->a[i+1]
2c000 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2c010 7d 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  }.      pWInfo->
2c020 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20  nLevel--;.      
2c030 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20  nTabList--;.    
2c040 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
2c050 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
2c060 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
2c070 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70  ed ***\n"));.  p
2c080 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e  WInfo->pParse->n
2c090 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49  QueryLoop += pWI
2c0a0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20  nfo->nRowOut;.. 
2c0b0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
2c0c0 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
2c0d0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
2c0e0 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
2c0f0 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
2c100 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
2c110 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
2c120 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
2c130 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 0a 20  ropriate..  **. 
2c140 20 2a 2a 20 41 20 6f 6e 65 2d 70 61 73 73 20 61   ** A one-pass a
2c150 70 70 72 6f 61 63 68 20 63 61 6e 20 62 65 20 75  pproach can be u
2c160 73 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 65  sed if the calle
2c170 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20  r has requested 
2c180 6f 6e 65 0a 20 20 2a 2a 20 61 6e 64 20 65 69 74  one.  ** and eit
2c190 68 65 72 20 28 61 29 20 74 68 65 20 73 63 61 6e  her (a) the scan
2c1a0 20 76 69 73 69 74 73 20 61 74 20 6d 6f 73 74 20   visits at most 
2c1b0 6f 6e 65 20 72 6f 77 20 6f 72 20 28 62 29 20 65  one row or (b) e
2c1c0 61 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ach.  ** of the 
2c1d0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
2c1e0 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
2c1f0 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  * the caller has
2c200 20 69 6e 64 69 63 61 74 65 64 20 74 68 61 74 20   indicated that 
2c210 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f  a one-pass appro
2c220 61 63 68 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ach can be used.
2c230 20 20 2a 2a 20 20 20 20 20 77 69 74 68 20 6d 75    **     with mu
2c240 6c 74 69 70 6c 65 20 72 6f 77 73 20 28 62 79 20  ltiple rows (by 
2c250 73 65 74 74 69 6e 67 20 57 48 45 52 45 5f 4f 4e  setting WHERE_ON
2c260 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 2c  EPASS_MULTIROW),
2c270 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 74 68   and.  **   * th
2c280 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
2c290 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
2c2a0 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 65 69 74  and.  **   * eit
2c2b0 68 65 72 20 74 68 65 20 73 63 61 6e 20 64 6f 65  her the scan doe
2c2c0 73 20 6e 6f 74 20 75 73 65 20 74 68 65 20 4f 52  s not use the OR
2c2d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 72   optimization or
2c2e0 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   the caller.  **
2c2f0 20 20 20 20 20 69 73 20 61 20 44 45 4c 45 54 45       is a DELETE
2c300 20 6f 70 65 72 61 74 69 6f 6e 20 28 57 48 45 52   operation (WHER
2c310 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 20  E_DUPLICATES_OK 
2c320 69 73 20 6f 6e 6c 79 20 73 70 65 63 69 66 69 65  is only specifie
2c330 64 0a 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 44  d.  **     for D
2c340 45 4c 45 54 45 29 2e 0a 20 20 2a 2a 0a 20 20 2a  ELETE)..  **.  *
2c350 2a 20 54 68 65 20 6c 61 73 74 20 71 75 61 6c 69  * The last quali
2c360 66 69 63 61 74 69 6f 6e 20 69 73 20 62 65 63 61  fication is beca
2c370 75 73 65 20 61 6e 20 55 50 44 41 54 45 20 73 74  use an UPDATE st
2c380 61 74 65 6d 65 6e 74 20 75 73 65 73 0a 20 20 2a  atement uses.  *
2c390 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61 69 43 75  * WhereInfo.aiCu
2c3a0 72 4f 6e 65 50 61 73 73 5b 31 5d 20 74 6f 20 64  rOnePass[1] to d
2c3b0 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2c3c0 20 6f 72 20 6e 6f 74 20 69 74 20 72 65 61 6c 6c   or not it reall
2c3d0 79 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61  y can.  ** use a
2c3e0 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f 61   one-pass approa
2c3f0 63 68 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ch, and this is 
2c400 6e 6f 74 20 73 65 74 20 61 63 63 75 72 61 74 65  not set accurate
2c410 6c 79 20 66 6f 72 20 73 63 61 6e 73 0a 20 20 2a  ly for scans.  *
2c420 2a 20 74 68 61 74 20 75 73 65 20 74 68 65 20 4f  * that use the O
2c430 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  R optimization..
2c440 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
2c450 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2c460 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2c470 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f  ED)==0 || pWInfo
2c480 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20  ->nLevel==1 );. 
2c490 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
2c4a0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2c4b0 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b 0a  _DESIRED)!=0 ){.
2c4c0 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20      int wsFlags 
2c4d0 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  = pWInfo->a[0].p
2c4e0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  WLoop->wsFlags;.
2c4f0 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20      int bOnerow 
2c500 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  = (wsFlags & WHE
2c510 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20  RE_ONEROW)!=0;. 
2c520 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 20 7c     if( bOnerow |
2c530 7c 20 28 0a 20 20 20 20 20 20 20 20 30 21 3d 28  | (.        0!=(
2c540 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2c550 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
2c560 52 4f 57 29 0a 20 20 20 20 20 26 26 20 30 3d 3d  ROW).     && 0==
2c570 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
2c580 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
2c590 20 20 20 20 26 26 20 28 30 3d 3d 28 77 73 46 6c      && (0==(wsFl
2c5a0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
2c5b0 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46  I_OR) || (wctrlF
2c5c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
2c5d0 4c 49 43 41 54 45 53 5f 4f 4b 29 29 0a 20 20 20  LICATES_OK)).   
2c5e0 20 29 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66   )){.      pWInf
2c5f0 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62 4f  o->eOnePass = bO
2c600 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53 5f  nerow ? ONEPASS_
2c610 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53  SINGLE : ONEPASS
2c620 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20 69 66  _MULTI;.      if
2c630 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c  ( HasRowid(pTabL
2c640 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20  ist->a[0].pTab) 
2c650 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57 48  && (wsFlags & WH
2c660 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b  ERE_IDX_ONLY) ){
2c670 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 63 74  .        if( wct
2c680 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2c690 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
2c6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
2c6b0 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c 41  ordelete = OPFLA
2c6c0 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20 20  G_FORDELETE;.   
2c6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2c6e0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
2c6f0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 77  op->wsFlags = (w
2c700 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52 45 5f  sFlags & ~WHERE_
2c710 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  IDX_ONLY);.     
2c720 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2c730 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
2c740 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
2c750 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
2c760 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
2c770 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
2c780 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
2c790 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c  /.  for(ii=0, pL
2c7a0 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
2c7b0 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
2c7c0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
2c7d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
2c7e0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
2c7f0 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
2c800 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
2c810 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
2c820 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
2c830 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  e/index */.    s
2c840 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2c850 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20  em *pTabItem;.. 
2c860 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
2c870 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2c880 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
2c890 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
2c8a0 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20  pTab;.    iDb = 
2c8b0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2c8c0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
2c8d0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f  Schema);.    pLo
2c8e0 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
2c8f0 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54  oop;.    if( (pT
2c900 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
2c910 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
2c920 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
2c930 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
2c940 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
2c950 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
2c960 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2c970 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
2c980 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c990 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2c9a0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
2c9b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
2c9c0 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
2c9d0 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
2c9e0 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
2c9f0 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
2ca00 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2ca10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2ca20 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2ca30 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
2ca40 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41  0, pVTab, P4_VTA
2ca50 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  B);.    }else if
2ca60 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
2ca70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  ) ){.      /* no
2ca80 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  op */.    }else.
2ca90 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
2caa0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2cab0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2cac0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2cad0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2cae0 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2caf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
2cb00 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65  t op = OP_OpenRe
2cb10 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  ad;.      if( pW
2cb20 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
2cb30 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
2cb40 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
2cb50 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
2cb60 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
2cb70 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62  nePass[0] = pTab
2cb80 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
2cb90 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71       };.      sq
2cba0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
2cbb0 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
2cbc0 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70  >iCursor, iDb, p
2cbd0 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20  Tab, op);.      
2cbe0 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d  assert( pTabItem
2cbf0 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65  ->iCursor==pLeve
2cc00 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20  l->iTabCur );.  
2cc10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
2cc20 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
2cc30 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
2cc40 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  Tab->nCol==BMS-1
2cc50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2cc60 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  se( pWInfo->eOne
2cc70 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2cc80 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  F && pTab->nCol=
2cc90 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66  =BMS );.      if
2cca0 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
2ccb0 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
2ccc0 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d  && pTab->nCol<BM
2ccd0 53 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54  S && HasRowid(pT
2cce0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42  ab) ){.        B
2ccf0 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49  itmask b = pTabI
2cd00 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
2cd10 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
2cd20 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62  .        for(; b
2cd30 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d  ; b=b>>1, n++){}
2cd40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2cd50 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
2cd60 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  -1, SQLITE_INT_T
2cd70 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54  O_PTR(n), P4_INT
2cd80 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  32);.        ass
2cd90 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
2cda0 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  ol );.      }.#i
2cdb0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2cdc0 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
2cdd0 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
2cde0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
2cdf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2ce00 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2ce10 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
2ce20 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a  EQ|bFordelete);.
2ce30 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
2ce40 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
2ce50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2ce60 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72 64 65  angeP5(v, bForde
2ce70 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23  lete);.      }.#
2ce80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2ce90 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
2cea0 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c 69 74  MASK.      sqlit
2ceb0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2cec0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
2ced0 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  ed, pTabItem->iC
2cee0 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20  ursor, 0, 0,.   
2cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf00 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20           (const 
2cf10 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e 63  u8*)&pTabItem->c
2cf20 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34  olUsed, P4_INT64
2cf30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
2cf40 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2cf50 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
2cf60 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
2cf70 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
2cf80 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2cf90 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2cfa0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2cfb0 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  ED ){.      Inde
2cfc0 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e  x *pIx = pLoop->
2cfd0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
2cfe0 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
2cff0 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  Cur;.      int o
2d000 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
2d010 0a 20 20 20 20 20 20 2f 2a 20 69 41 75 78 41 72  .      /* iAuxAr
2d020 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  g is always set 
2d030 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  to a positive va
2d040 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69  lue if ONEPASS i
2d050 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  s possible */.  
2d060 20 20 20 20 61 73 73 65 72 74 28 20 69 41 75 78      assert( iAux
2d070 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66  Arg!=0 || (pWInf
2d080 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2d090 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2d0a0 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20  SIRED)==0 );.   
2d0b0 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
2d0c0 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d  (pTab) && IsPrim
2d0d0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29  aryKeyIndex(pIx)
2d0e0 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72  .       && (wctr
2d0f0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2d100 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 0a  R_SUBCLAUSE)!=0.
2d110 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2d120 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65 20   /* This is one 
2d130 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70  term of an OR-op
2d140 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67  timization using
2d150 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2d160 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a   of a.        **
2d170 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
2d180 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66  able.  No need f
2d190 6f 72 20 61 20 73 65 70 61 72 61 74 65 20 69 6e  or a separate in
2d1a0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  dex */.        i
2d1b0 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65  IndexCur = pLeve
2d1c0 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20 20  l->iTabCur;.    
2d1d0 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20      op = 0;.    
2d1e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49 6e    }else if( pWIn
2d1f0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
2d200 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
2d210 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d       Index *pJ =
2d220 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
2d230 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  >pIndex;.       
2d240 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75   iIndexCur = iAu
2d250 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 61 73  xArg;.        as
2d260 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73  sert( wctrlFlags
2d270 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2d280 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20  _DESIRED );.    
2d290 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
2d2a0 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78  S(pJ) && pJ!=pIx
2d2b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49   ){.          iI
2d2c0 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20  ndexCur++;.     
2d2d0 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e       pJ = pJ->pN
2d2e0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
2d2f0 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
2d300 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
2d310 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
2d320 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64  nePass[1] = iInd
2d330 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c  exCur;.      }el
2d340 73 65 20 69 66 28 20 69 41 75 78 41 72 67 20 26  se if( iAuxArg &
2d350 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
2d360 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2d370 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)!=0 ){.      
2d380 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41    iIndexCur = iA
2d390 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 6f  uxArg;.        o
2d3a0 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78  p = OP_ReopenIdx
2d3b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2d3c0 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2d3d0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2d3e0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
2d3f0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2d400 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20   = iIndexCur;.  
2d410 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
2d420 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
2d430 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
2d440 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43   assert( iIndexC
2d450 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ur>=0 );.      i
2d460 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  f( op ){.       
2d470 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d480 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78  p3(v, op, iIndex
2d490 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
2d4a0 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
2d4b0 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
2d4c0 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
2d4d0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2d4e0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2d4f0 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
2d500 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  NT)!=0.         
2d510 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
2d520 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
2d530 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53  MN_RANGE|WHERE_S
2d540 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20  KIPSCAN))==0.   
2d550 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
2d560 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
2d570 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d  RE_ORDERBY_MIN)=
2d580 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =0.         && p
2d590 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2d5a0 21 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  !=WHERE_DISTINCT
2d5b0 5f 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20 20  _ORDERED.       
2d5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2d5d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2d5e0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
2d5f0 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20  EQ); /* Hint to 
2d600 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20  COMDB2 */.      
2d610 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65    }.        Vdbe
2d620 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
2d630 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
2d640 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2d650 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
2d660 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a  _MASK.        {.
2d670 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f            u64 co
2d680 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  lUsed = 0;.     
2d690 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b       int ii, jj;
2d6a0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2d6b0 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f  i=0; ii<pIx->nCo
2d6c0 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  lumn; ii++){.   
2d6d0 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49           jj = pI
2d6e0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b  x->aiColumn[ii];
2d6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d700 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65   jj<0 ) continue
2d710 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2d720 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36  ( jj>63 ) jj = 6
2d730 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  3;.            i
2d740 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f  f( (pTabItem->co
2d750 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
2d760 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  jj))==0 ) contin
2d770 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2d780 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34  colUsed |= ((u64
2d790 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69  )1)<<(ii<63 ? ii
2d7a0 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20   : 63);.        
2d7b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2d7c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
2d7d0 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
2d7e0 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72  sUsed, iIndexCur
2d7f0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d810 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f          (u8*)&co
2d820 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29  lUsed, P4_INT64)
2d830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
2d840 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
2d850 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
2d860 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  MASK */.      }.
2d870 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
2d880 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f  b>=0 ) sqlite3Co
2d890 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
2d8a0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
2d8b0 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
2d8c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2d8d0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
2d8e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2d8f0 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
2d900 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
2d910 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
2d920 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
2d930 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
2d940 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
2d950 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
2d960 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
2d970 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
2d980 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
2d990 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
2d9a0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
2d9b0 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
2d9c0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  i++){.    int ad
2d9d0 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69  drExplain;.    i
2d9e0 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  nt wsFlags;.    
2d9f0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
2da00 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46  ->a[ii];.    wsF
2da10 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  lags = pLevel->p
2da20 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  WLoop->wsFlags;.
2da30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2da40 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
2da50 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65  DEX.    if( (pLe
2da60 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
2da70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
2da80 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
2da90 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75       constructAu
2daa0 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61  tomaticIndex(pPa
2dab0 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  rse, &pWInfo->sW
2dac0 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
2dad0 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b     &pTabList->a[
2dae0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20  pLevel->iFrom], 
2daf0 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
2db00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
2db10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2db20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2db30 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rror;.    }.#end
2db40 69 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61  if.    addrExpla
2db50 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  in = sqlite3Wher
2db60 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28  eExplainOneScan(
2db70 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
2db80 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
2db90 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
2dba0 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
2dbb0 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76  .    );.    pLev
2dbc0 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73  el->addrBody = s
2dbd0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2dbe0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f  tAddr(v);.    no
2dbf0 74 52 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33  tReady = sqlite3
2dc00 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70  WhereCodeOneLoop
2dc10 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69  Start(pWInfo, ii
2dc20 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20  , notReady);.   
2dc30 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
2dc40 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ue = pLevel->add
2dc50 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28  rCont;.    if( (
2dc60 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55  wsFlags&WHERE_MU
2dc70 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77  LTI_OR)==0 && (w
2dc80 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
2dc90 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
2dca0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2dcb0 33 57 68 65 72 65 41 64 64 53 63 61 6e 53 74 61  3WhereAddScanSta
2dcc0 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c  tus(v, pTabList,
2dcd0 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70   pLevel, addrExp
2dce0 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lain);.    }.  }
2dcf0 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a  ..  /* Done. */.
2dd00 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
2dd10 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
2dd20 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20  HERE-core"));.  
2dd30 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
2dd40 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
2dd50 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
2dd60 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  /.whereBeginErro
2dd70 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  r:.  if( pWInfo 
2dd80 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
2dd90 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
2dda0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
2ddb0 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e  oop;.    whereIn
2ddc0 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
2ddd0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2dde0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
2ddf0 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
2de00 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
2de10 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
2de20 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
2de30 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
2de40 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
2de50 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
2de60 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
2de70 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
2de80 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
2de90 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
2dea0 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
2deb0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2dec0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
2ded0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
2dee0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2def0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2df00 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2df10 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
2df20 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
2df30 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
2df40 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
2df50 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
2df60 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
2df70 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
2df80 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73  ERE-core"));.  s
2df90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2dfa0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2dfb0 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
2dfc0 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
2dfd0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  -){.    int addr
2dfe0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
2dff0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
2e000 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
2e010 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
2e020 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
2e030 5f 4e 6f 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66  _Noop ){.#ifndef
2e040 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2e050 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49 4e  SKIPAHEAD_DISTIN
2e060 43 54 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  CT.      int add
2e070 72 53 65 65 6b 20 3d 20 30 3b 0a 20 20 20 20 20  rSeek = 0;.     
2e080 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
2e090 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
2e0a0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69   if( pWInfo->eDi
2e0b0 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
2e0c0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 0a 20  STINCT_ORDERED. 
2e0d0 20 20 20 20 20 20 26 26 20 69 3d 3d 70 57 49 6e        && i==pWIn
2e0e0 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20 20 2f 2a  fo->nLevel-1  /*
2e0f0 20 54 69 63 6b 65 74 20 5b 65 66 39 33 31 38 37   Ticket [ef93187
2e100 35 37 62 31 35 32 65 33 5d 20 32 30 31 37 2d 31  57b152e3] 2017-1
2e110 30 2d 32 31 20 2a 2f 0a 20 20 20 20 20 20 20 26  0-21 */.       &
2e120 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
2e130 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2e140 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  D)!=0.       && 
2e150 28 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  (pIdx = pLoop->u
2e160 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 2d 3e  .btree.pIndex)->
2e170 68 61 73 53 74 61 74 31 0a 20 20 20 20 20 20 20  hasStat1.       
2e180 26 26 20 28 6e 20 3d 20 70 4c 6f 6f 70 2d 3e 75  && (n = pLoop->u
2e190 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c 29 3e  .btree.nIdxCol)>
2e1a0 30 0a 20 20 20 20 20 20 20 26 26 20 70 49 64 78  0.       && pIdx
2e1b0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 5d  ->aiRowLogEst[n]
2e1c0 3e 3d 33 36 0a 20 20 20 20 20 20 29 7b 0a 20 20  >=36.      ){.  
2e1d0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 70        int r1 = p
2e1e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
2e1f0 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6f 70         int j, op
2e200 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
2e210 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<n; j++){.  
2e220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e230 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2e240 43 6f 6c 75 6d 6e 2c 20 70 4c 65 76 65 6c 2d 3e  Column, pLevel->
2e250 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 31 2b 6a  iIdxCur, j, r1+j
2e260 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e270 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2e280 6d 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 20 20  m += n+1;.      
2e290 20 20 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 6f    op = pLevel->o
2e2a0 70 3d 3d 4f 50 5f 50 72 65 76 20 3f 20 4f 50 5f  p==OP_Prev ? OP_
2e2b0 53 65 65 6b 4c 54 20 3a 20 4f 50 5f 53 65 65 6b  SeekLT : OP_Seek
2e2c0 47 54 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  GT;.        addr
2e2d0 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  Seek = sqlite3Vd
2e2e0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
2e2f0 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  p, pLevel->iIdxC
2e300 75 72 2c 20 30 2c 20 72 31 2c 20 6e 29 3b 0a 20  ur, 0, r1, n);. 
2e310 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
2e320 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
2e330 53 65 65 6b 4c 54 29 3b 0a 20 20 20 20 20 20 20  SeekLT);.       
2e340 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2e350 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54  v, op==OP_SeekGT
2e360 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2e370 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2e380 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 70 4c 65 76  OP_Goto, 1, pLev
2e390 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 7d  el->p2);.      }
2e3a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2e3b0 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48  E_DISABLE_SKIPAH
2e3c0 45 41 44 5f 44 49 53 54 49 4e 43 54 20 2a 2f 0a  EAD_DISTINCT */.
2e3d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
2e3e0 6d 6f 6e 20 63 61 73 65 3a 20 41 64 76 61 6e 63  mon case: Advanc
2e3f0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  e to the next ro
2e400 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  w */.      sqlit
2e410 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2e420 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2e430 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73  drCont);.      s
2e440 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2e450 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20  (v, pLevel->op, 
2e460 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
2e470 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e  el->p2, pLevel->
2e480 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p3);.      sqlit
2e490 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2e4a0 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20  , pLevel->p5);. 
2e4b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2e4c0 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
2e4d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
2e4e0 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78  evel->op==OP_Nex
2e4f0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
2e500 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
2e510 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29  el->op==OP_Prev)
2e520 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2e530 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
2e540 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b  ->op==OP_VNext);
2e550 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e560 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41  DISABLE_SKIPAHEA
2e570 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20 20  D_DISTINCT.     
2e580 20 69 66 28 20 61 64 64 72 53 65 65 6b 20 29 20   if( addrSeek ) 
2e590 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2e5a0 65 72 65 28 76 2c 20 61 64 64 72 53 65 65 6b 29  ere(v, addrSeek)
2e5b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
2e5c0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2e5d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2e5e0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2e5f0 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rCont);.    }.  
2e600 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2e610 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
2e620 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e  ABLE && pLevel->
2e630 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20  u.in.nIn>0 ){.  
2e640 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
2e650 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e  p *pIn;.      in
2e660 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
2e670 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2e680 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2e690 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f  drNxt);.      fo
2e6a0 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  r(j=pLevel->u.in
2e6b0 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65  .nIn, pIn=&pLeve
2e6c0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
2e6d0 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  j-1]; j>0; j--, 
2e6e0 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  pIn--){.        
2e6f0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2e700 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
2e710 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20  InTop+1);.      
2e720 20 20 69 66 28 20 70 49 6e 2d 3e 65 45 6e 64 4c    if( pIn->eEndL
2e730 6f 6f 70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  oopOp!=OP_Noop )
2e740 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2e750 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e760 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2e770 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
2e780 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
2e790 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2e7a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
2e7b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2e7c0 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
2e7d0 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f  opOp==OP_PrevIfO
2e7e0 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
2e7f0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2e800 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
2e810 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e  p==OP_NextIfOpen
2e820 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e830 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e840 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
2e850 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20  >addrInTop-1);. 
2e860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2e870 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2e880 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
2e890 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
2e8a0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64    if( pLevel->ad
2e8b0 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  drSkip ){.      
2e8c0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
2e8d0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
2e8e0 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  kip);.      Vdbe
2e8f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78  Comment((v, "nex
2e900 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25  t skip-scan on %
2e910 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  s", pLoop->u.btr
2e920 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
2e930 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2e940 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2e950 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
2e960 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
2e970 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2e980 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
2e990 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  p-2);.    }.#ifn
2e9a0 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
2e9b0 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
2e9c0 42 53 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  BS.    if( pLeve
2e9d0 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29  l->addrLikeRep )
2e9e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2e9f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2ea00 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69  DecrJumpZero, (i
2ea10 6e 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  nt)(pLevel->iLik
2ea20 65 52 65 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20  eRepCntr>>1),.  
2ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea40 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
2ea50 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20  drLikeRep);.    
2ea60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2ea70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2ea80 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2ea90 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
2eaa0 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f     int ws = pLoo
2eab0 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
2eac0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2ead0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2eae0 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
2eaf0 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65  iLeftJoin); Vdbe
2eb00 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2eb10 20 20 20 61 73 73 65 72 74 28 20 28 77 73 20 26     assert( (ws &
2eb20 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2eb30 3d 3d 30 20 7c 7c 20 28 77 73 20 26 20 57 48 45  ==0 || (ws & WHE
2eb40 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
2eb50 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  ;.      if( (ws 
2eb60 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2eb70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2eb80 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
2eb90 69 54 61 62 43 75 72 3d 3d 70 54 61 62 4c 69 73  iTabCur==pTabLis
2eba0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2ebb0 6f 6d 5d 2e 69 43 75 72 73 6f 72 20 29 3b 0a 20  om].iCursor );. 
2ebc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ebd0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
2ebe0 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
2ebf0 69 54 61 62 43 75 72 29 3b 0a 20 20 20 20 20 20  iTabCur);.      
2ec00 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
2ec10 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2ec20 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 28 77 73   .       || ((ws
2ec30 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
2ec40 52 29 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  R) && pLevel->u.
2ec50 70 43 6f 76 69 64 78 29 20 0a 20 20 20 20 20 20  pCovidx) .      
2ec60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2ec70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2ec80 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
2ec90 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
2eca0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ecb0 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
2ecc0 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
2ecd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ece0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2ecf0 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
2ed00 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
2ed10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ed20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ed30 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Goto(v, pLevel->
2ed40 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
2ed50 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2ed60 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2ed70 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
2ed80 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
2ed90 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
2eda0 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20  RE-loop%d: %s", 
2edb0 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
2edc0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
2edd0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2ede0 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  el->iFrom].pTab-
2edf0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20  >zName));.  }.. 
2ee00 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
2ee10 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
2ee20 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
2ee30 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
2ee40 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
2ee50 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
2ee60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2ee70 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
2ee80 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  k);..  assert( p
2ee90 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70  WInfo->nLevel<=p
2eea0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
2eeb0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
2eec0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
2eed0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
2eee0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
2eef0 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b      int k, last;
2ef00 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
2ef10 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
2ef20 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  x = 0;.    struc
2ef30 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2ef40 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
2ef50 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2ef60 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
2ef70 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
2ef80 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
2ef90 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
2efa0 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
2efb0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20  vel->pWLoop;..  
2efc0 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f    /* For a co-ro
2efd0 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c  utine, change al
2efe0 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65  l OP_Column refe
2eff0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61  rences to the ta
2f000 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
2f010 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74  e co-routine int
2f020 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73  o OP_Copy of res
2f030 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ult contained in
2f040 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20   a register..   
2f050 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63   ** OP_Rowid bec
2f060 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20  omes OP_Null..  
2f070 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
2f080 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
2f090 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
2f0a0 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
2f0b0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2f0c0 65 64 20 29 3b 0a 20 20 20 20 20 20 74 72 61 6e  ed );.      tran
2f0d0 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70  slateColumnToCop
2f0e0 79 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  y(pParse, pLevel
2f0f0 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76  ->addrBody, pLev
2f100 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20  el->iTabCur,.   
2f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f120 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
2f130 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29  m->regResult, 0)
2f140 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
2f150 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2f160 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
2f170 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
2f180 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74   VDBE code subst
2f190 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
2f1a0 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
2f1b0 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74  m the index inst
2f1c0 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20  ead of from the 
2f1d0 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73  table where poss
2f1e0 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63  ible.  In some c
2f1f0 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73  ases.    ** this
2f200 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72   optimization pr
2f210 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65  events the table
2f220 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67   from ever being
2f230 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e   read, which can
2f240 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20  .    ** yield a 
2f250 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
2f260 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
2f270 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
2f280 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
2f290 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
2f2a0 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
2f2b0 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
2f2c0 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
2f2d0 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
2f2e0 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
2f2f0 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
2f300 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
2f310 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
2f320 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
2f330 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
2f340 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
2f350 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
2f360 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
2f370 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
2f380 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
2f390 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
2f3a0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
2f3b0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2f3c0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
2f3d0 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f  DEXED|WHERE_IDX_
2f3e0 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70  ONLY) ){.      p
2f3f0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
2f400 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
2f410 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70   }else if( pLoop
2f420 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2f430 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
2f440 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
2f450 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20  l->u.pCovidx;.  
2f460 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
2f470 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
2f480 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2f490 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52  ASS_OFF || !HasR
2f4a0 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
2f4b0 65 29 29 0a 20 20 20 20 20 26 26 20 21 64 62 2d  e)).     && !db-
2f4c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
2f4d0 20 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20    ){.      last 
2f4e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2f4f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2f500 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61     k = pLevel->a
2f510 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20 70  ddrBody;.      p
2f520 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
2f530 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20  GetOp(v, k);.   
2f540 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b     for(; k<last;
2f550 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
2f560 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
2f570 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
2f580 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2f590 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
2f5a0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
2f5b0 6e 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  n.#ifdef SQLITE_
2f5c0 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
2f5d0 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 20 20 20  L_FUNC.         
2f5e0 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  || pOp->opcode==
2f5f0 4f 50 5f 4f 66 66 73 65 74 0a 23 65 6e 64 69 66  OP_Offset.#endif
2f600 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2f610 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f        int x = pO
2f620 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20  p->p2;.         
2f630 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
2f640 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20  Table==pTab );. 
2f650 20 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61           if( !Ha
2f660 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
2f670 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65              Inde
2f680 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
2f690 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
2f6a0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
2f6b0 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f     x = pPk->aiCo
2f6c0 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20  lumn[x];.       
2f6d0 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d       assert( x>=
2f6e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  0 );.          }
2f6f0 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73  .          x = s
2f700 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
2f710 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20  dex(pIdx, x);.  
2f720 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30          if( x>=0
2f730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f740 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20  pOp->p2 = x;.   
2f750 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
2f760 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
2f770 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ur;.          }.
2f780 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2f790 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2f7a0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2f7b0 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 0a  LY)==0 || x>=0 .
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2f7d0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2f7e0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  s );.        }el
2f7f0 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
2f800 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
2f810 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
2f820 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
2f830 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Cur;.          p
2f840 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
2f850 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  IdxRowid;.      
2f860 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
2f870 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 75  >opcode==OP_IfNu
2f880 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  llRow ){.       
2f890 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
2f8a0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
2f8b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f8c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2f8d0 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
2f8e0 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  */.  pParse->nQu
2f8f0 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
2f900 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2f910 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  p;.  whereInfoFr
2f920 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
2f930 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.