/ Hex Artifact Content
Login

Artifact b7e82341d2570ac8a051e133cfc44c7eec79a30e:


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 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 31 36 20 77 74 46 6c 61 67 73   *p, u16 wtFlags
1970: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1980: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
1990: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74  ;.  testcase( wt
19a0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
19b0: 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57  TUAL );.  if( pW
19c0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
19d0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
19e0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
19f0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
1a00: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
1a10: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1a20: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
1a30: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a40: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
1a50: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
1a60: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
1a70: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
1a80: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
1a90: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
1ac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ad0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
1ae0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1af0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1b00: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
1b10: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
1b20: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
1b30: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
1b40: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
1b50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b60: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
1b70: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
1b80: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b90: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
1ba0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
1bb0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ]);.    memset(&
1bc0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
1bd0: 6d 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 57  m], 0, sizeof(pW
1be0: 43 2d 3e 61 5b 30 5d 29 2a 28 70 57 43 2d 3e 6e  C->a[0])*(pWC->n
1bf0: 53 6c 6f 74 2d 70 57 43 2d 3e 6e 54 65 72 6d 29  Slot-pWC->nTerm)
1c00: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1c10: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1c20: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1c30: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1c40: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c50: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c60: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c70: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c80: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 32 37  (p->iTable) - 27
1c90: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ca0: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1cb0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72   = 1;.  }.  pTer
1cc0: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
1cd0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1ce0: 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  e(p);.  pTerm->w
1cf0: 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73  tFlags = wtFlags
1d00: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
1d10: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
1d20: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
1d30: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
1d40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d50: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
1d60: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
1d70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
1d80: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
1d90: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
1da0: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
1db0: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
1dc0: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
1dd0: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
1de0: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
1df0: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
1e00: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
1e10: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
1e20: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
1e30: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
1e40: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
1e50: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
1e60: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
1e70: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
1e80: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
1e90: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
1ea0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
1eb0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1ec0: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
1ed0: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
1ee0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
1ef0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
1f00: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
1f10: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
1f20: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
1f30: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
1f40: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
1f50: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
1f60: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
1f70: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
1f80: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
1f90: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
1fa0: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
1fb0: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
1fc0: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
1fd0: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
1fe0: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
1ff0: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
2000: 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f   array.  The slo
2010: 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20  t[] array grows 
2020: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
2030: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
2040: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2050: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
2060: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
2070: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
2080: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
2090: 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  u8 op){.  pWC->o
20a0: 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45  p = op;.  if( pE
20b0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
20c0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
20d0: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
20e0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
20f0: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
2100: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
2110: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
2120: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
2130: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
2140: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2150: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
2160: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
2170: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a  WhereMaskSet obj
2180: 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ect.*/.#define i
2190: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28  nitMaskSet(P)  (
21a0: 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52  P)->n=0../*.** R
21b0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
21c0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
21d0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
21e0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
21f0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
2200: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
2210: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
2220: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
2230: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
2240: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
2250: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
2260: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
2270: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
2280: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2290: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
22a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
22b0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
22c0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
22d0: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
22e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2300: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
2310: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
2320: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
2330: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
2340: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
2350: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
2360: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2370: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2380: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
2390: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
23a0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
23b0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23c0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
23d0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
23e0: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
23f0: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
2400: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
2410: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
2420: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
2430: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2440: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2450: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
2460: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
2470: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
2480: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
2490: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
24a0: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
24b0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
24c0: 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76  s walk (recursiv
24d0: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
24e0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
24f0: 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73  rate.** a bitmas
2500: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
2510: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
2520: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
2530: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
2540: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
2550: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2560: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2570: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
2580: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2590: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
25a0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
25b0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
25c0: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
25d0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
25e0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
25f0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
2600: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2610: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2620: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
2630: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
2640: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
2650: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
2660: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
2670: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
2680: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
2690: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
26a0: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
26b0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
26c0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
26d0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
26e0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
26f0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
2700: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
2710: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
2720: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2730: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
2740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
2750: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
2760: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2770: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
2780: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2790: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
27a0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
27b0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
27c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
27d0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
27e0: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
27f0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
2800: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
2810: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
2820: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2830: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2840: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2850: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
2860: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
2870: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2880: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2890: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
28a0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
28b0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
28c0: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
28d0: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
28e0: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
28f0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
2900: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
2910: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
2920: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
2930: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
2940: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
2950: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2960: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
2970: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
2980: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
2990: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
29a0: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
29b0: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
29c0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
29d0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
29e0: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
29f0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
2a00: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
2a10: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
2a20: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
2a30: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
2a40: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2a50: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
2a60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
2a70: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
2a80: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2a90: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
2aa0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
2ab0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2ac0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2ad0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
2ae0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2af0: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
2b00: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
2b10: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
2b20: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2b30: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
2b40: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
2b50: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
2b60: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
2b70: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
2b80: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2b90: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
2ba0: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
2bb0: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
2bc0: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c  <=", ">=", "IN",
2bd0: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
2be0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
2bf0: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a  owedOp(int op){.
2c00: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
2c10: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54  TK_EQ && TK_GT<T
2c20: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
2c30: 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26  ( TK_LT>TK_EQ &&
2c40: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LT<TK_GE );.
2c50: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e    assert( TK_LE>
2c60: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54  TK_EQ && TK_LE<T
2c70: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
2c80: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34  ( TK_GE==TK_EQ+4
2c90: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d   );.  return op=
2ca0: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
2cb0: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
2cc0: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  E) || op==TK_ISN
2cd0: 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ULL;.}../*.** Co
2ce0: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
2cf0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
2d00: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
2d10: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
2d20: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
2d30: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
2d40: 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67  *.** If left/rig
2d50: 68 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75  ht precedence ru
2d60: 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c  les come into pl
2d70: 61 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ay when determin
2d80: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61  ing the.** colla
2d90: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74  ting sequence, t
2da0: 68 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  hen COLLATE oper
2db0: 61 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74  ators are adjust
2dc0: 65 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  ed to ensure.** 
2dd0: 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69  that the collati
2de0: 6e 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73  ng sequence does
2df0: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f   not change.  Fo
2e00: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59  r example:.** "Y
2e10: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
2e20: 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58  op X" becomes "X
2e30: 20 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61   op Y" because a
2e40: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
2e50: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
2e60: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
2e70: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
2e80: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
2e90: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
2ea0: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
2eb0: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
2ec0: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
2ed0: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
2ee0: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
2ef0: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
2f00: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
2f10: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2f20: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2f30: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
2f40: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
2f50: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
2f60: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
2f70: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
2f80: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ft->flags & EP_C
2f90: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
2fa0: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
2fb0: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
2fc0: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
2fd0: 20 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65   if( expRight==e
2fe0: 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a  xpLeft ){.    /*
2ff0: 20 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20   Either X and Y 
3000: 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54  both have COLLAT
3010: 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65  E operator or ne
3020: 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20  ither do */.    
3030: 69 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a  if( expRight ){.
3040: 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20        /* Both X 
3050: 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  and Y have COLLA
3060: 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d  TE operators.  M
3070: 61 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c  ake sure X is al
3080: 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ways.      ** us
3090: 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ed by clearing t
30a0: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
30b0: 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20  ag from Y. */.  
30c0: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
30d0: 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f  t->flags &= ~EP_
30e0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c  Collate;.    }el
30f0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  se if( sqlite3Ex
3100: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
3110: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  , pExpr->pLeft)!
3120: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  =0 ){.      /* N
3130: 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68  either X nor Y h
3140: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
3150: 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73  ators, but X has
3160: 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20   a non-default. 
3170: 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e       ** collatin
3180: 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20  g sequence.  So 
3190: 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  add the EP_Colla
31a0: 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74  te marker on X t
31b0: 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  o cause.      **
31c0: 20 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68   it to be search
31d0: 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  ed first. */.   
31e0: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
31f0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
3200: 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  late;.    }.  }.
3210: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
3220: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
3230: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
3240: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
3250: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3260: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
3270: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
3280: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
3290: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32a0: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
32b0: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
32c0: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
32d0: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
32e0: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
32f0: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
3300: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
3310: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
3320: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
3330: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
3340: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
3350: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
3360: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
3370: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
3380: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
3390: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
33a0: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
33b0: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
33c0: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
33d0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
33e0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
33f0: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
3400: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
3410: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
3420: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
3430: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
3440: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
3450: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
3460: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
3470: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
3480: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3490: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
34a0: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
34b0: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
34c0: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
34d0: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
34e0: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
34f0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
3500: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
3510: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3520: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
3530: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3540: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
3550: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
3560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
3570: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57  ce to the next W
3580: 68 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61  hereTerm that ma
3590: 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20  tches according 
35a0: 74 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  to the criteria.
35b0: 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77  ** established w
35c0: 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62  hen the pScan ob
35d0: 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c  ject was initial
35e0: 69 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61  ized by whereSca
35f0: 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75  nInit()..** Retu
3600: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
3610: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74   are no more mat
3620: 63 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73  ching WhereTerms
3630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
3640: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
3650: 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a  Next(WhereScan *
3660: 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43  pScan){.  int iC
3670: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
3680: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20  * The cursor on 
3690: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74  the LHS of the t
36a0: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  erm */.  int iCo
36b0: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
36c0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   The column on t
36d0: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65  he LHS of the te
36e0: 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20  rm.  -1 for IPK 
36f0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20  */.  Expr *pX;  
3700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
3710: 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67  expression being
3720: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65   tested */.  Whe
3730: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
3740: 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66    /* Shorthand f
3750: 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f  or pScan->pWC */
3760: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3770: 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  erm;    /* The t
3780: 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64  erm being tested
3790: 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53   */.  int k = pS
37a0: 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68  can->k;    /* Wh
37b0: 65 72 65 20 74 6f 20 73 74 61 72 74 20 73 63 61  ere to start sca
37c0: 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c  nning */..  whil
37d0: 65 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  e( pScan->iEquiv
37e0: 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  <=pScan->nEquiv 
37f0: 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53  ){.    iCur = pS
3800: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61  can->aEquiv[pSca
3810: 6e 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20  n->iEquiv-2];.  
3820: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61    iColumn = pSca
3830: 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d  n->aEquiv[pScan-
3840: 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20  >iEquiv-1];.    
3850: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
3860: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
3870: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
3880: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
3890: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
38a0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
38b0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
38c0: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
38d0: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
38e0: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
38f0: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
3900: 28 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d  (pScan->iEquiv<=
3910: 32 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f  2 || !ExprHasPro
3920: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
3930: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
3940: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3950: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
3960: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
3970: 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20  O_EQUIV)!=0.    
3980: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
3990: 3e 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a  >nEquiv<ArraySiz
39a0: 65 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29  e(pScan->aEquiv)
39b0: 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
39c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
39d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20  .            pX 
39e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
39f0: 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e  pCollate(pTerm->
3a00: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
3a20: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43  rt( pX->op==TK_C
3a30: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
3a40: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3a50: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a  pScan->nEquiv; j
3a60: 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +=2){.          
3a70: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61      if( pScan->a
3a80: 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54  Equiv[j]==pX->iT
3a90: 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
3aa0: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45      && pScan->aE
3ab0: 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69  quiv[j+1]==pX->i
3ac0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
3ae0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
3af0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
3b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3b10: 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69   j==pScan->nEqui
3b20: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  v ){.           
3b30: 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76     pScan->aEquiv
3b40: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
3b50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3b60: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
3b70: 31 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  1] = pX->iColumn
3b80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3b90: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d  pScan->nEquiv +=
3ba0: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   2;.            
3bb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
3bc0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
3bd0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
3be0: 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d  pScan->opMask)!=
3bf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
3c00: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61   /* Verify the a
3c10: 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c  ffinity and coll
3c20: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
3c30: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
3c40: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a      if( pScan->z
3c50: 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65  CollName && (pTe
3c60: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
3c70: 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b  WO_ISNULL)==0 ){
3c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
3c90: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72               Par
3cb0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
3cc0: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
3cd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3ce0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3cf0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
3d00: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
3d10: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
3d20: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20   pScan->idxaff) 
3d30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3d40: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
3d50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3d60: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
3d70: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
3d90: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
3da0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
3db0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
3df0: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
3e00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3e10: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
3e20: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
3e30: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3e50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
3e60: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63  Coll->zName, pSc
3e70: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29  an->zCollName) )
3e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3e90: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3ea0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3eb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ec0: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
3ed0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
3ee0: 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20  _EQ)!=0.        
3ef0: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
3f00: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3f10: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
3f20: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
3f30: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
3f40: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a  Scan->aEquiv[0].
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
3f60: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63  pX->iColumn==pSc
3f70: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20  an->aEquiv[1].  
3f80: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
3f90: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
3fa0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
3fb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
3fc0: 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20  Scan->k = k+1;. 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
3fe0: 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  n pTerm;.       
3ff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
4000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63       }.      pSc
4010: 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d  an->pWC = pScan-
4020: 3e 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  >pWC->pOuter;.  
4030: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d      k = 0;.    }
4040: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  .    pScan->pWC 
4050: 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43  = pScan->pOrigWC
4060: 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20  ;.    k = 0;.   
4070: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b   pScan->iEquiv +
4080: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
4090: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
40a0: 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45  itialize a WHERE
40b0: 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20   clause scanner 
40c0: 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20  object.  Return 
40d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
40e0: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e  .** first match.
40f0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
4100: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61   there are no ma
4110: 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tches..**.** The
4120: 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65   scanner will be
4130: 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57   searching the W
4140: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e  HERE clause pWC.
4150: 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a    It will look.*
4160: 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  * for terms of t
4170: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4180: 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20  <expr>" where X 
4190: 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d  is column iColum
41a0: 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43  n of table.** iC
41b0: 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75  ur.  The <op> mu
41c0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  st be one of the
41d0: 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72   operators descr
41e0: 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a  ibed by opMask..
41f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61  **.** If the sea
4200: 72 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64  rch is for X and
4210: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4220: 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73  e contains terms
4230: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
4240: 58 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f  X=Y then this ro
4250: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
4260: 20 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66   return terms of
4270: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20   the form.** "Y 
4280: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54  <op> <expr>".  T
4290: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  he number of lev
42a0: 65 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76  els of transitiv
42b0: 69 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a  ity is limited,.
42c0: 2a 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68  ** but is enough
42d0: 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20   to handle most 
42e0: 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69  commonly occurri
42f0: 6e 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ng SQL statement
4300: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  s..**.** If X is
4310: 20 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52   not the INTEGER
4320: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65   PRIMARY KEY the
4330: 6e 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70  n X must be comp
4340: 61 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69  atible with.** i
4350: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74  ndex pIdx..*/.st
4360: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
4370: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20  whereScanInit(. 
4380: 20 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61   WhereScan *pSca
4390: 6e 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  n,       /* The 
43a0: 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74  WhereScan object
43b0: 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a   being initializ
43c0: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
43d0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
43e0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
43f0: 75 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  use to be scanne
4400: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4420: 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
4430: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
4440: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
4450: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73    /* Column to s
4460: 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32  can for */.  u32
4470: 20 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20   opMask,        
4480: 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72       /* Operator
4490: 28 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  (s) to scan for 
44a0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
44c0: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
44d0: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
44e0: 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  ex */.){.  int j
44f0: 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  ;..  /* memset(p
4500: 53 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Scan, 0, sizeof(
4510: 2a 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70  *pScan)); */.  p
4520: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20  Scan->pOrigWC = 
4530: 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57  pWC;.  pScan->pW
4540: 43 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70  C = pWC;.  if( p
4550: 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d  Idx && iColumn>=
4560: 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  0 ){.    pScan->
4570: 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70  idxaff = pIdx->p
4580: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
4590: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
45a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78     for(j=0; pIdx
45b0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69  ->aiColumn[j]!=i
45c0: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
45d0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e      if( NEVER(j>
45e0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  pIdx->nColumn) )
45f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
4600: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
4610: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
4620: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65  Coll[j];.  }else
4630: 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78  {.    pScan->idx
4640: 61 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63  aff = 0;.    pSc
4650: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
4660: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
4670: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
4680: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
4690: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
46a0: 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53  [0] = iCur;.  pS
46b0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d  can->aEquiv[1] =
46c0: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61   iColumn;.  pSca
46d0: 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20  n->nEquiv = 2;. 
46e0: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d   pScan->iEquiv =
46f0: 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65   2;.  return whe
4700: 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e  reScanNext(pScan
4710: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  );.}../*.** Sear
4720: 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e  ch for a term in
4730: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4740: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
4750: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
4760: 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58  xpr>".** where X
4770: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
4780: 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f  to the iColumn o
4790: 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64  f table iCur and
47a0: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a   <op> is one of.
47b0: 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65  ** the WO_xx ope
47c0: 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63  rator codes spec
47d0: 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20  ified by the op 
47e0: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65  parameter..** Re
47f0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
4800: 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74  o the term.  Ret
4810: 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75  urn 0 if not fou
4820: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  nd..**.** The te
4830: 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68  rm returned migh
4840: 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66  t by Y=<expr> if
4850: 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65   there is anothe
4860: 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a  r constraint in.
4870: 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
4880: 75 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69  use that specifi
4890: 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e  es that X=Y.  An
48a0: 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e  y such constrain
48b0: 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64  ts will be.** id
48c0: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
48d0: 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20  WO_EQUIV bit in 
48e0: 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  the pTerm->eOper
48f0: 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65  ator field.  The
4900: 0a 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72  .** aEquiv[] arr
4910: 61 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61  ay holds X and a
4920: 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e  ll its equivalen
4930: 74 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51  ts, with each SQ
4940: 4c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61  L variable.** ta
4950: 6b 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74  king up two slot
4960: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20  s in aEquiv[].  
4970: 54 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69  The first slot i
4980: 73 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72  s for the cursor
4990: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74   number.** and t
49a0: 68 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72  he second is for
49b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
49c0: 65 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32  er.  There are 2
49d0: 32 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  2 slots in aEqui
49e0: 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d  v[].** so that m
49f0: 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b  eans we can look
4a00: 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74   for X plus up t
4a10: 6f 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76  o 10 other equiv
4a20: 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a  alent values..**
4a30: 20 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20   Hence a search 
4a40: 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72  for X will retur
4a50: 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31  n <expr> if X=A1
4a60: 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41   and A1=A2 and A
4a70: 32 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20  2=A3.** and ... 
4a80: 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41  and A9=A10 and A
4a90: 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a  10=<expr>..**.**
4aa0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75   If there are mu
4ab0: 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20  ltiple terms in 
4ac0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4ad0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4ae0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
4af0: 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65  then try for the
4b00: 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70   one with no dep
4b10: 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78  endencies on <ex
4b20: 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77  pr> - in other w
4b30: 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65  ords where.** <e
4b40: 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61  xpr> is a consta
4b50: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  nt expression of
4b60: 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c   some kind.  Onl
4b70: 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73  y return entries
4b80: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
4b90: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
4ba0: 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69   Y is a column i
4bb0: 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  n another table 
4bc0: 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a  if no terms of.*
4bd0: 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  * the form "X <o
4be0: 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22  p> <const-expr>"
4bf0: 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20   exist.   If no 
4c00: 74 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e  terms with a con
4c10: 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69  stant RHS.** exi
4c20: 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72  st, try to retur
4c30: 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f  n a term that do
4c40: 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51  es not use WO_EQ
4c50: 55 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  UIV..*/.static W
4c60: 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65  hereTerm *findTe
4c70: 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  rm(.  WhereClaus
4c80: 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
4c90: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4ca0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
4cb0: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
4cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4cd0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  sor number of LH
4ce0: 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  S */.  int iColu
4cf0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn,          /* 
4d00: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
4d10: 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73   LHS */.  Bitmas
4d20: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
4d30: 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20  /* RHS must not 
4d40: 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69  overlap with thi
4d50: 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20  s mask */.  u32 
4d60: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
4d70: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f    /* Mask of WO_
4d80: 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69  xx values descri
4d90: 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f  bing operator */
4da0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
4db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
4dc0: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
4dd0: 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20  ith this index, 
4de0: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29  if not NULL */.)
4df0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
4e00: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68  Result = 0;.  Wh
4e10: 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68  ereTerm *p;.  Wh
4e20: 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20  ereScan scan;.. 
4e30: 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e   p = whereScanIn
4e40: 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69  it(&scan, pWC, i
4e50: 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70  Cur, iColumn, op
4e60: 2c 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65  , pIdx);.  while
4e70: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
4e80: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
4e90: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
4ea0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
4eb0: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
4ec0: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f  (p->eOperator&WO
4ed0: 5f 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)!=0 ){.     
4ee0: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
4ef0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
4f00: 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73  Result==0 ) pRes
4f10: 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ult = p;.    }. 
4f20: 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e     p = whereScan
4f30: 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d  Next(&scan);.  }
4f40: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c  .  return pResul
4f50: 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t;.}../* Forward
4f60: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
4f70: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
4f80: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
4f90: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
4fa0: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
4fb0: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
4fc0: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
4fd0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f  ERE clause.  .*/
4fe0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
4ff0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53  rAnalyzeAll(.  S
5000: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5010: 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46  ,       /* the F
5020: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
5030: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
5040: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
5050: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
5060: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
5070: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5080: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
5090: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
50a0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
50b0: 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a  bList, pWC, i);.
50c0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
50d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
50e0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  OPTIMIZATION./*.
50f0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
5100: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
5110: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b  ression is a LIK
5120: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
5130: 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  or that.** can b
5140: 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
5150: 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  g inequality con
5160: 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72  straints.  Retur
5170: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a  n TRUE if it is.
5180: 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20  ** so and false 
5190: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  if not..**.** In
51a0: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f   order for the o
51b0: 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70  perator to be op
51c0: 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52  timizible, the R
51d0: 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72  HS must be a str
51e0: 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74  ing.** literal t
51f0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  hat does not beg
5200: 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61  in with a wildca
5210: 72 64 2e 20 20 54 68 65 20 4c 48 53 20 6d 75 73  rd.  The LHS mus
5220: 74 20 62 65 20 61 20 63 6f 6c 75 6d 6e 0a 2a 2a  t be a column.**
5230: 20 74 68 61 74 20 6d 61 79 20 6f 6e 6c 79 20 62   that may only b
5240: 65 20 4e 55 4c 4c 2c 20 61 20 73 74 72 69 6e 67  e NULL, a string
5250: 2c 20 6f 72 20 61 20 42 4c 4f 42 2c 20 6e 65 76  , or a BLOB, nev
5260: 65 72 20 61 20 6e 75 6d 62 65 72 2e 20 28 54 68  er a number. (Th
5270: 69 73 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  is means.** that
5280: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
5290: 63 61 6e 6e 6f 74 20 70 61 72 74 69 63 69 70 61  cannot participa
52a0: 74 65 20 69 6e 20 74 68 65 20 4c 49 4b 45 20 6f  te in the LIKE o
52b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 29 20 20 49  ptimization.)  I
52c0: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69  f the.** collati
52d0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
52e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  the column on th
52f0: 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61 70  e LHS must be ap
5300: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a  propriate for.**
5310: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 2e 0a 2a   the operator..*
5320: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c  /.static int isL
5330: 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72  ikeOrGlob(.  Par
5340: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
5350: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
5360: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
5370: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
5380: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
5390: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
53a0: 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sion */.  Expr *
53b0: 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50  *ppPrefix,  /* P
53c0: 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52  ointer to TK_STR
53d0: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
53e0: 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66  ith pattern pref
53f0: 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  ix */.  int *pis
5400: 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75  Complete, /* Tru
5410: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
5420: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
5430: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
5440: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43  r */.  int *pnoC
5450: 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ase      /* True
5460: 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73   if uppercase is
5470: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
5480: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20  owercase */.){. 
5490: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
54a0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53   0;         /* S
54b0: 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20  tring on RHS of 
54c0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
54d0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
54e0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a   *pLeft;      /*
54f0: 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   Right and left 
5500: 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65  size of LIKE ope
5510: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c  rator */.  ExprL
5520: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  ist *pList;     
5530: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
5540: 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65   operands to the
5550: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
5560: 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5580: 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20  * One character 
5590: 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  in z[] */.  int 
55a0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
55b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
55c0: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
55d0: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
55e0: 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b  rs */.  char wc[
55f0: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
5600: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63     /* Wildcard c
5610: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73  haracters */.  s
5620: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5630: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
5640: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5650: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
5660: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
5670: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
5680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5690: 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20  pcode of pRight 
56a0: 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74  */..  if( !sqlit
56b0: 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  e3IsLikeFunction
56c0: 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43  (db, pExpr, pnoC
56d0: 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20  ase, wc) ){.    
56e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69  return 0;.  }.#i
56f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44  fdef SQLITE_EBCD
5700: 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73  IC.  if( *pnoCas
5710: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e ) return 0;.#e
5720: 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70  ndif.  pList = p
5730: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
5740: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
5750: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
5760: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
5770: 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71  COLUMN .   || sq
5780: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
5790: 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45  y(pLeft)!=SQLITE
57a0: 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c  _AFF_TEXT .   ||
57b0: 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74   IsVirtual(pLeft
57c0: 2d 3e 70 54 61 62 29 20 20 2f 2a 20 56 61 6c 75  ->pTab)  /* Valu
57d0: 65 20 6d 69 67 68 74 20 62 65 20 6e 75 6d 65 72  e might be numer
57e0: 69 63 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f  ic */.  ){.    /
57f0: 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34  * IMP: R-02065-4
5800: 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61  9465 The left-ha
5810: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c  nd side of the L
5820: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
5830: 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a  ator must.    **
5840: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
5850: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
5860: 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69  n with TEXT affi
5870: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74  nity. */.    ret
5880: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
5890: 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  ert( pLeft->iCol
58a0: 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  umn!=(-1) ); /* 
58b0: 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65  Because IPK neve
58c0: 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a  r has AFF_TEXT *
58d0: 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71  /..  pRight = sq
58e0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
58f0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  late(pList->a[0]
5900: 2e 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20  .pExpr);.  op = 
5910: 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66  pRight->op;.  if
5920: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
5930: 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70  E ){.    Vdbe *p
5940: 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72  Reprepare = pPar
5950: 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a  se->pReprepare;.
5960: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5970: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  Right->iColumn;.
5980: 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
5990: 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
59a0: 6c 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20  lue(pReprepare, 
59b0: 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46  iCol, SQLITE_AFF
59c0: 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20  _NONE);.    if( 
59d0: 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f  pVal && sqlite3_
59e0: 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
59f0: 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
5a00: 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72  .      z = (char
5a10: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
5a20: 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20  _text(pVal);.   
5a30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
5a40: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61  beSetVarmask(pPa
5a50: 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c  rse->pVdbe, iCol
5a60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
5a70: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  Right->op==TK_VA
5a80: 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74  RIABLE || pRight
5a90: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
5aa0: 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  R );.  }else if(
5ab0: 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29   op==TK_STRING )
5ac0: 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74  {.    z = pRight
5ad0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a  ->u.zToken;.  }.
5ae0: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63    if( z ){.    c
5af0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
5b00: 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30  e( (c=z[cnt])!=0
5b10: 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20   && c!=wc[0] && 
5b20: 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77  c!=wc[1] && c!=w
5b30: 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e  c[2] ){.      cn
5b40: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t++;.    }.    i
5b50: 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35  f( cnt!=0 && 255
5b60: 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29  !=(u8)z[cnt-1] )
5b70: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50  {.      Expr *pP
5b80: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69  refix;.      *pi
5b90: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77  sComplete = c==w
5ba0: 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d  c[0] && z[cnt+1]
5bb0: 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66  ==0;.      pPref
5bc0: 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ix = sqlite3Expr
5bd0: 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20  (db, TK_STRING, 
5be0: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  z);.      if( pP
5bf0: 72 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d  refix ) pPrefix-
5c00: 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d  >u.zToken[cnt] =
5c10: 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65   0;.      *ppPre
5c20: 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20  fix = pPrefix;. 
5c30: 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
5c40: 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20  VARIABLE ){.    
5c50: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
5c60: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
5c70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c80: 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52  SetVarmask(v, pR
5c90: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  ight->iColumn);.
5ca0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73          if( *pis
5cb0: 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67  Complete && pRig
5cc0: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20  ht->u.zToken[1] 
5cd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
5ce0: 49 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68  If the rhs of th
5cf0: 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f  e LIKE expressio
5d00: 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c  n is a variable,
5d10: 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
5d20: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61  .          ** va
5d30: 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61  lue of the varia
5d40: 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ble means there 
5d50: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e  is no need to in
5d60: 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20  voke the LIKE.  
5d70: 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
5d80: 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f  ion, then no OP_
5d90: 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65  Variable will be
5da0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72   added to the pr
5db0: 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20  ogram..         
5dc0: 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20   ** This causes 
5dd0: 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65  problems for the
5de0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
5df0: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20  rameter_name(). 
5e00: 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e           ** API.
5e10: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
5e20: 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d  them, add a dumm
5e30: 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65  y OP_Variable he
5e40: 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  re..          */
5e50: 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20   .          int 
5e60: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5e70: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
5e80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5e90: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
5ea0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
5eb0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  r1);.          s
5ec0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5ed0: 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  P3(v, sqlite3Vdb
5ee0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
5ef0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
5f00: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5f10: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5f20: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
5f30: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
5f40: 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20  .      z = 0;.  
5f50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
5f60: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
5f70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d  );.  return (z!=
5f80: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  0);.}.#endif /* 
5f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
5fa0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
5fb0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
5fc0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
5fd0: 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  BLE./*.** Check 
5fe0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
5ff0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
6000: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
6010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75  .**         colu
6020: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a  mn MATCH expr.**
6030: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65  .** If it is the
6040: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  n return TRUE.  
6050: 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46  If not, return F
6060: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
6070: 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  int isMatchOfCol
6080: 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78  umn(.  Expr *pEx
6090: 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  pr      /* Test 
60a0: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
60b0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
60c0: 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20   *pList;..  if( 
60d0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55  pExpr->op!=TK_FU
60e0: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65  NCTION ){.    re
60f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
6100: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6110: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
6120: 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a  ,"match")!=0 ){.
6130: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6140: 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  }.  pList = pExp
6150: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66  r->x.pList;.  if
6160: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ( pList->nExpr!=
6170: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
6180: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
6190: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e  st->a[1].pExpr->
61a0: 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20  op != TK_COLUMN 
61b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
61c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
61d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
61e0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
61f0: 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
6200: 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70  If the pBase exp
6210: 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
6220: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
6230: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a  USING clause of.
6240: 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  ** a join, then 
6250: 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70  transfer the app
6260: 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67  ropriate marking
6270: 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65  s over to derive
6280: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6290: 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61  d transferJoinMa
62a0: 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65  rkings(Expr *pDe
62b0: 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61  rived, Expr *pBa
62c0: 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69  se){.  if( pDeri
62d0: 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69  ved ){.    pDeri
62e0: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
62f0: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
6300: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44  FromJoin;.    pD
6310: 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f  erived->iRightJo
6320: 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d  inTable = pBase-
6330: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
6340: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
6350: 61 72 6b 20 74 65 72 6d 20 69 43 68 69 6c 64 20  ark term iChild 
6360: 61 73 20 62 65 69 6e 67 20 61 20 63 68 69 6c 64  as being a child
6370: 20 6f 66 20 74 65 72 6d 20 69 50 61 72 65 6e 74   of term iParent
6380: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6390: 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28  markTermAsChild(
63a0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
63b0: 2c 20 69 6e 74 20 69 43 68 69 6c 64 2c 20 69 6e  , int iChild, in
63c0: 74 20 69 50 61 72 65 6e 74 29 7b 0a 20 20 70 57  t iParent){.  pW
63d0: 43 2d 3e 61 5b 69 43 68 69 6c 64 5d 2e 69 50 61  C->a[iChild].iPa
63e0: 72 65 6e 74 20 3d 20 69 50 61 72 65 6e 74 3b 0a  rent = iParent;.
63f0: 20 20 70 57 43 2d 3e 61 5b 69 43 68 69 6c 64 5d    pWC->a[iChild]
6400: 2e 74 72 75 74 68 50 72 6f 62 20 3d 20 70 57 43  .truthProb = pWC
6410: 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 74 72 75  ->a[iParent].tru
6420: 74 68 50 72 6f 62 3b 0a 20 20 70 57 43 2d 3e 61  thProb;.  pWC->a
6430: 5b 69 50 61 72 65 6e 74 5d 2e 6e 43 68 69 6c 64  [iParent].nChild
6440: 2b 2b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  ++;.}..#if !defi
6450: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6460: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
6470: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6480: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6490: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
64a0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
64b0: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
64c0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
64d0: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
64e0: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
64f0: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
6500: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
6510: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
6520: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6540: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
6550: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
6560: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
6570: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
6580: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
6590: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
65a0: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
65b0: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
65c0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
65d0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
65e0: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
65f0: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
6600: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
6610: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
6620: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
6630: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
6640: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
6650: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
6660: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6670: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
6680: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
6690: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
66a0: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
66b0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
66c0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
66d0: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
66e0: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
66f0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
6700: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
6710: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
6720: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
6730: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
6740: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
6750: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
6760: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
6770: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
6780: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
6790: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
67a0: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
67b0: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
67c0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
67d0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
67e0: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
67f0: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
6800: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
6810: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
6820: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
6830: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
6840: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
6850: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
6860: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
6870: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
6880: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
6890: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
68a0: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
68b0: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
68c0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
68d0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
68e0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
68f0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
6900: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
6910: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
6920: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
6930: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
6940: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
6950: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
6960: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
6970: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
6980: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
6990: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
69a0: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
69b0: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
69c0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
69d0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
69e0: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
69f0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
6a00: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
6a10: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
6a20: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6a30: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
6a40: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
6a50: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
6a60: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
6a70: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
6a80: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
6a90: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
6aa0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6ab0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
6ac0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
6ad0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
6ae0: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
6af0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
6b00: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
6b10: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
6b20: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
6b30: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
6b40: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
6b50: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
6b60: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
6b70: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
6b80: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
6b90: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
6ba0: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
6bb0: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
6bc0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
6bd0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
6be0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
6bf0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
6c00: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
6c10: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
6c20: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
6c30: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
6c40: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
6c50: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
6c60: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
6c70: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6c80: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
6c90: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
6ca0: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
6cb0: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
6cc0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
6cd0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
6ce0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
6cf0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
6d00: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
6d10: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
6d20: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
6d30: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
6d40: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
6d50: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
6d60: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
6d70: 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72  decided elsewher
6d80: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
6d90: 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20  s only looks at 
6da0: 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73  whether subterms
6db0: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
6dc0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
6dd0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
6de0: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
6df0: 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79   E above satisfy
6e00: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
6e10: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
6e20: 73 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31  satisfies case 1
6e30: 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20   (such as B) we 
6e40: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70  know that the op
6e50: 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20  timizer will.** 
6e60: 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61  always prefer ca
6e70: 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74  se 1, so in that
6e80: 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64   case we pretend
6e90: 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20   that case 2 is 
6ea0: 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64  not.** satisfied
6eb0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74  ..**.** It might
6ec0: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
6ed0: 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65  t multiple table
6ee0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e  s are indexable.
6ef0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a    For example,.*
6f00: 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69  * (E) above is i
6f10: 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c  ndexable on tabl
6f20: 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a  es P, Q, and R..
6f30: 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74  **.** Terms that
6f40: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20   satisfy case 2 
6f50: 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66  are candidates f
6f60: 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69  or lookup by usi
6f70: 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69  ng.** separate i
6f80: 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72  ndices to find r
6f90: 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73  owids for each s
6fa0: 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f  ubterm and compo
6fb0: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f  sing.** the unio
6fc0: 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20  n of all rowids 
6fd0: 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f  using a RowSet o
6fe0: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20  bject.  This is 
6ff0: 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62  similar.** to "b
7000: 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69  itmap indices" i
7010: 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  n other database
7020: 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20   engines..**.** 
7030: 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a  OTHERWISE:.**.**
7040: 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65   If neither case
7050: 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70   1 nor case 2 ap
7060: 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20  ply, then leave 
7070: 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65  the eOperator se
7080: 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54  t to.** zero.  T
7090: 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
70a0: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63  useful for searc
70b0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
70c0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  d exprAnalyzeOrT
70d0: 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  erm(.  SrcList *
70e0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
70f0: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
7100: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
7110: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
7120: 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65     /* the comple
7130: 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
7140: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
7150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7160: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  * Index of the O
7170: 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  R-term to be ana
7180: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68  lyzed */.){.  Wh
7190: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
71a0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20  = pWC->pWInfo;  
71b0: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
71c0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
71d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
71e0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
71f0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
7200: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
7210: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
7220: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7230: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
7240: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
7250: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
7260: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
7270: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
7280: 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20  erm];    /* The 
7290: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
72a0: 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  zed */.  Expr *p
72b0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
72c0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
72d0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
72e0: 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a  on of the term *
72f0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7320: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
7330: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
7340: 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42  OrWc;       /* B
7350: 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20  reakup of pTerm 
7360: 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
7370: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f  .  WhereTerm *pO
7380: 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20  rTerm;       /* 
7390: 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69  A Sub-term withi
73a0: 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20  n the pOrWc */. 
73b0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f   WhereOrInfo *pO
73c0: 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64  rInfo;     /* Ad
73d0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
73e0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
73f0: 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20  with pTerm */.  
7400: 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e  Bitmask chngToIN
7410: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
7420: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
7430: 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f  atisfy case 1 */
7440: 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78  .  Bitmask index
7450: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  able;        /* 
7460: 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  Tables that are 
7470: 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73  indexable, satis
7480: 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a  fying case 2 */.
7490: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b  .  /*.  ** Break
74a0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
74b0: 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65  nto its separate
74c0: 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20   subterms.  The 
74d0: 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a  subterms are.  *
74e0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68  * stored in a Wh
74f0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
7500: 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77  ure containing w
7510: 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f  ithin the WhereO
7520: 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63  rInfo.  ** objec
7530: 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68  t that is attach
7540: 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ed to the origin
7550: 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72  al OR clause ter
7560: 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  m..  */.  assert
7570: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
7580: 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49  s & (TERM_DYNAMI
7590: 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45  C|TERM_ORINFO|TE
75a0: 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20  RM_ANDINFO))==0 
75b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
75c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  pr->op==TK_OR );
75d0: 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  .  pTerm->u.pOrI
75e0: 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20  nfo = pOrInfo = 
75f0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7600: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
7610: 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28  pOrInfo));.  if(
7620: 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65   pOrInfo==0 ) re
7630: 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  turn;.  pTerm->w
7640: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
7650: 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d  RINFO;.  pOrWc =
7660: 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20   &pOrInfo->wc;. 
7670: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
7680: 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b  (pOrWc, pWInfo);
7690: 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f  .  whereSplit(pO
76a0: 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  rWc, pExpr, TK_O
76b0: 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a  R);.  exprAnalyz
76c0: 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63  eAll(pSrc, pOrWc
76d0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
76e0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
76f0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  rn;.  assert( pO
7700: 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b  rWc->nTerm>=2 );
7710: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70  ..  /*.  ** Comp
7720: 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74  ute the set of t
7730: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
7740: 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31   satisfy cases 1
7750: 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e   or 2..  */.  in
7760: 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d  dexable = ~(Bitm
7770: 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49  ask)0;.  chngToI
7780: 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  N = ~(Bitmask)0;
7790: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
77a0: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
77b0: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
77c0: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
77d0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
77e0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
77f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7800: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
7810: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
7820: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
7830: 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65    assert( (pOrTe
7840: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
7850: 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d  ERM_ANDINFO|TERM
7860: 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  _ORINFO))==0 );.
7870: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
7880: 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e   0;.      pAndIn
7890: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
78a0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
78b0: 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a  of(*pAndInfo));.
78c0: 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e        if( pAndIn
78d0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  fo ){.        Wh
78e0: 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57  ereClause *pAndW
78f0: 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  C;.        Where
7900: 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a  Term *pAndTerm;.
7910: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
7920: 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
7930: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
7940: 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
7950: 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20  o = pAndInfo;.  
7960: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
7970: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41  tFlags |= TERM_A
7980: 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20  NDINFO;.        
7990: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
79a0: 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20  or = WO_AND;.   
79b0: 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70       pAndWC = &p
79c0: 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
79d0: 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65       whereClause
79e0: 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43  Init(pAndWC, pWC
79f0: 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  ->pWInfo);.     
7a00: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41     whereSplit(pA
7a10: 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  ndWC, pOrTerm->p
7a20: 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  Expr, TK_AND);. 
7a30: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
7a40: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64  zeAll(pSrc, pAnd
7a50: 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  WC);.        pAn
7a60: 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57  dWC->pOuter = pW
7a70: 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  C;.        testc
7a80: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
7a90: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
7aa0: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
7ab0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
7ac0: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
7ad0: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
7ae0: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
7af0: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
7b00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
7b10: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
7b20: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
7b30: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
7b40: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
7b50: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
7b60: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
7b70: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
7b80: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54  >sMaskSet, pAndT
7b90: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
7ba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
7bb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e      }.        in
7bd0: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
7be0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
7bf0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
7c00: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
7c10: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ED ){.      /* S
7c20: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f  kip this term fo
7c30: 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73  r now.  We revis
7c40: 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70 72  it it when we pr
7c50: 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20 20  ocess the.      
7c60: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
7c70: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65   TERM_VIRTUAL te
7c80: 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  rm */.    }else{
7c90: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62  .      Bitmask b
7ca0: 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d  ;.      b = getM
7cb0: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
7cc0: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
7cd0: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
7ce0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
7cf0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
7d00: 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20  IRTUAL ){.      
7d10: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
7d20: 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  her = &pOrWc->a[
7d30: 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  pOrTerm->iParent
7d40: 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20  ];.        b |= 
7d50: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
7d60: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65  >sMaskSet, pOthe
7d70: 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  r->leftCursor);.
7d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
7d90: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
7da0: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
7db0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7dc0: 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)==0 ){.     
7dd0: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
7de0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7df0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26        chngToIN &
7e00: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
7e10: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
7e20: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74  * Record the set
7e30: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
7e40: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
7e50: 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62   The set might b
7e60: 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20  e.  ** empty..  
7e70: 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e  */.  pOrInfo->in
7e80: 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61  dexable = indexa
7e90: 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f  ble;.  pTerm->eO
7ea0: 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61  perator = indexa
7eb0: 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f  ble==0 ? 0 : WO_
7ec0: 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63  OR;..  /*.  ** c
7ed0: 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20  hngToIN holds a 
7ee0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7ef0: 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73  at *might* satis
7f00: 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a  fy case 1.  But.
7f10: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
7f20: 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  do some addition
7f30: 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  al checking to s
7f40: 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61  ee if case 1 rea
7f50: 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69  lly.  ** is sati
7f60: 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sfied..  **.  **
7f70: 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68   chngToIN will h
7f80: 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c  old either 0, 1,
7f90: 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65   or 2 bits.  The
7fa0: 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e   0-bit case mean
7fb0: 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72  s.  ** that ther
7fc0: 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c  e is no possibil
7fd0: 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ity of transform
7fe0: 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73  ing the OR claus
7ff0: 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49  e into an.  ** I
8000: 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75  N operator becau
8010: 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  se one or more t
8020: 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63  erms in the OR c
8030: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20  lause contain.  
8040: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ** something oth
8050: 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20  er than == on a 
8060: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69  column in the si
8070: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
8080: 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65   1-bit.  ** case
8090: 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72   means that ever
80a0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
80b0: 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68   clause is of th
80c0: 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62  e form.  ** "tab
80d0: 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20  le.column=expr" 
80e0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
80f0: 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20  table.  The one 
8100: 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a  bit that is set.
8110: 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73    ** will corres
8120: 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d  pond to the comm
8130: 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74  on table.  We st
8140: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63  ill need to chec
8150: 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  k to make.  ** s
8160: 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ure the same col
8170: 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61  umn is used on a
8180: 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32  ll terms.  The 2
8190: 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65  -bit case is whe
81a0: 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74  n.  ** the all t
81b0: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
81c0: 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c  form "table1.col
81d0: 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d  umn=table2.colum
81e0: 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67  n".  It.  ** mig
81f0: 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ht be possible t
8200: 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65  o form an IN ope
8210: 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65  rator with eithe
8220: 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a  r table1.column.
8230: 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63    ** or table2.c
8240: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53  olumn as the LHS
8250: 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f   if either is co
8260: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
8270: 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f  rm of.  ** the O
8280: 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  R clause..  **. 
8290: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65   ** Note that te
82a0: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
82b0: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74  "table.column1=t
82c0: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74  able.column2" (t
82d0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
82e0: 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73  le on both sizes
82f0: 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e   of the ==) cann
8300: 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e  ot be optimized.
8310: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67  .  */.  if( chng
8320: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ToIN ){.    int 
8330: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8340: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
8350: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
8360: 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a  to IN is valid *
8370: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  /.    int iColum
8380: 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  n = -1;         
8390: 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  /* Column index 
83a0: 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65  on lhs of IN ope
83b0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  rator */.    int
83c0: 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20   iCursor = -1;  
83d0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
83e0: 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f  cursor common to
83f0: 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20   all terms */.  
8400: 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20    int j = 0;    
8410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8420: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
8430: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
8440: 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  r a table and co
8450: 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72  lumn that appear
8460: 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72  s on one side or
8470: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
8480: 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72  r of the == oper
8490: 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75  ator in every su
84a0: 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62  bterm.  That tab
84b0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20  le and column.  
84c0: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63    ** will be rec
84d0: 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72  orded in iCursor
84e0: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54   and iColumn.  T
84f0: 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  here might not b
8500: 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  e any.    ** suc
8510: 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  h table and colu
8520: 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e  mn.  Set okToChn
8530: 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72  gToIN if an appr
8540: 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20  opriate table.  
8550: 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20    ** and column 
8560: 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61  is found but lea
8570: 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  ve okToChngToIN 
8580: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75  false if not fou
8590: 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  nd..    */.    f
85a0: 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21  or(j=0; j<2 && !
85b0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b  okToChngToIN; j+
85c0: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72  +){.      pOrTer
85d0: 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20  m = pOrWc->a;.  
85e0: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
85f0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
8600: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
8610: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8620: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
8630: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
8640: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8650: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
8660: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
8670: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
8680: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
8690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
86a0: 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d 62   This is the 2-b
86b0: 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20 61  it case and we a
86c0: 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  re on the second
86d0: 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20   iteration and. 
86e0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
86f0: 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d  ent term is from
8700: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
8710: 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74  tion.  So skip t
8720: 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  his term. */.   
8730: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
8740: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
8750: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8770: 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74   (chngToIN & get
8780: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
8790: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
87a0: 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30  >leftCursor))==0
87b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
87c0: 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20   This term must 
87d0: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74  be of the form t
87e0: 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20  1.a==t2.b where 
87f0: 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20  t2 is in the.   
8800: 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f         ** chngTo
8810: 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73  IN set but t1 is
8820: 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d   not.  This term
8830: 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20   will be either 
8840: 70 72 65 63 65 64 65 64 0a 20 20 20 20 20 20 20  preceded.       
8850: 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64     ** or follwed
8860: 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20   by an inverted 
8870: 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61  copy (t2.b==t1.a
8880: 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65  ).  Skip this te
8890: 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rm .          **
88a0: 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76   and use its inv
88b0: 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ersion. */.     
88c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
88d0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
88e0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b  & TERM_COPIED );
88f0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
8900: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
8910: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
8920: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
8930: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8940: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
8950: 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56  RM_COPIED|TERM_V
8960: 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20  IRTUAL) );.     
8970: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8990: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65   iColumn = pOrTe
89a0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
89b0: 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f  ;.        iCurso
89c0: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  r = pOrTerm->lef
89d0: 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  tCursor;.       
89e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
89f0: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b        if( i<0 ){
8a00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  .        /* No c
8a10: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63  andidate table+c
8a20: 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e  olumn was found.
8a30: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
8a40: 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  occur.        **
8a50: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
8a60: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
8a70: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
8a80: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8a90: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
8aa0: 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20  (chngToIN) );.  
8ab0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68        assert( ch
8ac0: 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28  ngToIN==getMask(
8ad0: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
8ae0: 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20  t, iCursor) );. 
8af0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
8b10: 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20  case( j==1 );.. 
8b20: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
8b30: 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74  found a candidat
8b40: 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  e table and colu
8b50: 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  mn.  Check to se
8b60: 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20  e if that.      
8b70: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ** table and col
8b80: 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  umn is common to
8b90: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
8ba0: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a  he OR clause */.
8bb0: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
8bc0: 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f  IN = 1;.      fo
8bd0: 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f  r(; i>=0 && okTo
8be0: 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70  ChngToIN; i--, p
8bf0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
8c00: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
8c10: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8c20: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
8c30: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8c40: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
8c50: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
8c60: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8c70: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
8c80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
8c90: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
8ca0: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
8cb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
8cc0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
8cd0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8ce0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
8cf0: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
8d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
8d10: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
8d20: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
8d30: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
8d40: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
8d50: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
8d60: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
8d70: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
8d80: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
8d90: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
8da0: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
8db0: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
8dc0: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
8dd0: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
8de0: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
8df0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
8e00: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
8e10: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
8e20: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
8e30: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
8e40: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
8e50: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
8e60: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
8e70: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
8e80: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
8e90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
8ea0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8eb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
8ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
8ed0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
8ee0: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
8ef0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8f00: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8f10: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
8f20: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
8f30: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
8f40: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
8f50: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
8f60: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
8f70: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
8f80: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
8f90: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
8fa0: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
8fb0: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
8fc0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
8fd0: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
8fe0: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
8ff0: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
9000: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
9010: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
9020: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
9030: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
9040: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
9050: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
9060: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
9070: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
9080: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
9090: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
90a0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
90b0: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
90c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
90d0: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
90e0: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
90f0: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
9100: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
9110: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
9120: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
9130: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
9140: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9150: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
9160: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
9170: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
9180: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
9190: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
91a0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  rt( pOrTerm->lef
91b0: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
91c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
91d0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  rt( pOrTerm->u.l
91e0: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
91f0: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  mn );.        pD
9200: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
9210: 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d  Dup(db, pOrTerm-
9220: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
9230: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  0);.        pLis
9240: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
9250: 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66 6f  istAppend(pWInfo
9260: 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  ->pParse, pList,
9270: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
9280: 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d  pLeft = pOrTerm-
9290: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  >pExpr->pLeft;. 
92a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
92b0: 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b  ert( pLeft!=0 );
92c0: 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71  .      pDup = sq
92d0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
92e0: 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
92f0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
9300: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
9310: 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29  _IN, pDup, 0, 0)
9320: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
9330: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
9340: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
9350: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
9360: 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72  ings(pNew, pExpr
9370: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9380: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9390: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
93a0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
93b0: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74     pNew->x.pList
93c0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
93d0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
93e0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
93f0: 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52  , pNew, TERM_VIR
9400: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
9410: 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  C);.        test
9420: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
9430: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
9440: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
9450: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
9460: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
9470: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
9480: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43       markTermAsC
9490: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77  hild(pWC, idxNew
94a0: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
94b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
94c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
94d0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
94e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
94f0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
9500: 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a  r = WO_NOOP;  /*
9510: 20 63 61 73 65 20 31 20 74 72 75 6d 70 73 20 63   case 1 trumps c
9520: 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  ase 2 */.    }. 
9530: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
9540: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
9550: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21  PTIMIZATION && !
9560: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
9570: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
9580: 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  he input to this
9590: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57   routine is an W
95a0: 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74 75  hereTerm structu
95b0: 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65  re with only the
95c0: 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c  .** "pExpr" fiel
95d0: 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68  d filled in.  Th
95e0: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
95f0: 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c  utine is to anal
9600: 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78  yze the.** subex
9610: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70  pression and pop
9620: 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74  ulate all the ot
9630: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68  her fields of th
9640: 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73  e WhereTerm.** s
9650: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
9660: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9670: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
9680: 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22   "<expr> <op> X"
9690: 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65   it gets commute
96a0: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e  d.** to the stan
96b0: 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20  dard form of "X 
96c0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a  <op> <expr>"..**
96d0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
96e0: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
96f0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
9700: 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64  where both X and
9710: 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   Y are.** column
9720: 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  s, then the orig
9730: 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  inal expression 
9740: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
9750: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
9760: 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  * term of the fo
9770: 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73  rm "Y <op> X" is
9780: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57 48   added to the WH
9790: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a  ERE clause and.*
97a0: 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72  * analyzed separ
97b0: 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72 69 67  ately.  The orig
97c0: 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d 61 72  inal term is mar
97d0: 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 43 4f  ked with TERM_CO
97e0: 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20  PIED.** and the 
97f0: 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61 72 6b  new term is mark
9800: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44 59 4e  ed with TERM_DYN
9810: 41 4d 49 43 20 28 62 65 63 61 75 73 65 20 69 74  AMIC (because it
9820: 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64  's pExpr.** need
9830: 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 69  s to be freed wi
9840: 74 68 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  th the WhereClau
9850: 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56 49 52  se) and TERM_VIR
9860: 54 55 41 4c 20 28 62 65 63 61 75 73 65 20 69 74  TUAL (because it
9870: 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74 65  .** is a commute
9880: 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72 69 6f  d copy of a prio
9890: 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20 6f 72  r term.)  The or
98a0: 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61 73 20  iginal term has 
98b0: 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20  nChild=1.** and 
98c0: 74 68 65 20 63 6f 70 79 20 68 61 73 20 69 64 78  the copy has idx
98d0: 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20 74 68  Parent set to th
98e0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6f  e index of the o
98f0: 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f  riginal term..*/
9900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9910: 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c  rAnalyze(.  SrcL
9920: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
9930: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
9940: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
9950: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
9960: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
9970: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
9980: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
9990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
99a0: 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20  dex of the term 
99b0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
99c0: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
99d0: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
99e0: 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45 52 45  pWInfo; /* WHERE
99f0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
9a00: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9a10: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
9a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a30: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20   /* The term to 
9a40: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
9a50: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
9a60: 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20  MaskSet;        
9a70: 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c    /* Set of tabl
9a80: 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f  e index masks */
9a90: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20  .  Expr *pExpr; 
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
9ac0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c  ssion to be anal
9ad0: 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73  yzed */.  Bitmas
9ae0: 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20  k prereqLeft;   
9af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9b00: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74  erequesites of t
9b10: 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  he pExpr->pLeft 
9b20: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
9b30: 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  reqAll;         
9b40: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
9b50: 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20  esites of pExpr 
9b60: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
9b70: 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20  raRight = 0;    
9b80: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64        /* Extra d
9b90: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c  ependencies on L
9ba0: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78  EFT JOIN */.  Ex
9bb0: 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20  pr *pStr1 = 0;  
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9bd0: 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * RHS of LIKE/GL
9be0: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
9bf0: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20   int isComplete 
9c00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9c10: 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45    /* RHS of LIKE
9c20: 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20  /GLOB ends with 
9c30: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e  wildcard */.  in
9c40: 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20  t noCase = 0;   
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c60: 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74  * LIKE/GLOB dist
9c70: 69 6e 67 75 69 73 68 65 73 20 63 61 73 65 20 2a  inguishes case *
9c80: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ca0: 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65       /* Top-leve
9cb0: 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78  l operator.  pEx
9cc0: 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73  pr->op */.  Pars
9cd0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
9ce0: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20  fo->pParse;  /* 
9cf0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9d00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
9d10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
9d20: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9d30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9d40: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
9d50: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
9d60: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65  eturn;.  }.  pTe
9d70: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
9d80: 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65  Term];.  pMaskSe
9d90: 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
9da0: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
9db0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
9dc0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
9dd0: 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78  op!=TK_AS && pEx
9de0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41  pr->op!=TK_COLLA
9df0: 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65  TE );.  prereqLe
9e00: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
9e10: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9e20: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
9e30: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
9e40: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
9e50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
9e60: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
9e70: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
9e80: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9e90: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
9ea0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9eb0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9ec0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
9ed0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
9ee0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
9ef0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9f00: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9f10: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
9f20: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9f30: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
9f40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
9f50: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
9f60: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
9f70: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
9f80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9f90: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
9fa0: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
9fb0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
9fc0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
9fd0: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
9fe0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
9ff0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
a000: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a010: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a020: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
a030: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
a040: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
a050: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
a060: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
a070: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
a080: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
a090: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
a0a0: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
a0b0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
a0c0: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
a0d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
a0e0: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
a0f0: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
a100: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
a110: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
a120: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
a130: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
a140: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
a150: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
a160: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
a170: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
a180: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b  allowedOp(op) ){
a190: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
a1a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
a1b0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
a1c0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70  >pLeft);.    Exp
a1d0: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
a1e0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
a1f0: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
a200: 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73  );.    u16 opMas
a210: 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  k = (pTerm->prer
a220: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
a230: 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c  Left)==0 ? WO_AL
a240: 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  L : WO_EQUIV;.  
a250: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
a260: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
a270: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
a280: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
a290: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
a2a0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
a2b0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
a2c0: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
a2d0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
a2e0: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f  atorMask(op) & o
a2f0: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  pMask;.    }.   
a300: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
a310: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
a320: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
a330: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
a340: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
a350: 0a 20 20 20 20 20 20 75 31 36 20 65 45 78 74 72  .      u16 eExtr
a360: 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aOp = 0;        
a370: 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20 66 6f  /* Extra bits fo
a380: 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f  r pNew->eOperato
a390: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
a3a0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
a3b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
a3c0: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
a3d0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
a3e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
a3f0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
a400: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
a410: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
a420: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a430: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
a440: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
a450: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a460: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
a470: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
a480: 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49  C, pDup, TERM_VI
a490: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
a4a0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IC);.        if(
a4b0: 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74   idxNew==0 ) ret
a4c0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
a4d0: 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  w = &pWC->a[idxN
a4e0: 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61 72  ew];.        mar
a4f0: 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43  kTermAsChild(pWC
a500: 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72  , idxNew, idxTer
a510: 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  m);.        pTer
a520: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
a530: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  erm];.        pT
a540: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
a550: 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20  TERM_COPIED;.   
a560: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
a570: 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20  op==TK_EQ.      
a580: 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
a590: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
a5a0: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
a5b0: 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
a5c0: 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
a5d0: 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65  QLITE_Transitive
a5e0: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
a5f0: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f         pTerm->eO
a600: 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51  perator |= WO_EQ
a610: 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20 20 65  UIV;.          e
a620: 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55  ExtraOp = WO_EQU
a630: 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  IV;.        }.  
a640: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a650: 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b     pDup = pExpr;
a660: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
a670: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
a680: 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65       exprCommute
a690: 28 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a  (pParse, pDup);.
a6a0: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
a6b0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
a6c0: 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c 65 66 74  late(pDup->pLeft
a6d0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c  );.      pNew->l
a6e0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
a6f0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
a700: 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c   pNew->u.leftCol
a710: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
a720: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65 73 74  lumn;.      test
a730: 63 61 73 65 28 20 28 70 72 65 72 65 71 4c 65 66  case( (prereqLef
a740: 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 29 20  t | extraRight) 
a750: 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20 29 3b  != prereqLeft );
a760: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
a770: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
a780: 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67  qLeft | extraRig
a790: 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ht;.      pNew->
a7a0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
a7b0: 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65  eqAll;.      pNe
a7c0: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 28  w->eOperator = (
a7d0: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75  operatorMask(pDu
a7e0: 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72 61 4f  p->op) + eExtraO
a7f0: 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20  p) & opMask;.   
a800: 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20   }.  }..#ifndef 
a810: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
a820: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
a830: 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20  .  /* If a term 
a840: 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f  is the BETWEEN o
a850: 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20  perator, create 
a860: 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20  two new virtual 
a870: 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  terms.  ** that 
a880: 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65  define the range
a890: 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45   that the BETWEE
a8a0: 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46  N implements.  F
a8b0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
a8c0: 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54  .  **      a BET
a8d0: 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a  WEEN b AND c.  *
a8e0: 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72  *.  ** is conver
a8f0: 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  ted into:.  **. 
a900: 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54 57   **      (a BETW
a910: 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44  EEN b AND c) AND
a920: 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d   (a>=b) AND (a<=
a930: 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  c).  **.  ** The
a940: 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61   two new terms a
a950: 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  re added onto th
a960: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65  e end of the Whe
a970: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e  reClause object.
a980: 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65  .  ** The new te
a990: 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63  rms are "dynamic
a9a0: 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72  " and are childr
a9b0: 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  en of the origin
a9c0: 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20  al BETWEEN.  ** 
a9d0: 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e  term.  That mean
a9e0: 73 20 74 68 61 74 20 69 66 20 74 68 65 20 42 45  s that if the BE
a9f0: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f  TWEEN term is co
aa00: 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65  ded, the childre
aa10: 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70  n are.  ** skipp
aa20: 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20  ed.  Or, if the 
aa30: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74  children are sat
aa40: 69 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64  isfied by an ind
aa50: 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ex, the original
aa60: 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65  .  ** BETWEEN te
aa70: 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  rm is skipped.. 
aa80: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
aa90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54  Expr->op==TK_BET
aaa0: 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d  WEEN && pWC->op=
aab0: 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45  =TK_AND ){.    E
aac0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
aad0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
aae0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
aaf0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
ab00: 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20  ops[] = {TK_GE, 
ab10: 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65  TK_LE};.    asse
ab20: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
ab30: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
ab40: 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20  t->nExpr==2 );. 
ab50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
ab60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
ab70: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
ab80: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
ab90: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
aba0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
abb0: 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20  rse, ops[i], .  
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
abe0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
abf0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a  xpr->pLeft, 0),.
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ac20: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ac30: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
ac40: 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20  r, 0), 0);.     
ac50: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
ac60: 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72 2c 20  kings(pNewExpr, 
ac70: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 64  pExpr);.      id
ac80: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
ac90: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
aca0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
acb0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
acc0: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
acd0: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
ace0: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
acf0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
ad00: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
ad10: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
ad20: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 6d 61 72  Term];.      mar
ad30: 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43  kTermAsChild(pWC
ad40: 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72  , idxNew, idxTer
ad50: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  m);.    }.  }.#e
ad60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ad70: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
ad80: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
ad90: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ada0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
adb0: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
adc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
add0: 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e  UBQUERY).  /* An
ade0: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
adf0: 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66  t is composed of
ae00: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62   two or more sub
ae10: 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
ae20: 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70  by.  ** an OR op
ae30: 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65  erator..  */.  e
ae40: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
ae50: 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20  p==TK_OR ){.    
ae60: 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d  assert( pWC->op=
ae70: 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65  =TK_AND );.    e
ae80: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
ae90: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54  (pSrc, pWC, idxT
aea0: 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  erm);.    pTerm 
aeb0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
aec0: 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  m];.  }.#endif /
aed0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
aee0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
aef0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
af00: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
af10: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64  IZATION.  /* Add
af20: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
af30: 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
af40: 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b  h space on a LIK
af50: 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f  E or GLOB.  ** o
af60: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
af70: 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72  ** A like patter
af80: 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78  n of the form "x
af90: 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73   LIKE 'abc%'" is
afa0: 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f   changed into co
afb0: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20  nstraints.  **. 
afc0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d   **          x>=
afd0: 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64  'abc' AND x<'abd
afe0: 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62  ' AND x LIKE 'ab
aff0: 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  c%'.  **.  ** Th
b000: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
b010: 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22   of the prefix "
b020: 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e  abc" is incremen
b030: 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a  ted to form the.
b040: 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e    ** termination
b050: 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22   condition "abd"
b060: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43  ..  */.  if( pWC
b070: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20  ->op==TK_AND .  
b080: 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62   && isLikeOrGlob
b090: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
b0a0: 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c  &pStr1, &isCompl
b0b0: 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20  ete, &noCase).  
b0c0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
b0d0: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53  ft;       /* LHS
b0e0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
b0f0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
b100: 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20  pr *pStr2;      
b110: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72   /* Copy of pStr
b120: 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f  1 - RHS of LIKE/
b130: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
b140: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
b150: 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a  xpr1;.    Expr *
b160: 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69  pNewExpr2;.    i
b170: 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20  nt idxNew1;.    
b180: 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20  int idxNew2;.   
b190: 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e   Token sCollSeqN
b1a0: 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame;  /* Name of
b1b0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
b1c0: 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66  nce */..    pLef
b1d0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
b1e0: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
b1f0: 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69      pStr2 = sqli
b200: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b210: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  Str1, 0);.    if
b220: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
b230: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20  led ){.      u8 
b240: 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a  c, *pC;       /*
b250: 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   Last character 
b260: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
b270: 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20   wildcard */.   
b280: 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53     pC = (u8*)&pS
b290: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71  tr2->u.zToken[sq
b2a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53  lite3Strlen30(pS
b2b0: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31  tr2->u.zToken)-1
b2c0: 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
b2d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
b2e0: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  se ){.        /*
b2f0: 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f   The point is to
b300: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c   increment the l
b310: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
b320: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20  fore the first. 
b330: 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61         ** wildca
b340: 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69  rd.  But if we i
b350: 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68  ncrement '@', th
b360: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20  at will push it 
b370: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
b380: 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72   ** alphabetic r
b390: 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20  ange where case 
b3a0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c  conversions will
b3b0: 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20   mess up the .  
b3c0: 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c        ** inequal
b3d0: 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74  ity.  To avoid t
b3e0: 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  his, make sure t
b3f0: 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66  o also run the f
b400: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c  ull.        ** L
b410: 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69  IKE on all candi
b420: 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  date expressions
b430: 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65   by clearing the
b440: 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67   isComplete flag
b450: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
b460: 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31      if( c=='A'-1
b470: 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   ) isComplete = 
b480: 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73  0;.        c = s
b490: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
b4a0: 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  er[c];.      }. 
b4b0: 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31       *pC = c + 1
b4c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 6f 6c  ;.    }.    sCol
b4d0: 6c 53 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43  lSeqName.z = noC
b4e0: 61 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a  ase ? "NOCASE" :
b4f0: 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 73   "BINARY";.    s
b500: 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d 20  CollSeqName.n = 
b510: 36 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31  6;.    pNewExpr1
b520: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b530: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
b540: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d  .    pNewExpr1 =
b550: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
b560: 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20  arse, TK_GE, .  
b570: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b580: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
b590: 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45  ken(pParse,pNewE
b5a0: 78 70 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e 61  xpr1,&sCollSeqNa
b5b0: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
b5c0: 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 74  pStr1, 0);.    t
b5d0: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
b5e0: 6e 67 73 28 70 4e 65 77 45 78 70 72 31 2c 20 70  ngs(pNewExpr1, p
b5f0: 45 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65  Expr);.    idxNe
b600: 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w1 = whereClause
b610: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
b620: 45 78 70 72 31 2c 20 0a 20 20 20 20 20 20 20 20  Expr1, .        
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b640: 20 20 20 20 20 20 20 20 54 45 52 4d 5f 4c 49 4b          TERM_LIK
b650: 45 4f 50 54 7c 54 45 52 4d 5f 56 49 52 54 55 41  EOPT|TERM_VIRTUA
b660: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
b670: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
b680: 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20  dxNew1==0 );.   
b690: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
b6a0: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29  c, pWC, idxNew1)
b6b0: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
b6c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
b6d0: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
b6e0: 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
b6f0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b700: 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20  rse, TK_LT,.    
b710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b720: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
b730: 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70  n(pParse,pNewExp
b740: 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  r2,&sCollSeqName
b750: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ),.           pS
b760: 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 74 72 61  tr2, 0);.    tra
b770: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
b780: 73 28 70 4e 65 77 45 78 70 72 32 2c 20 70 45 78  s(pNewExpr2, pEx
b790: 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32  pr);.    idxNew2
b7a0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
b7b0: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
b7c0: 70 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pr2,.           
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 20 20 20 20 54 45 52 4d 5f 4c 49 4b 45 4f 50       TERM_LIKEOP
b7f0: 54 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  T|TERM_VIRTUAL|T
b800: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
b810: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
b820: 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew2==0 );.    ex
b830: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
b840: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
b850: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
b860: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
b870: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
b880: 29 7b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72  ){.      markTer
b890: 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64  mAsChild(pWC, id
b8a0: 78 4e 65 77 31 2c 20 69 64 78 54 65 72 6d 29 3b  xNew1, idxTerm);
b8b0: 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41  .      markTermA
b8c0: 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e  sChild(pWC, idxN
b8d0: 65 77 32 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20  ew2, idxTerm);. 
b8e0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
b8f0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
b900: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
b910: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
b920: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
b930: 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61  TABLE.  /* Add a
b940: 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69   WO_MATCH auxili
b950: 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20  ary term to the 
b960: 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69  constraint set i
b970: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
b980: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  nt expression is
b990: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63   of the form:  c
b9a0: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
b9b0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f  ..  ** This info
b9c0: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
b9d0: 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
b9e0: 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a  x methods of.  *
b9f0: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  * virtual tables
ba00: 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75  .  The native qu
ba10: 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f  ery optimizer do
ba20: 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20  es not attempt. 
ba30: 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69   ** to do anythi
ba40: 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75  ng with MATCH fu
ba50: 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
ba60: 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  if( isMatchOfCol
ba70: 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20  umn(pExpr) ){.  
ba80: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
ba90: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
baa0: 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72  *pLeft;.    Wher
bab0: 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
bac0: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65  .    Bitmask pre
bad0: 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65  reqColumn, prere
bae0: 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67  qExpr;..    pRig
baf0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
bb00: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
bb10: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
bb20: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
bb30: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65  ].pExpr;.    pre
bb40: 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61  reqExpr = exprTa
bb50: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
bb60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
bb70: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65  prereqColumn = e
bb80: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
bb90: 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a  askSet, pLeft);.
bba0: 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45      if( (prereqE
bbb0: 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75  xpr & prereqColu
bbc0: 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mn)==0 ){.      
bbd0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
bbe0: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
bbf0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
bc00: 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20  arse, TK_MATCH, 
bc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
bc30: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
bc40: 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c  (db, pRight, 0),
bc50: 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
bc60: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
bc70: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
bc80: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
bc90: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
bca0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bcb0: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
bcc0: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
bcd0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
bce0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bcf0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
bd00: 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20  ereqExpr;.      
bd10: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
bd20: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
bd30: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
bd40: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
bd50: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
bd60: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
bd70: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
bd80: 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20   WO_MATCH;.     
bd90: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64   markTermAsChild
bda0: 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64  (pWC, idxNew, id
bdb0: 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 54  xTerm);.      pT
bdc0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
bdd0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
bde0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
bdf0: 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20  TERM_COPIED;.   
be00: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
be10: 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e  reqAll = pTerm->
be20: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d  prereqAll;.    }
be30: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
be40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
be50: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64  ALTABLE */..#ifd
be60: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
be70: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
be80: 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65    /* When sqlite
be90: 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d  _stat3 histogram
bea0: 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
beb0: 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f  le an operator o
bec0: 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20  f the.  ** form 
bed0: 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  "x IS NOT NULL" 
bee0: 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65  can sometimes be
bef0: 20 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20   evaluated more 
bf00: 65 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a  efficiently.  **
bf10: 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20   as "x>NULL" if 
bf20: 78 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  x is not an INTE
bf30: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
bf40: 20 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61    So construct a
bf50: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  .  ** virtual te
bf60: 72 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e  rm of that form.
bf70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
bf80: 74 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c  that the virtual
bf90: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61   term must be ta
bfa0: 67 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56  gged with TERM_V
bfb0: 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a  NULL.  This.  **
bfc0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20   TERM_VNULL tag 
bfd0: 77 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68  will suppress th
bfe0: 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
bff0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
c000: 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f  g.  ** of the lo
c010: 6f 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65  op.  Without the
c020: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67   TERM_VNULL flag
c030: 2c 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63  , the not-null c
c040: 68 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65  heck at.  ** the
c050: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f   start of the lo
c060: 6f 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20  op will prevent 
c070: 61 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  any results from
c080: 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e   being returned.
c090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
c0a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op==TK_NOTNUL
c0b0: 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  L.   && pExpr->p
c0c0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
c0d0: 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d  UMN.   && pExpr-
c0e0: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e  >pLeft->iColumn>
c0f0: 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
c100: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
c110: 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34 29 0a   SQLITE_Stat34).
c120: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
c130: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70  NewExpr;.    Exp
c140: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
c150: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74  ->pLeft;.    int
c160: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65   idxNew;.    Whe
c170: 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d  reTerm *pNewTerm
c180: 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20  ;..    pNewExpr 
c190: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
c1a0: 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20  Parse, TK_GT,.  
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c1d0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
c1e0: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
c210: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c  (pParse, TK_NULL
c220: 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a  , 0, 0, 0), 0);.
c230: 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68  .    idxNew = wh
c240: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
c250: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20  pWC, pNewExpr,. 
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45 52               TER
c280: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
c290: 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c  YNAMIC|TERM_VNUL
c2a0: 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e  L);.    if( idxN
c2b0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
c2c0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
c2d0: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
c2e0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
c2f0: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ght = 0;.      p
c300: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
c310: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
c320: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
c330: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
c340: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
c350: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
c360: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
c370: 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 6d 61 72  WO_GT;.      mar
c380: 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43  kTermAsChild(pWC
c390: 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72  , idxNew, idxTer
c3a0: 6d 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  m);.      pTerm 
c3b0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
c3c0: 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  m];.      pTerm-
c3d0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
c3e0: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
c3f0: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
c400: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
c410: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
c420: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c430: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
c440: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a  R_STAT4 */..  /*
c450: 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
c460: 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
c470: 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
c480: 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
c490: 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
c4a0: 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
c4b0: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
c4c0: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
c4d0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
c4e0: 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
c4f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c500: 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73  on searches pLis
c510: 74 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74  t for an entry t
c520: 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
c530: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a  iCol-th column.*
c540: 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e  * of index pIdx.
c550: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61  .**.** If such a
c560: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
c570: 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78  found, its index
c580: 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69   in pList->a[] i
c590: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a  s returned. If.*
c5a0: 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20  * no expression 
c5b0: 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20  is found, -1 is 
c5c0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
c5d0: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65  tic int findInde
c5e0: 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  xCol(.  Parse *p
c5f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c600: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
c610: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
c620: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c640: 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   Expression list
c650: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
c660: 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20  int iBase,      
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61  /* Cursor for ta
c690: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
c6a0: 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e  ith pIdx */.  In
c6b0: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c6d0: 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20   Index to match 
c6e0: 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69  column of */.  i
c6f0: 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20  nt iCol         
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c710: 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  * Column of inde
c720: 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  x to match */.){
c730: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
c740: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
c750: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f  pIdx->azColl[iCo
c760: 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  l];..  for(i=0; 
c770: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
c780: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
c790: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
c7a0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74  kipCollate(pList
c7b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
c7c0: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
c7d0: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20  _COLUMN.     && 
c7e0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  p->iColumn==pIdx
c7f0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d  ->aiColumn[iCol]
c800: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62  .     && p->iTab
c810: 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b  le==iBase.    ){
c820: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
c830: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
c840: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
c850: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
c860: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
c870: 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 26   ALWAYS(pColl) &
c880: 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
c890: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
c8a0: 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
c8b0: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20      return i;.  
c8c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c8d0: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
c8e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
c8f0: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
c900: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
c910: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
c920: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
c930: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
c940: 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43  .**.** A DISTINC
c950: 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64  T list is redund
c960: 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62  ant if the datab
c970: 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ase contains som
c980: 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 63  e subset of.** c
c990: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
c9a0: 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e  unique and non-n
c9b0: 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ull..*/.static i
c9c0: 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  nt isDistinctRed
c9d0: 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20  undant(.  Parse 
c9e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
c9f0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
ca00: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
ca10: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
ca20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
ca30: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
ca40: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
ca50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
ca60: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
ca70: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
ca80: 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68  inct       /* Th
ca90: 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 68 61  e result set tha
caa0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49  t needs to be DI
cab0: 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54  STINCT */.){.  T
cac0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
cad0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
cae0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
cb00: 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a  int iBase;..  /*
cb10: 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72   If there is mor
cb20: 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65  e than one table
cb30: 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69   or sub-select i
cb40: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
cb50: 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71  e of.  ** this q
cb60: 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69  uery, then it wi
cb70: 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
cb80: 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20  le to show that 
cb90: 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20  the DISTINCT .  
cba0: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64  ** clause is red
cbb0: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  undant. */.  if(
cbc0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21   pTabList->nSrc!
cbd0: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
cbe0: 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73   iBase = pTabLis
cbf0: 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  t->a[0].iCursor;
cc00: 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69  .  pTab = pTabLi
cc10: 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  st->a[0].pTab;..
cc20: 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    /* If any of t
cc30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
cc40: 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20  s an IPK column 
cc50: 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20  on table iBase, 
cc60: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a  then return .  *
cc70: 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68  * true. Note: Th
cc80: 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  e (p->iTable==iB
cc90: 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69  ase) part of thi
cca0: 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61  s test may be fa
ccb0: 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  lse if the.  ** 
ccc0: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
ccd0: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
cce0: 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  ub-query..  */. 
ccf0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73   for(i=0; i<pDis
cd00: 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  tinct->nExpr; i+
cd10: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
cd20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
cd30: 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e  pCollate(pDistin
cd40: 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  ct->a[i].pExpr);
cd50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
cd60: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e  TK_COLUMN && p->
cd70: 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26  iTable==iBase &&
cd80: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20   p->iColumn<0 ) 
cd90: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
cda0: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
cdb0: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20   all indices on 
cdc0: 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b  the table, check
cdd0: 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65 20  ing each to see 
cde0: 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a  if it makes.  **
cdf0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75   the DISTINCT qu
ce00: 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e  alifier redundan
ce10: 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66  t. It does so if
ce20: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
ce30: 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69 74   The index is it
ce40: 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64  self UNIQUE, and
ce50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
ce60: 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  All of the colum
ce70: 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
ce80: 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74 20  are either part 
ce90: 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63 74  of the pDistinct
cea0: 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c  .  **      list,
ceb0: 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48 45   or else the WHE
cec0: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
ced0: 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  ns a term of the
cee0: 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20   form "col=X",. 
cef0: 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20 58   **      where X
cf00: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76   is a constant v
cf10: 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74  alue. The collat
cf20: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66  ion sequences of
cf30: 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63   the.  **      c
cf40: 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65  omparison and se
cf50: 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73  lect-list expres
cf60: 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68  sions must match
cf70: 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e   those of the in
cf80: 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  dex..  **.  **  
cf90: 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65   3. All of those
cfa0: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66   index columns f
cfb0: 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45  or which the WHE
cfc0: 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  RE clause does n
cfd0: 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e  ot.  **      con
cfe0: 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74  tain a "col=X" t
cff0: 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20  erm are subject 
d000: 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  to a NOT NULL co
d010: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
d020: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
d030: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
d040: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
d050: 0a 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71  .    if( !IsUniq
d060: 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  ueIndex(pIdx) ) 
d070: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
d080: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
d090: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
d0a0: 20 20 20 20 69 31 36 20 69 43 6f 6c 20 3d 20 70      i16 iCol = p
d0b0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
d0c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66  ;.      if( 0==f
d0d0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
d0e0: 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d  se, iCol, ~(Bitm
d0f0: 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49  ask)0, WO_EQ, pI
d100: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  dx) ){.        i
d110: 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e  nt iIdxCol = fin
d120: 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65  dIndexCol(pParse
d130: 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61  , pDistinct, iBa
d140: 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20  se, pIdx, i);.  
d150: 20 20 20 20 20 20 69 66 28 20 69 49 64 78 43 6f        if( iIdxCo
d160: 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f  l<0 || pTab->aCo
d170: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d  l[iCol].notNull=
d180: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
d190: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
d1a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d1b0: 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e     if( i==pIdx->
d1c0: 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nKeyCol ){.     
d1d0: 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
d1e0: 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20  mplies that the 
d1f0: 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
d200: 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  er is redundant.
d210: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
d220: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
d230: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
d240: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
d250: 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  e logarithm of t
d260: 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74  he input value t
d270: 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61  o base 2..*/.sta
d280: 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f  tic LogEst estLo
d290: 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72  g(LogEst N){.  r
d2a0: 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20  eturn N<=10 ? 0 
d2b0: 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  : sqlite3LogEst(
d2c0: 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a  N) - 33;.}../*.*
d2d0: 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66  * Two routines f
d2e0: 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20  or printing the 
d2f0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71  content of an sq
d300: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d310: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
d320: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
d330: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
d340: 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72  nly.  If neither
d350: 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20  .** SQLITE_TEST 
d360: 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  or SQLITE_DEBUG 
d370: 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65  are defined, the
d380: 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  n these routines
d390: 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  .** are no-ops..
d3a0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
d3b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
d3c0: 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
d3d0: 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
d3e0: 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20  ENABLED).static 
d3f0: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49  void TRACE_IDX_I
d400: 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  NPUTS(sqlite3_in
d410: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
d420: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
d430: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
d440: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d450: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
d460: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
d470: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d480: 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e  ntf("  constrain
d490: 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65  t[%d]: col=%d te
d4a0: 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73  rmid=%d op=%d us
d4b0: 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  abled=%d\n",.   
d4c0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
d4d0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d4e0: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
d4f0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d500: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20  ].iTermOffset,. 
d510: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d520: 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20  aint[i].op,.    
d530: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d540: 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20  t[i].usable);.  
d550: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
d560: 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  ->nOrderBy; i++)
d570: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
d580: 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
d590: 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  rby[%d]: col=%d 
d5a0: 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  desc=%d\n",.    
d5b0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
d5c0: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  aOrderBy[i].iCol
d5d0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
d5e0: 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29  OrderBy[i].desc)
d5f0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
d600: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  oid TRACE_IDX_OU
d610: 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  TPUTS(sqlite3_in
d620: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
d630: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
d640: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
d650: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d660: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
d670: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
d680: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d690: 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d  ntf("  usage[%d]
d6a0: 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69  : argvIdx=%d omi
d6b0: 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
d6c0: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
d6d0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
d6e0: 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20  .argvIndex,.    
d6f0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d700: 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b  tUsage[i].omit);
d710: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
d720: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
d730: 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64  Num=%d\n", p->id
d740: 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  xNum);.  sqlite3
d750: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
d760: 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e  dxStr=%s\n", p->
d770: 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
d780: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d790: 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64   orderByConsumed
d7a0: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72  =%d\n", p->order
d7b0: 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73  ByConsumed);.  s
d7c0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d7d0: 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f  f("  estimatedCo
d7e0: 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74  st=%g\n", p->est
d7f0: 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73  imatedCost);.  s
d800: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d810: 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f  f("  estimatedRo
d820: 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65  ws=%lld\n", p->e
d830: 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d  stimatedRows);.}
d840: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54  .#else.#define T
d850: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
d860: 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  A).#define TRACE
d870: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a  _IDX_OUTPUTS(A).
d880: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
d890: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d8a0: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
d8b0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
d8c0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
d8d0: 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20  e term pTerm is 
d8e0: 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20  of a form where 
d8f0: 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75  it.** could be u
d900: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
d910: 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63  x to access pSrc
d920: 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70  , assuming an ap
d930: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64  propriate.** ind
d940: 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73  ex existed..*/.s
d950: 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61  tatic int termCa
d960: 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57  nDriveIndex(.  W
d970: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d990: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
d9a0: 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  rm to check */. 
d9b0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
d9c0: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
d9d0: 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20  /* Table we are 
d9e0: 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73  trying to access
d9f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
da00: 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20  tReady          
da10: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69       /* Tables i
da20: 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66  n outer loops of
da30: 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a   the join */.){.
da40: 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66    char aff;.  if
da50: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
da60: 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  sor!=pSrc->iCurs
da70: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  or ) return 0;. 
da80: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
da90: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d  erator & WO_EQ)=
daa0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
dab0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
dac0: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
dad0: 61 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ady)!=0 ) return
dae0: 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d   0;.  if( pTerm-
daf0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20  >u.leftColumn<0 
db00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66  ) return 0;.  af
db10: 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  f = pSrc->pTab->
db20: 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65  aCol[pTerm->u.le
db30: 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  ftColumn].affini
db40: 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  ty;.  if( !sqlit
db50: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
db60: 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  k(pTerm->pExpr, 
db70: 61 66 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b  aff) ) return 0;
db80: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
db90: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
dba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
dbb0: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
dbc0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
dbd0: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
dbe0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   Index object fo
dbf0: 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  r an automatic i
dc00: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73  ndex.** and to s
dc10: 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c  et up the WhereL
dc20: 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76  evel object pLev
dc30: 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  el so that the c
dc40: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
dc50: 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68   makes use of th
dc60: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
dc70: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
dc80: 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d  d constructAutom
dc90: 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72  aticIndex(.  Par
dca0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
dcb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dcc0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
dcd0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
dce0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
dcf0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
dd00: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
dd10: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
dd20: 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
dd30: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
dd40: 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e   get the next in
dd50: 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  dex */.  Bitmask
dd60: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
dd70: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
dd80: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
dd90: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
dda0: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
ddb0: 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20  pLevel          
ddc0: 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64  /* Write new ind
ddd0: 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ex here */.){.  
dde0: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
de00: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
de10: 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63   in the construc
de20: 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57  ted index */.  W
de30: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
de40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
de50: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
de60: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
de70: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
de80: 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20  pWCEnd;         
de90: 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
dea0: 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  a[] */.  Index *
deb0: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
dec0: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64       /* Object d
ded0: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72  escribing the tr
dee0: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
def0: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df10: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
df20: 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
df30: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
df40: 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20   addrInit;      
df50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
df60: 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69  ess of the initi
df70: 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73  alization bypass
df80: 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65   jump */.  Table
df90: 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
dfa0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
dfb0: 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
dfc0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  d */.  int addrT
dfd0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
dfe0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
dff0: 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70   index fill loop
e000: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
e010: 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
e020: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
e030: 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72  lding an index r
e040: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
e050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e060: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
e070: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
e080: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
e090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e0a0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
e0b0: 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20  nt mxBitCol;    
e0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
e0d0: 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20  ximum column in 
e0e0: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f  pSrc->colUsed */
e0f0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
e100: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
e110: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
e120: 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c  ence to on a col
e130: 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  umn */.  WhereLo
e140: 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
e150: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70       /* The Loop
e160: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
e170: 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20  r *zNotUsed;    
e180: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
e190: 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65  a space on the e
e1a0: 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20  nd of pIdx */.  
e1b0: 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e1d0: 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
e1e0: 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
e1f0: 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
e200: 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
e210: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
e220: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
e230: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
e240: 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
e250: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
e260: 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
e270: 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20  een issued */.  
e280: 45 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d  Expr *pPartial =
e290: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50   0;         /* P
e2a0: 61 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70  artial Index Exp
e2b0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
e2c0: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20   iContinue = 0; 
e2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
e2e0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78   here to skip ex
e2f0: 63 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 0a  cluded rows */..
e300: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
e310: 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20  de to skip over 
e320: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64  the creation and
e330: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
e340: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  of the.  ** tran
e350: 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32  sient index on 2
e360: 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
e370: 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20  t iterations of 
e380: 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76  the loop. */.  v
e390: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
e3a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
e3b0: 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d   );.  addrInit =
e3c0: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
e3d0: 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
e3e0: 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
e3f0: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
e400: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  r of columns tha
e410: 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  t will be added 
e420: 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  to the index.  *
e430: 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  * and used to ma
e440: 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  tch WHERE clause
e450: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
e460: 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
e470: 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e   pTable = pSrc->
e480: 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d  pTab;.  pWCEnd =
e490: 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
e4a0: 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  erm];.  pLoop = 
e4b0: 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
e4c0: 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
e4d0: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
e4e0: 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
e4f0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
e500: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
e510: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
e520: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
e530: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
e540: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f  P_FromJoin)    /
e550: 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79 73 20  * prereq always 
e560: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20  non-zero */.    
e570: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69       || pExpr->i
e580: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d  RightJoinTable!=
e590: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20  pSrc->iCursor   
e5a0: 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72 69 67  /*   for the rig
e5b0: 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20  ht-hand   */.   
e5c0: 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e        || pLoop->
e5d0: 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20  prereq!=0 );    
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5f0: 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61   /*   table of a
e600: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20   LEFT JOIN */.  
e610: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65    if( pLoop->pre
e620: 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  req==0.     && (
e630: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
e640: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d   TERM_VIRTUAL)==
e650: 30 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48  0.     && !ExprH
e660: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
e670: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
e680: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
e690: 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
e6a0: 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69  t(pExpr, pSrc->i
e6b0: 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20  Cursor) ){.     
e6c0: 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69   pPartial = sqli
e6d0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
e6e0: 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c  e->db, pPartial,
e6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
e720: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
e730: 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20  r, 0));.    }.  
e740: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
e750: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
e760: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
e770: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
e780: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
e790: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
e7a0: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
e7b0: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
e7c0: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
e7d0: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
e7e0: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
e7f0: 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BMS );.      tes
e800: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
e810: 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1 );.      if( 
e820: 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a  !sentWarning ){.
e830: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e840: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
e850: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20  NG_AUTOINDEX,.  
e860: 20 20 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d            "autom
e870: 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73  atic index on %s
e880: 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  (%s)", pTable->z
e890: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
e8a0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69    pTable->aCol[i
e8b0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col].zName);.   
e8c0: 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67       sentWarning
e8d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
e8e0: 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73      if( (idxCols
e8f0: 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   & cMask)==0 ){.
e900: 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72          if( wher
e910: 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72  eLoopResize(pPar
e920: 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e  se->db, pLoop, n
e930: 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20  KeyCol+1) ){.   
e940: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
e950: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
e960: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
e970: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65       pLoop->aLTe
e980: 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20  rm[nKeyCol++] = 
e990: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
e9a0: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
e9b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e9c0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65   }.  assert( nKe
e9d0: 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f  yCol>0 );.  pLoo
e9e0: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
e9f0: 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
ea00: 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f   nKeyCol;.  pLoo
ea10: 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
ea20: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57  RE_COLUMN_EQ | W
ea30: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
ea40: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20  WHERE_INDEXED.  
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea60: 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f     | WHERE_AUTO_
ea70: 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75  INDEX;..  /* Cou
ea80: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
ea90: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
eaa0: 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72  mns needed to cr
eab0: 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65  eate a.  ** cove
eac0: 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22  ring index.  A "
ead0: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20  covering index" 
eae0: 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  is an index that
eaf0: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20   contains all.  
eb00: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ** columns that 
eb10: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
eb20: 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61  e query.  With a
eb30: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c   covering index,
eb40: 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
eb50: 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e  al table never n
eb60: 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73  eeds to be acces
eb70: 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20  sed.  Automatic 
eb80: 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a  indices must.  *
eb90: 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20  * be a covering 
eba0: 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68  index because th
ebb0: 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74  e index will not
ebc0: 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74   be updated if t
ebd0: 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
ebe0: 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61   table changes a
ebf0: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  nd the index and
ec00: 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f   table cannot bo
ec10: 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20  th be used.  ** 
ec20: 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f  if they go out o
ec30: 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65  f sync..  */.  e
ec40: 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d  xtraCols = pSrc-
ec50: 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78  >colUsed & (~idx
ec60: 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42  Cols | MASKBIT(B
ec70: 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43  MS-1));.  mxBitC
ec80: 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70  ol = MIN(BMS-1,p
ec90: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20  Table->nCol);.  
eca0: 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
ecb0: 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
ecc0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
ecd0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32  ble->nCol==BMS-2
ece0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
ecf0: 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
ed00: 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
ed10: 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
ed20: 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d  ) nKeyCol++;.  }
ed30: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
ed40: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
ed50: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65  MS-1) ){.    nKe
ed60: 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e  yCol += pTable->
ed70: 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a  nCol - BMS + 1;.
ed80: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72    }..  /* Constr
ed90: 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
eda0: 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65  ject to describe
edb0: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20   this index */. 
edc0: 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41   pIdx = sqlite3A
edd0: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
ede0: 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  ct(pParse->db, n
edf0: 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e  KeyCol+1, 0, &zN
ee00: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70  otUsed);.  if( p
ee10: 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e  Idx==0 ) goto en
ee20: 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65  d_auto_index_cre
ee30: 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  ate;.  pLoop->u.
ee40: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
ee50: 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61  Idx;.  pIdx->zNa
ee60: 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78  me = "auto-index
ee70: 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c  ";.  pIdx->pTabl
ee80: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20  e = pTable;.  n 
ee90: 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  = 0;.  idxCols =
eea0: 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
eeb0: 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
eec0: 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
eed0: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
eee0: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
eef0: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
ef00: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
ef10: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
ef20: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
ef30: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
ef40: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
ef50: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
ef60: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
ef70: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
ef80: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
ef90: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
efa0: 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66  =BMS );.      if
efb0: 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
efc0: 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
efd0: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
efe0: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
eff0: 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
f000: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ask;.        pId
f010: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
f020: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
f030: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  lumn;.        pC
f040: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
f050: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
f060: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
f070: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
f080: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
f090: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41  azColl[n] = ALWA
f0a0: 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c  YS(pColl) ? pCol
f0b0: 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41  l->zName : "BINA
f0c0: 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  RY";.        n++
f0d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f0e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75    }.  assert( (u
f0f0: 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  32)n==pLoop->u.b
f100: 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f  tree.nEq );..  /
f110: 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c  * Add additional
f120: 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
f130: 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f  to make the auto
f140: 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f  matic index into
f150: 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67  .  ** a covering
f160: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28   index */.  for(
f170: 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
f180: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
f190: 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42  xtraCols & MASKB
f1a0: 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70  IT(i) ){.      p
f1b0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
f1c0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
f1d0: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
f1e0: 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
f1f0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
f200: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
f210: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
f220: 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42  ) ){.    for(i=B
f230: 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  MS-1; i<pTable->
f240: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
f250: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
f260: 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
f270: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
f280: 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
f290: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
f2a0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65    assert( n==nKe
f2b0: 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e  yCol );.  pIdx->
f2c0: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31  aiColumn[n] = -1
f2d0: 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
f2e0: 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
f2f0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
f300: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
f310: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c   */.  assert( pL
f320: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
f330: 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49   );.  pLevel->iI
f340: 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
f350: 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
f360: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f370: 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c  P_OpenAutoindex,
f380: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
f390: 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20  , nKeyCol+1);.  
f3a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
f3b0: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
f3c0: 70 49 64 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d  pIdx);.  VdbeCom
f3d0: 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73  ment((v, "for %s
f3e0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
f3f0: 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74  ));..  /* Fill t
f400: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
f410: 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20  ex with content 
f420: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
f430: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
f440: 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  );.  addrTop = s
f450: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f460: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
f470: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
f480: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f490: 3b 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c  ;.  if( pPartial
f4a0: 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e 75   ){.    iContinu
f4b0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
f4c0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f4d0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
f4e0: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61 72  lse(pParse, pPar
f4f0: 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  tial, iContinue,
f500: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
f510: 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  LL);.    pLoop->
f520: 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
f530: 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d  _PARTIALIDX;.  }
f540: 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
f550: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
f560: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
f570: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
f580: 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  Key(pParse, pIdx
f590: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
f5a0: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 2c  r, regRecord, 0,
f5b0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   0, 0, 0);.  sql
f5c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f5d0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
f5e0: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
f5f0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
f600: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
f610: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
f620: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69  SEEKRESULT);.  i
f630: 66 28 20 70 50 61 72 74 69 61 6c 20 29 20 73 71  f( pPartial ) sq
f640: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
f650: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
f660: 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
f670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
f680: 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
f690: 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
f6a0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
f6b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f6c0: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
f6d0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
f6e0: 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69  TOINDEX);.  sqli
f6f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f700: 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
f710: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
f720: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
f730: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
f740: 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
f750: 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20  Parse);.  .  /* 
f760: 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73  Jump here when s
f770: 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
f780: 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
f790: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f7a0: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29  ere(v, addrInit)
f7b0: 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  ;..end_auto_inde
f7c0: 78 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69  x_create:.  sqli
f7d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
f7e0: 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69  arse->db, pParti
f7f0: 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  al);.}.#endif /*
f800: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f810: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
f820: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f830: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
f840: 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
f850: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
f860: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
f870: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
f880: 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
f890: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
f8a0: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
f8b0: 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
f8c0: 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
f8d0: 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
f8e0: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
f8f0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
f900: 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
f910: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
f920: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
f930: 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
f940: 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
f950: 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
f960: 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72  ause *pWC,.  str
f970: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
f980: 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69   *pSrc,.  ExprLi
f990: 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a  st *pOrderBy.){.
f9a0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
f9b0: 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
f9c0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
f9d0: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
f9e0: 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
f9f0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
fa00: 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
fa10: 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
fa20: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
fa30: 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
fa40: 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
fa50: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
fa60: 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
fa70: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
fa80: 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f  dxInfo;..  /* Co
fa90: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
faa0: 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45  f possible WHERE
fab0: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
fac0: 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20  nts referring.  
fad0: 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75  ** to this virtu
fae0: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  al table */.  fo
faf0: 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
fb00: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
fb10: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
fb20: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
fb30: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
fb40: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
fb50: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
fb60: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
fb70: 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
fb80: 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
fb90: 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
fba0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
fbb0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
fbc0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
fbd0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
fbe0: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
fbf0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
fc00: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
fc10: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
fc20: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
fc30: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e  rator & ~(WO_ISN
fc40: 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 29 29 3d 3d  ULL|WO_EQUIV))==
fc50: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
fc60: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
fc70: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
fc80: 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
fc90: 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    nTerm++;.  }..
fca0: 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
fcb0: 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
fcc0: 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
fcd0: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
fce0: 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74   .  ** virtual t
fcf0: 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
fd00: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
fd10: 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
fd20: 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
fd30: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
fd40: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ructure..  */.  
fd50: 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
fd60: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
fd70: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64      int n = pOrd
fd80: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
fd90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
fda0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
fdb0: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
fdc0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
fdd0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
fde0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
fdf0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
fe00: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
fe10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fe20: 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20   if( i==n){.    
fe30: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a    nOrderBy = n;.
fe40: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
fe50: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
fe60: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
fe70: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20  structure.  */. 
fe80: 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69   pIdxInfo = sqli
fe90: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
fea0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
feb0: 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20  of(*pIdxInfo).  
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fed0: 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
fee0: 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
fef0: 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
ff00: 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff20: 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
ff30: 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
ff40: 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  y );.  if( pIdxI
ff50: 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nfo==0 ){.    sq
ff60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ff70: 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
ff80: 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75  mory");.    retu
ff90: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
ffa0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
ffb0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
ffc0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
ffd0: 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
ffe0: 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66  ains.  ** many f
fff0: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
10000 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
10010 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
10020 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20  Index from.  ** 
10030 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
10040 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
10050 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
10060 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
10070 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
10080 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  se fields..  */.
10090 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
100a0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
100b0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
100c0 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70  pIdxInfo[1];.  p
100d0 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
100e0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
100f0 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
10100 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
10110 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
10120 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
10130 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
10140 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
10150 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74  rderBy];.  *(int
10160 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
10170 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
10180 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
10190 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
101a0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73   nOrderBy;.  *(s
101b0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
101c0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
101d0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
101e0 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
101f0 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  ns;.  *(struct s
10200 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
10210 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
10220 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
10230 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  xOrderBy;.  *(st
10240 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
10250 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
10260 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
10270 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
10280 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
102d0 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
102e0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
102f0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
10300 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  erm++){.    u8 o
10310 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  p;.    if( pTerm
10320 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
10330 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
10340 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
10350 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
10360 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
10370 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
10380 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
10390 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
103a0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
103b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
103c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
103d0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
103e0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
103f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
10400 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
10410 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
10420 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
10430 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63  O_EQUIV))==0 ) c
10440 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
10450 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
10460 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
10470 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64  ontinue;.    pId
10480 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e  xCons[j].iColumn
10490 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
104a0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
104b0 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  Cons[j].iTermOff
104c0 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20  set = i;.    op 
104d0 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70  = (u8)pTerm->eOp
104e0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b  erator & WO_ALL;
104f0 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f  .    if( op==WO_
10500 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b  IN ) op = WO_EQ;
10510 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
10520 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a  .op = op;.    /*
10530 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
10540 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
10550 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
10560 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
10570 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
10580 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  WO_ and SQLITE_I
10590 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
105a0 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74   codes are ident
105b0 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a  ical.  The.    *
105c0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  * following asse
105d0 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20  rts verify this 
105e0 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  fact. */.    ass
105f0 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
10600 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
10610 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  INT_EQ );.    as
10620 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
10630 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
10640 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61  AINT_LT );.    a
10650 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
10660 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
10670 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
10680 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
10690 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
106a0 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
106b0 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
106c0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
106d0 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
106e0 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54    assert( WO_MAT
106f0 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  CH==SQLITE_INDEX
10700 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
10710 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  H );.    assert(
10720 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
10730 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51  r & (WO_IN|WO_EQ
10740 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
10750 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43  GT|WO_GE|WO_MATC
10760 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20  H) );.    j++;. 
10770 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
10780 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
10790 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
107a0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
107b0 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78  .pExpr;.    pIdx
107c0 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
107d0 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
107e0 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  umn;.    pIdxOrd
107f0 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70  erBy[i].desc = p
10800 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
10810 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
10820 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b  return pIdxInfo;
10830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61  .}../*.** The ta
10840 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72  ble object refer
10850 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74  ence passed as t
10860 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
10870 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
10880 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72  ion.** must repr
10890 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20  esent a virtual 
108a0 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  table. This func
108b0 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  tion invokes the
108c0 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a   xBestIndex().**
108d0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76   method of the v
108e0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74  irtual table wit
108f0 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  h the sqlite3_in
10900 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20  dex_info object 
10910 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e  that.** comes in
10920 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75   as the 3rd argu
10930 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
10940 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
10950 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10960 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c   pParse is popul
10970 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  ated with an err
10980 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61  or message and a
10990 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
109a0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ue is returned. 
109b0 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
109c0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
109d0 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20   output.** part 
109e0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
109f0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
10a00 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75  ure is left popu
10a10 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  lated..**.** Whe
10a20 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65  ther or not an e
10a30 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
10a40 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
10a50 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
10a60 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
10a70 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70  ventually free p
10a80 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e  ->idxStr if p->n
10a90 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
10aa0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61  indicates.** tha
10ab0 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72  t this is requir
10ac0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
10ad0 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  t vtabBestIndex(
10ae0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
10af0 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69  able *pTab, sqli
10b00 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
10b10 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  p){.  sqlite3_vt
10b20 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69  ab *pVtab = sqli
10b30 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61  te3GetVTable(pPa
10b40 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e  rse->db, pTab)->
10b50 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVtab;.  int i;.
10b60 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41    int rc;..  TRA
10b70 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
10b80 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
10b90 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
10ba0 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
10bb0 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
10bc0 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
10bd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10be0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10bf0 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
10c00 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
10c10 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
10c20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56     }else if( !pV
10c30 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
10c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10c50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
10c60 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
10c70 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  r(rc));.    }els
10c80 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
10c90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10ca0 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45   "%s", pVtab->zE
10cb0 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
10cc0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
10cd0 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
10ce0 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
10cf0 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  sg = 0;..  for(i
10d00 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
10d10 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
10d20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61  if( !p->aConstra
10d30 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
10d40 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
10d50 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
10d60 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
10d70 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10d80 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
10d90 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
10da0 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
10db0 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
10dc0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
10dd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
10de0 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  rn pParse->nErr;
10df0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
10e00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10e10 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
10e20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
10e30 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
10e40 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
10e50 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74  timate the locat
10e60 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75  ion of a particu
10e70 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c  lar key among al
10e80 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20  l keys in an.** 
10e90 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68  index.  Store th
10ea0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74  e results in aSt
10eb0 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  at as follows:.*
10ec0 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d  *.**    aStat[0]
10ed0 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
10ee0 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74  r of rows less t
10ef0 68 61 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61  han pVal.**    a
10f00 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74  Stat[1]      Est
10f10 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
10f20 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a   equal to pVal.*
10f30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
10f40 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61 6d  index of the sam
10f50 70 6c 65 20 74 68 61 74 20 69 73 20 74 68 65 20  ple that is the 
10f60 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  smallest sample 
10f70 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  that.** is great
10f80 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
10f90 20 74 6f 20 70 52 65 63 2e 0a 2a 2f 0a 73 74 61   to pRec..*/.sta
10fa0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79  tic int whereKey
10fb0 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
10fc0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
10fd0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
10fe0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
10ff0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11010 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
11020 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
11030 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
11040 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pRec,       /* 
11050 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73  Vector of values
11060 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a   to consider */.
11070 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20    int roundUp,  
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11090 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75   Round up if tru
110a0 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69  e.  Round down i
110b0 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f  f false */.  tRo
110c0 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20  wcnt *aStat     
110d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
110e0 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68   stats written h
110f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
11100 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
11110 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65   = pIdx->aSample
11120 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  ;.  int iCol;   
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75  /* Index of requ
11150 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e  ired stats in an
11160 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69  Eq[] etc. */.  i
11170 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20  nt iMin = 0;    
11180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
11190 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f  allest sample no
111a0 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a  t yet tested */.
111b0 20 20 69 6e 74 20 69 20 3d 20 70 49 64 78 2d 3e    int i = pIdx->
111c0 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 2f 2a  nSample;      /*
111d0 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
111e0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20   larger than or 
111f0 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f  equal to pRec */
11200 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20  .  int iTest;   
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11220 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f  * Next sample to
11230 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72   test */.  int r
11240 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
11250 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11260 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   of comparison o
11270 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  peration */..#if
11280 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
11290 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  G.  UNUSED_PARAM
112a0 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a  ETER( pParse );.
112b0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
112c0 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 69 43   pRec!=0 );.  iC
112d0 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ol = pRec->nFiel
112e0 64 20 2d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  d - 1;.  assert(
112f0 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30   pIdx->nSample>0
11300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
11310 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20  ec->nField>0 && 
11320 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  iCol<pIdx->nSamp
11330 6c 65 43 6f 6c 20 29 3b 0a 20 20 64 6f 7b 0a 20  leCol );.  do{. 
11340 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69 6e     iTest = (iMin
11350 2b 69 29 2f 32 3b 0a 20 20 20 20 72 65 73 20 3d  +i)/2;.    res =
11360 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
11370 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
11380 65 5b 69 54 65 73 74 5d 2e 6e 2c 20 61 53 61 6d  e[iTest].n, aSam
11390 70 6c 65 5b 69 54 65 73 74 5d 2e 70 2c 20 70 52  ple[iTest].p, pR
113a0 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ec);.    if( res
113b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4d 69 6e  <0 ){.      iMin
113c0 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
113d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 20 3d  }else{.      i =
113e0 20 69 54 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20   iTest;.    }.  
113f0 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20 69  }while( res && i
11400 4d 69 6e 3c 69 20 29 3b 0a 0a 23 69 66 64 65 66  Min<i );..#ifdef
11410 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
11420 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
11430 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
11440 74 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ts check that th
11450 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
11460 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20  code.  ** above 
11470 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20  found the right 
11480 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f  answer. This blo
11490 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72  ck serves no pur
114a0 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20  pose other.  ** 
114b0 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74  than to invoke t
114c0 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a  he asserts.  */.
114d0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
114e0 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d      /* If (res==
114f0 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  0) is true, then
11500 20 73 61 6d 70 6c 65 20 24 69 20 6d 75 73 74 20   sample $i must 
11510 62 65 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  be equal to pRec
11520 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11530 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  i<pIdx->nSample 
11540 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  );.    assert( 0
11550 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ==sqlite3VdbeRec
11560 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
11570 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
11580 5b 69 5d 2e 70 2c 20 70 52 65 63 29 0a 20 20 20  [i].p, pRec).   
11590 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
115a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
115b0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
115c0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
115d0 70 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61  pRec must be sma
115e0 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ller than sample
115f0 20 24 69 20 61 6e 64 20 6c 61 72 67 65 72 20 74   $i and larger t
11600 68 61 6e 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c  han.    ** sampl
11610 65 20 28 24 69 2d 31 29 2e 20 20 2a 2f 0a 20 20  e ($i-1).  */.  
11620 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64    assert( i==pId
11630 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  x->nSample .    
11640 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
11650 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
11660 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
11670 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
11680 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  c)>0.         ||
11690 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
116a0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
116b0 20 61 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20   assert( i==0.  
116c0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
116d0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
116e0 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  re(aSample[i-1].
116f0 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  n, aSample[i-1].
11700 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20  p, pRec)<0.     
11710 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
11720 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11730 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
11740 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45   ifdef SQLITE_DE
11750 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20  BUG */..  /* At 
11760 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d  this point, aSam
11770 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69  ple[i] is the fi
11780 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 20  rst sample that 
11790 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  is greater than.
117a0 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f    ** or equal to
117b0 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d   pVal.  Or if i=
117c0 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20  =pIdx->nSample, 
117d0 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  then all samples
117e0 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74   are less.  ** t
117f0 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61 53  han pVal.  If aS
11800 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20  ample[i]==pVal, 
11810 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20 20 2a  then res==0..  *
11820 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  /.  if( res==0 )
11830 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  {.    aStat[0] =
11840 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
11850 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61  [iCol];.    aSta
11860 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
11870 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
11880 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63  }else{.    tRowc
11890 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65  nt iLower, iUppe
118a0 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28  r, iGap;.    if(
118b0 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69   i==0 ){.      i
118c0 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
118d0 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
118e0 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[0].anLt[iCol];
118f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11900 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71    i64 nRow0 = sq
11910 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
11920 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  (pIdx->aiRowLogE
11930 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 55  st[0]);.      iU
11940 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e  pper = i>=pIdx->
11950 6e 53 61 6d 70 6c 65 20 3f 20 6e 52 6f 77 30 20  nSample ? nRow0 
11960 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  : aSample[i].anL
11970 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  t[iCol];.      i
11980 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
11990 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20  i-1].anEq[iCol] 
119a0 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61  + aSample[i-1].a
119b0 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  nLt[iCol];.    }
119c0 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
119d0 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
119e0 6c 5d 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77  l];.    if( iLow
119f0 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20  er>=iUpper ){.  
11a00 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20      iGap = 0;.  
11a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
11a20 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69  Gap = iUpper - i
11a30 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Lower;.    }.   
11a40 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
11a50 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47        iGap = (iG
11a60 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c  ap*2)/3;.    }el
11a70 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
11a80 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20   iGap/3;.    }. 
11a90 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c     aStat[0] = iL
11aa0 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d  ower + iGap;.  }
11ab0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23  .  return i;.}.#
11ac0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11ad0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
11ae0 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
11af0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
11b00 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65  L, pTerm is a te
11b10 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  rm that provides
11b20 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77   an upper or low
11b30 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61  er.** bound on a
11b40 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74   range scan. Wit
11b50 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  hout considering
11b60 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73   pTerm, it is es
11b70 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74  timated .** that
11b80 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
11b90 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20  isit nNew rows. 
11ba0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
11bb0 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
11bc0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f  .** estimated to
11bd0 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65   be visited afte
11be0 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69  r taking pTerm i
11bf0 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a  nto account..**.
11c00 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65  ** If the user e
11c10 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
11c20 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  ied a likelihood
11c30 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  () value for thi
11c40 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20  s term,.** then 
11c50 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
11c60 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   is the likeliho
11c70 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  od multiplied by
11c80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
11c90 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74  * input rows. Ot
11ca0 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75  herwise, this fu
11cb0 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
11cc0 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e  hat an "IS NOT N
11cd0 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73  ULL" term.** has
11ce0 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
11cf0 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f   0.50, and any o
11d00 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65  ther term a like
11d10 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a  lihood of 0.25..
11d20 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
11d30 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
11d40 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
11d50 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29  rm, LogEst nNew)
11d60 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20  {.  LogEst nRet 
11d70 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54  = nNew;.  if( pT
11d80 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  erm ){.    if( p
11d90 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
11da0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
11db0 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
11dc0 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Prob;.    }else 
11dd0 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
11de0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
11df0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  )==0 ){.      nR
11e00 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20  et -= 20;       
11e10 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
11e20 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
11e30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11e40 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn nRet;.}..#if
11e50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11e60 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
11e70 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
11e80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
11e90 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
11ea0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
11eb0 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20 72  isited by a.** r
11ec0 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73  ange-scan on a s
11ed0 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20  kip-scan index. 
11ee0 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
11ef0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
11f00 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c  X i1 ON t1(a, b,
11f10 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54   c);.**   SELECT
11f20 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
11f30 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57 45   a=? AND c BETWE
11f40 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a  EN ? AND ?;.**.*
11f50 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e  * Value pLoop->n
11f60 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Out is currently
11f70 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
11f80 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
11f90 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65 64  rows .** visited
11fa0 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28 61   for scanning (a
11fb0 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69  =? AND b=?). Thi
11fc0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75 63  s function reduc
11fd0 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74 65  es that estimate
11fe0 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61 63   .** by some fac
11ff0 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  tor to account f
12000 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45 45  or the (c BETWEE
12010 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72 65  N ? AND ?) expre
12020 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f  ssion based.** o
12030 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74 61  n the stat4 data
12040 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 20   for the index. 
12050 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20 62  this scan will b
12060 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69  e peformed multi
12070 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f  ple .** times (o
12080 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61 2c  nce for each (a,
12090 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74  b) combination t
120a0 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f 29  hat matches a=?)
120b0 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20 0a   is dealt with .
120c0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ** by the caller
120d0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20  ..**.** It does 
120e0 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e 67  this by scanning
120f0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74 61   through all sta
12100 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70  t4 samples, comp
12110 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20  aring values.** 
12120 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
12130 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
12140 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 73   with the corres
12150 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69  ponding column i
12160 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65  n each.** sample
12170 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72 65  . If L and U are
12180 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
12190 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20  amples found to 
121a0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a  be less than or.
121b0 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ** equal to the 
121c0 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65 64  values extracted
121d0 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
121e0 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
121f0 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69  vely, and.** N i
12200 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
12210 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74  er of samples, t
12220 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76  he pLoop->nOut v
12230 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65 64  alue is adjusted
12240 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  .** as follows:.
12250 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e  **.**   nOut = n
12260 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20  Out * ( min(U - 
12270 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a  L, 1) / N ).**.*
12280 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20 4e  * If pLower is N
12290 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20  ULL, or a value 
122a0 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
122b0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65 72  ted from the ter
122c0 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74  m, L is.** set t
122d0 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70 65  o zero. If pUppe
122e0 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20  r is NULL, or a 
122f0 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
12300 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
12310 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20 74  t,.** U is set t
12320 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  o N..**.** Norma
12330 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
12340 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65 20  on sets *pbDone 
12350 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74 75  to 1 before retu
12360 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a  rning. However,.
12370 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20 63  ** if no value c
12380 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20  an be extracted 
12390 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f 77  from either pLow
123a0 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61 6e  er or pUpper (an
123b0 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69  d so the.** esti
123c0 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
123d0 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69 76  er of rows deliv
123e0 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e 63  ered remains unc
123f0 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65  hanged), *pbDone
12400 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20 69  .** is left as i
12410 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
12420 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
12430 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
12440 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
12450 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51  therwise, .** SQ
12460 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
12470 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
12480 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20 20  eSkipScanEst(.  
12490 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
124a0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
124b0 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
124c0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
124d0 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72  hereTerm *pLower
124e0 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75  ,   /* Lower bou
124f0 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
12500 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67   ex: "x>123" Mig
12510 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
12520 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65  WhereTerm *pUppe
12530 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f  r,   /* Upper bo
12540 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
12550 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69  . ex: "x<455" Mi
12560 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
12570 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
12580 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  p,    /* Update 
12590 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20  the .nOut value 
125a0 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  of this loop */.
125b0 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20    int *pbDone   
125c0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
125d0 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73   true if at leas
125e0 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c 75  t one expr. valu
125f0 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 29  e extracted */.)
12600 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
12610 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
12620 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
12630 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
12640 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33 20  .nEq;.  sqlite3 
12650 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12660 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d  ;.  int nLower =
12670 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65   -1;.  int nUppe
12680 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31  r = p->nSample+1
12690 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
126a0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
126b0 6f 6c 20 3d 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e  ol = p->aiColumn
126c0 5b 6e 45 71 5d 3b 0a 20 20 75 38 20 61 66 66 20  [nEq];.  u8 aff 
126d0 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 2d 3e 70  = iCol>=0 ? p->p
126e0 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
126f0 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20 53 51 4c  ].affinity : SQL
12700 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
12710 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
12720 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  l;.  .  sqlite3_
12730 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20 20  value *p1 = 0;  
12740 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
12750 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
12760 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c 69  pLower */.  sqli
12770 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d 20  te3_value *p2 = 
12780 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
12790 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
127a0 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20 20  rom pUpper */.  
127b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
127c0 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Val = 0;        
127d0 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
127e0 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20 2a  ed from record *
127f0 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  /..  pColl = sql
12800 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
12810 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a 43  q(pParse, p->azC
12820 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66 28  oll[nEq]);.  if(
12830 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 72   pLower ){.    r
12840 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
12850 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  ValueFromExpr(pP
12860 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70 45  arse, pLower->pE
12870 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66  xpr->pRight, aff
12880 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f 77  , &p1);.    nLow
12890 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  er = 0;.  }.  if
128a0 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d 3d  ( pUpper && rc==
128b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
128c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
128d0 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  t4ValueFromExpr(
128e0 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d 3e  pParse, pUpper->
128f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
12900 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e 55  ff, &p2);.    nU
12910 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a 20  pper = p2 ? 0 : 
12920 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a  p->nSample;.  }.
12930 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32 20  .  if( p1 || p2 
12940 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
12950 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20 20    int nDiff;.   
12960 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
12970 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e  LITE_OK && i<p->
12980 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  nSample; i++){. 
12990 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
129a0 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62 2c  3Stat4Column(db,
129b0 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 70   p->aSample[i].p
129c0 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
129d0 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b 0a  n, nEq, &pVal);.
129e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
129f0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29 7b  LITE_OK && p1 ){
12a00 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
12a10 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
12a20 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20 70  pare(p1, pVal, p
12a30 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
12a40 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f 77  f( res>=0 ) nLow
12a50 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er++;.      }.  
12a60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12a70 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a 20  TE_OK && p2 ){. 
12a80 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d         int res =
12a90 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
12aa0 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43 6f  re(p2, pVal, pCo
12ab0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ll);.        if(
12ac0 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65 72   res>=0 ) nUpper
12ad0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
12ae0 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28 6e  }.    nDiff = (n
12af0 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29 3b  Upper - nLower);
12b00 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c 3d  .    if( nDiff<=
12b10 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a 0a  0 ) nDiff = 1;..
12b20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
12b30 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
12b40 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
12b50 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64 20   specified, and 
12b60 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  the .    ** comp
12b70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74 65  arisons indicate
12b80 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63   that they are c
12b90 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20 75  lose together, u
12ba0 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a  se the fallback.
12bb0 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28 61      ** method (a
12bc0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
12bd0 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34 20  can visits 1/64 
12be0 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f 72  of the rows) for
12bf0 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20 20   estimating.    
12c00 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
12c10 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20 4f   rows visited. O
12c20 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d 61  therwise, estima
12c30 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
12c40 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73 69   rows.    ** usi
12c50 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  ng the method de
12c60 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 68  scribed in the h
12c70 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f  eader comment fo
12c80 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  r this function.
12c90 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69 66   */.    if( nDif
12ca0 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d 3d  f!=1 || pUpper==
12cb0 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20 29  0 || pLower==0 )
12cc0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64 6a  {.      int nAdj
12cd0 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c 6f  ust = (sqlite3Lo
12ce0 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65 29  gEst(p->nSample)
12cf0 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   - sqlite3LogEst
12d00 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20 20  (nDiff));.      
12d10 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e  pLoop->nOut -= n
12d20 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a 70  Adjust;.      *p
12d30 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  bDone = 1;.     
12d40 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
12d50 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d 73  , ("range skip-s
12d60 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e  can regions: %u.
12d70 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20 65  .%u  adjust=%d e
12d80 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55 70       nLower, nUp
12db0 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c  per, nAdjust*-1,
12dc0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a   pLoop->nOut));.
12dd0 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
12de0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62 44      assert( *pbD
12df0 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  one==0 );.  }.. 
12e00 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
12e10 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  e(p1);.  sqlite3
12e20 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a 20  ValueFree(p2);. 
12e30 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
12e40 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75  e(pVal);..  retu
12e50 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
12e60 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
12e70 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
12e80 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
12e90 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
12ea0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
12eb0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
12ec0 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
12ed0 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
12ee0 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
12ef0 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
12f00 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
12f10 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
12f20 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
12f30 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
12f40 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
12f50 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
12f60 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
12f70 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
12f80 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
12f90 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
12fa0 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
12fb0 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
12fc0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
12fd0 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
12fe0 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
12ff0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
13000 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
13010 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
13020 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
13030 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
13040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13050 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
13060 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
13070 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
13080 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
13090 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
130a0 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
130b0 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
130c0 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
130d0 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
130e0 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
130f0 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
13100 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  rm..**.** The va
13110 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72  lue in (pBuilder
13120 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
13130 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75 6d 62  nEq) is the numb
13140 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  er of the index.
13150 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63  ** column subjec
13160 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63  t to the range c
13170 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
13180 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
13190 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71   number of.** eq
131a0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
131b0 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ts optimized by 
131c0 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
131d0 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
131e0 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e  mple,.** assumin
131f0 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  g index p is on 
13200 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
13210 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
13220 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
13230 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
13240 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
13250 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
13260 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f  en nEq is set to
13270 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65   1 (as the range
13280 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75   restricted colu
13290 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65  mn, b, is the se
132a0 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  cond .** left-mo
132b0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
132c0 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
132d0 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
132e0 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
132f0 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
13300 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
13310 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
13320 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68  t to 0..**.** Wh
13330 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
13340 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f   is called, *pnO
13350 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
13360 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29   sqlite3LogEst()
13370 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
13380 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74  r of rows that t
13390 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73  he index scan is
133a0 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73   expected to vis
133b0 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63  it without .** c
133c0 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 72  onsidering the r
133d0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
133e0 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74  . If nEq is 0, t
133f0 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74 68  hen *pnOut is th
13400 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
13410 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
13420 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65  x. Assuming no e
13430 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e  rror occurs, *pn
13440 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20  Out is adjusted 
13450 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20  (reduced).** to 
13460 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
13470 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
13480 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  s pLower and pUp
13490 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74  per..** .** In t
134a0 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
134b0 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59  lite_stat4 ANALY
134c0 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73  ZE data, or if s
134d0 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20  uch data cannot 
134e0 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73 69  be.** used, a si
134f0 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71 75  ngle range inequ
13500 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68  ality reduces th
13510 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62  e search space b
13520 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e  y a factor of 4.
13530 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72 20   .** and a pair 
13540 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  of constraints (
13550 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64  x>? AND x<?) red
13560 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74 65  uces the expecte
13570 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72  d number of.** r
13580 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61  ows visited by a
13590 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a   factor of 64..*
135a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
135b0 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a  reRangeScanEst(.
135c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
135d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
135e0 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
135f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13600 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
13610 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57  r *pBuilder,.  W
13620 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72  hereTerm *pLower
13630 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75  ,   /* Lower bou
13640 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
13650 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67   ex: "x>123" Mig
13660 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
13670 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65  WhereTerm *pUppe
13680 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f  r,   /* Upper bo
13690 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
136a0 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69  . ex: "x<455" Mi
136b0 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
136c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
136d0 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20  p     /* Modify 
136e0 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61  the .nOut and ma
136f0 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73  ybe .rRun fields
13700 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
13710 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
13720 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d  nt nOut = pLoop-
13730 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20  >nOut;.  LogEst 
13740 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51  nNew;..#ifdef SQ
13750 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
13760 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64  3_OR_STAT4.  Ind
13770 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  ex *p = pLoop->u
13780 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
13790 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
137a0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a  ->u.btree.nEq;..
137b0 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65    if( p->nSample
137c0 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61  >0 && nEq<p->nSa
137d0 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20 20 69  mpleCol ){.    i
137e0 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72  f( nEq==pBuilder
137f0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20  ->nRecValid ){. 
13800 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63       UnpackedRec
13810 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
13820 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
13830 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a    tRowcnt a[2];.
13840 20 20 20 20 20 20 75 38 20 61 66 66 3b 0a 0a 20        u8 aff;.. 
13850 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65       /* Variable
13860 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20   iLower will be 
13870 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
13880 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
13890 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20  r of rows in .  
138a0 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
138b0 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74   that are less t
138c0 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  han the lower bo
138d0 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  und of the range
138e0 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20   query. The.    
138f0 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64    ** lower bound
13900 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61   being the conca
13910 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61  tenation of $P a
13920 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20  nd $L, where $P 
13930 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  is the.      ** 
13940 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65  key-prefix forme
13950 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c  d by the nEq val
13960 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61 69  ues matched agai
13970 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74  nst the nEq left
13980 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63  -most.      ** c
13990 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
139a0 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74  dex, and $L is t
139b0 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77  he value in pLow
139c0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
139d0 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f     ** Or, if pLo
139e0 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24  wer is NULL or $
139f0 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72  L cannot be extr
13a00 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62  acted from it (b
13a10 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20  ecause it.      
13a20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  ** is not a simp
13a30 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c  le variable or l
13a40 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74  iteral value), t
13a50 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
13a60 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72  f the.      ** r
13a70 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20  ange is $P. Due 
13a80 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68  to a quirk in th
13a90 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74  e way whereKeySt
13aa0 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65  ats() works, eve
13ab0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c  n.      ** if $L
13ac0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77   is available, w
13ad0 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 69  hereKeyStats() i
13ae0 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74  s called for bot
13af0 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20  h ($P) and .    
13b00 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64    ** ($P:$L) and
13b10 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74   the larger of t
13b20 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20  he two returned 
13b30 76 61 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a  values is used..
13b40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
13b50 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
13b60 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
13b70 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
13b80 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
13b90 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20  f rows.      ** 
13ba0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70  less than the up
13bb0 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  per bound of the
13bc0 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68   range query. Wh
13bd0 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62 6f  ere the upper bo
13be0 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  und.      ** is 
13bf0 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20 28  either ($P) or (
13c00 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65  $P:$U). Again, e
13c10 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76 61  ven if $U is ava
13c20 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c  ilable, both val
13c30 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ues.      ** of 
13c40 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65  iUpper are reque
13c50 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79  sted of whereKey
13c60 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20  Stats() and the 
13c70 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20  smaller used..  
13c80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
13c90 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  The number of ro
13ca0 77 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  ws between the t
13cb0 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65  wo bounds is the
13cc0 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c  n just iUpper-iL
13cd0 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ower..      */. 
13ce0 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f       tRowcnt iLo
13cf0 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73  wer;     /* Rows
13d00 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
13d10 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  ower bound */.  
13d20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
13d30 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20  er;     /* Rows 
13d40 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70  less than the up
13d50 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  per bound */.   
13d60 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d     int iLwrIdx =
13d70 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -2;   /* aSampl
13d80 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65  e[] for the lowe
13d90 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  r bound */.     
13da0 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d   int iUprIdx = -
13db0 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b  1;   /* aSample[
13dc0 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65 72 20  ] for the upper 
13dd0 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20  bound */..      
13de0 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20  if( pRec ){.    
13df0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
13e00 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69  ec->nField!=pBui
13e10 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
13e20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  );.        pRec-
13e30 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64  >nField = pBuild
13e40 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20  er->nRecValid;. 
13e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13e60 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c   nEq==p->nKeyCol
13e70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 66 66 20   ){.        aff 
13e80 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
13e90 45 47 45 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EGER;.      }els
13ea0 65 7b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d  e{.        aff =
13eb0 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
13ec0 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  [p->aiColumn[nEq
13ed0 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ]].affinity;.   
13ee0 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65     }.      /* De
13ef0 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61  termine iLower a
13f00 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20  nd iUpper using 
13f10 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  ($P) only. */.  
13f20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
13f30 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
13f40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55   = 0;.        iU
13f50 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73  pper = p->nRowEs
13f60 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t0;.      }else{
13f70 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65  .        /* Note
13f80 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c  : this call coul
13f90 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61  d be optimized a
13fa0 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20  way - since the 
13fb0 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74  same values must
13fc0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76   .        ** hav
13fd0 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
13fe0 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65   when testing ke
13ff0 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75  y $P in whereEqu
14000 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f  alScanEst().  */
14010 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
14020 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
14030 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
14040 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
14050 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55  a[0];.        iU
14060 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b  pper = a[0] + a[
14070 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1];.      }..   
14080 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65     assert( pLowe
14090 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d  r==0 || (pLower-
140a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
140b0 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29  _GT|WO_GE))!=0 )
140c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
140d0 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
140e0 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
140f0 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29  & (WO_LT|WO_LE))
14100 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
14110 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64  ert( p->aSortOrd
14120 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  er!=0 );.      i
14130 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  f( p->aSortOrder
14140 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20  [nEq] ){.       
14150 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66   /* The roles of
14160 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
14170 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20 66  er are swapped f
14180 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78 20  or a DESC index 
14190 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  */.        SWAP(
141a0 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77  WhereTerm*, pLow
141b0 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20  er, pUpper);.   
141c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
141d0 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
141e0 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
141f0 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
14200 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
14210 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
14220 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  .        int bOk
14230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14240 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
14250 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74  value is extract
14260 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f  ed from pExpr */
14270 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
14280 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70  Expr = pLower->p
14290 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
142a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
142b0 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
142c0 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
142d0 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
142e0 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
142f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
14300 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20  QLITE_OK && bOk 
14310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f  ){.          tRo
14320 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
14330 20 20 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77       iLwrIdx = w
14340 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
14350 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
14360 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   a);.          i
14370 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70  New = a[0] + ((p
14380 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
14390 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29   & (WO_GT|WO_LE)
143a0 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
143b0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
143c0 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65  w>iLower ) iLowe
143d0 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
143e0 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
143f0 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30        pLower = 0
14400 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14410 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
14420 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
14430 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72  ve on the iUpper
14440 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
14450 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$U). */.    
14460 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a    if( pUpper ){.
14470 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b          int bOk;
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76      /* True if v
144a0 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65  alue is extracte
144b0 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
144c0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
144d0 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
144e0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
144f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14500 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
14510 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
14520 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
14530 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20  , nEq, &bOk);.  
14540 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14550 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29  LITE_OK && bOk )
14560 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77  {.          tRow
14570 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
14580 20 20 20 20 69 55 70 72 49 64 78 20 3d 20 77 68      iUprIdx = wh
14590 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
145a0 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20  se, p, pRec, 1, 
145b0 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e  a);.          iN
145c0 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55  ew = a[0] + ((pU
145d0 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
145e0 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29  & (WO_GT|WO_LE))
145f0 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
14600 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
14610 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65 72  <iUpper ) iUpper
14620 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
14630 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
14640 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b       pUpper = 0;
14650 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14660 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64   }..      pBuild
14670 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b  er->pRec = pRec;
14680 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
14690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
146a0 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69      if( iUpper>i
146b0 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
146c0 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65     nNew = sqlite
146d0 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d  3LogEst(iUpper -
146e0 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20   iLower);.      
146f0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20      /* TUNING:  
14700 49 66 20 62 6f 74 68 20 69 55 70 70 65 72 20 61  If both iUpper a
14710 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65  nd iLower are de
14720 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73  rived from the s
14730 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
14740 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73   sample, then as
14750 73 75 6d 65 20 74 68 65 79 20 61 72 65 20 34 78  sume they are 4x
14760 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e   more selective.
14770 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20    This brings.  
14780 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
14790 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69  stimated selecti
147a0 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e  vity more in lin
147b0 65 20 77 69 74 68 20 77 68 61 74 20 69 74 20 77  e with what it w
147c0 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20  ould be.        
147d0 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65    ** if estimate
147e0 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 75 73  d without the us
147f0 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62  e of STAT3/4 tab
14800 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  les. */.        
14810 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69    if( iLwrIdx==i
14820 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d  UprIdx ) nNew -=
14830 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30   20;  assert( 20
14840 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
14850 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  4) );.        }e
14860 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  lse{.          n
14870 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20  New = 10;       
14880 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
14890 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
148a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
148b0 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74     if( nNew<nOut
148c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
148d0 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ut = nNew;.     
148e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45     }.        WHE
148f0 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22  RETRACE(0x10, ("
14900 53 54 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e  STAT4 range scan
14910 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64  : %u..%u  est=%d
14920 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33  (u32)iLower, (u3
14950 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29  2)iUpper, nOut))
14960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14970 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  lse{.      int b
14980 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Done = 0;.      
14990 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53  rc = whereRangeS
149a0 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61 72 73  kipScanEst(pPars
149b0 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65  e, pLower, pUppe
149c0 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65  r, pLoop, &bDone
149d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f  );.      if( bDo
149e0 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  ne ) return rc;.
149f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
14a00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
14a10 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e  ER(pParse);.  UN
14a20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
14a30 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65  Builder);.  asse
14a40 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55  rt( pLower || pU
14a50 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20  pper );.#endif. 
14a60 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d   assert( pUpper=
14a70 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77  =0 || (pUpper->w
14a80 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
14a90 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65  ULL)==0 );.  nNe
14aa0 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64  w = whereRangeAd
14ab0 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75  just(pLower, nOu
14ac0 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65  t);.  nNew = whe
14ad0 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55  reRangeAdjust(pU
14ae0 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20  pper, nNew);..  
14af0 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68  /* TUNING: If th
14b00 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75  ere is both an u
14b10 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c  pper and lower l
14b20 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72  imit and neither
14b30 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20   limit.  ** has 
14b40 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64  an application-d
14b50 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f  efined likelihoo
14b60 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20  d(), assume the 
14b70 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65  range is.  ** re
14b80 64 75 63 65 64 20 62 79 20 61 6e 20 61 64 64 69  duced by an addi
14b90 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73  tional 75%. This
14ba0 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20   means that, by 
14bb0 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e  default, an open
14bc0 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67  -ended.  ** rang
14bd0 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f  e query (e.g. co
14be0 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65  l > ?) is assume
14bf0 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f  d to match 1/4 o
14c00 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68  f the rows in th
14c10 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68  e.  ** index. Wh
14c20 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e  ile a closed ran
14c30 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54  ge (e.g. col BET
14c40 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73  WEEN ? AND ?) is
14c50 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20   estimated to.  
14c60 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66  ** match 1/64 of
14c70 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a   the index. */ .
14c80 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20    if( pLower && 
14c90 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f  pLower->truthPro
14ca0 62 3e 30 20 26 26 20 70 55 70 70 65 72 20 26 26  b>0 && pUpper &&
14cb0 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72   pUpper->truthPr
14cc0 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77  ob>0 ){.    nNew
14cd0 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e   -= 20;.  }..  n
14ce0 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d  Out -= (pLower!=
14cf0 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29  0) + (pUpper!=0)
14d00 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20  ;.  if( nNew<10 
14d10 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69  ) nNew = 10;.  i
14d20 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e  f( nNew<nOut ) n
14d30 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20  Out = nNew;.#if 
14d40 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
14d50 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66  CE_ENABLED).  if
14d60 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f  ( pLoop->nOut>nO
14d70 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54  ut ){.    WHERET
14d80 52 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67  RACE(0x10,("Rang
14d90 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f  e scan lowers nO
14da0 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  ut from %d to %d
14db0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
14dc0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
14dd0 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  nOut, nOut));.  
14de0 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70  }.#endif.  pLoop
14df0 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74  ->nOut = (LogEst
14e00 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20  )nOut;.  return 
14e10 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
14e20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
14e30 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
14e40 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
14e50 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
14e60 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
14e70 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
14e80 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  n equality const
14e90 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e  raint x=VALUE an
14ea0 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c  d where that VAL
14eb0 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20  UE occurs in.** 
14ec0 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61  the histogram da
14ed0 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77  ta.  This only w
14ee0 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74  orks when x is t
14ef0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
14f00 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64  column of an ind
14f10 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74  ex and sqlite_st
14f20 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
14f30 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a  ta is available.
14f40 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65  ** for that inde
14f50 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d  x.  When pExpr==
14f60 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
14f70 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
14f80 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22  s.** "x IS NULL"
14f90 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56   instead of "x=V
14fa0 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  ALUE"..**.** Wri
14fb0 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
14fc0 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
14fd0 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
14fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
14ff0 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
15000 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
15010 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
15020 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
15030 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
15040 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15050 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
15060 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
15070 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
15080 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
15090 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
150a0 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
150b0 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
150c0 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
150d0 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
150e0 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
150f0 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
15100 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
15110 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
15120 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
15130 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
15140 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20  EqualScanEst(.  
15150 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15160 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
15170 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
15180 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
15190 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
151a0 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70  *pBuilder,.  Exp
151b0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
151c0 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
151d0 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65  for VALUE in the
151e0 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61   x=VALUE constra
151f0 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  int */.  tRowcnt
15200 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a   *pnRow       /*
15210 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
15220 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
15230 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
15240 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72  ex *p = pBuilder
15250 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
15260 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
15270 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  q = pBuilder->pN
15280 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
15290 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
152a0 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64  d *pRec = pBuild
152b0 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61  er->pRec;.  u8 a
152c0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
152d0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
152e0 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e  affinity */.  in
152f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
15300 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
15310 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
15320 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
15330 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  a[2];           
15340 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20    /* Statistics 
15350 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20  */.  int bOk;.. 
15360 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20   assert( nEq>=1 
15370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  );.  assert( nEq
15380 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  <=p->nColumn );.
15390 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
153a0 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  mple!=0 );.  ass
153b0 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e  ert( p->nSample>
153c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
153d0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
153e0 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  id<nEq );..  /* 
153f0 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  If values are no
15400 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
15410 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
15420 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  e index to the l
15430 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  eft.  ** of this
15440 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74   one, no estimat
15450 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52  e can be made. R
15460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
15470 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20  FOUND. */.  if( 
15480 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
15490 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20  lid<(nEq-1) ){. 
154a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
154b0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a  _NOTFOUND;.  }..
154c0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
154d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
154e0 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  y. The call to s
154f0 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
15500 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20  SetValue().  ** 
15510 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75  below would retu
15520 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  rn the same valu
15530 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71  e.  */.  if( nEq
15540 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  >=p->nColumn ){.
15550 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a      *pnRow = 1;.
15560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15570 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66  E_OK;.  }..  aff
15580 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   = p->pTable->aC
15590 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ol[p->aiColumn[n
155a0 45 71 2d 31 5d 5d 2e 61 66 66 69 6e 69 74 79 3b  Eq-1]].affinity;
155b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
155c0 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
155d0 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
155e0 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
155f0 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20  nEq-1, &bOk);.  
15600 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
15610 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21   pRec;.  if( rc!
15620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
15630 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f  urn rc;.  if( bO
15640 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  k==0 ) return SQ
15650 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
15660 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
15670 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77  alid = nEq;..  w
15680 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
15690 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
156a0 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43   a);.  WHERETRAC
156b0 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74  E(0x10,("equalit
156c0 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  y scan regions: 
156d0 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d  %d\n", (int)a[1]
156e0 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61  ));.  *pnRow = a
156f0 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  [1];.  .  return
15700 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
15710 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
15720 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
15730 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15740 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
15750 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
15760 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
15770 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
15780 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
15790 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20  sed on.** an IN 
157a0 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65  constraint where
157b0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
157c0 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
157d0 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20  perator.** is a 
157e0 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20  list of values. 
157f0 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
15800 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49         WHERE x I
15810 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a  N (1,2,3,4).**.*
15820 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
15830 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
15840 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
15850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15860 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
15870 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
15880 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
15890 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
158a0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
158b0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
158c0 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
158d0 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
158e0 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
158f0 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
15900 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
15910 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
15920 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
15930 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
15940 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
15950 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
15960 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
15970 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
15980 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
15990 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
159a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
159b0 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a  whereInScanEst(.
159c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
159d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
159e0 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
159f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15a00 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
15a10 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
15a20 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
15a30 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
15a40 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53   list on the RHS
15a50 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32   of "x IN (v1,v2
15a60 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74  ,v3,...)" */.  t
15a70 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
15a80 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
15a90 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
15aa0 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
15ab0 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
15ac0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
15ad0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
15ae0 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69  i64 nRow0 = sqli
15af0 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
15b00 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
15b10 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c  );.  int nRecVal
15b20 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  id = pBuilder->n
15b30 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20  RecValid;.  int 
15b40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
15b50 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
15b60 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
15b70 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74  /.  tRowcnt nEst
15b80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
15b90 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f  umber of rows fo
15ba0 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  r a single term 
15bb0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f  */.  tRowcnt nRo
15bc0 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  wEst = 0;    /* 
15bd0 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20  New estimate of 
15be0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
15bf0 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ws */.  int i;  
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
15c20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
15c30 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
15c40 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
15c50 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69  LITE_OK && i<pLi
15c60 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
15c70 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77  .    nEst = nRow
15c80 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  0;.    rc = wher
15c90 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
15ca0 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
15cb0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
15cc0 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e  r, &nEst);.    n
15cd0 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a  RowEst += nEst;.
15ce0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
15cf0 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
15d00 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  lid;.  }..  if( 
15d10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15d20 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74  .    if( nRowEst
15d30 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45   > nRow0 ) nRowE
15d40 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
15d50 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74  *pnRow = nRowEst
15d60 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
15d70 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65  (0x10,("IN row e
15d80 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c  stimate: est=%d\
15d90 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20  n", nRowEst));. 
15da0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75   }.  assert( pBu
15db0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
15dc0 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ==nRecValid );. 
15dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
15de0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
15df0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
15e00 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  TAT4 */../*.** D
15e10 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
15e20 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
15e30 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
15e40 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
15e50 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
15e60 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
15e70 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
15e80 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
15e90 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
15ea0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
15eb0 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
15ec0 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
15ed0 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
15ee0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
15ef0 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
15f00 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
15f10 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
15f20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
15f30 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
15f40 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
15f50 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
15f60 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
15f70 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
15f80 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
15f90 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
15fa0 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
15fb0 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
15fc0 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
15fd0 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
15fe0 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
15ff0 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
16000 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
16010 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
16020 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
16030 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
16040 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
16050 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
16060 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
16070 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
16080 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44  isabled..**.** D
16090 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
160a0 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
160b0 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
160c0 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
160d0 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
160e0 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
160f0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
16100 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
16110 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
16120 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
16130 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
16140 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
16150 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
16160 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
16170 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
16180 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
16190 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
161a0 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
161b0 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
161c0 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
161d0 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
161e0 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
161f0 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
16200 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
16210 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
16220 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
16230 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
16240 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
16250 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
16260 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69  t #813..*/.stati
16270 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
16280 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
16290 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
162a0 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20   *pTerm){.  if( 
162b0 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28  pTerm.      && (
162c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
162d0 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a   TERM_CODED)==0.
162e0 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
162f0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
16300 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
16310 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
16320 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
16330 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
16340 6e 6f 74 52 65 61 64 79 20 26 20 70 54 65 72 6d  notReady & pTerm
16350 2d 3e 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a  ->prereqAll)==0.
16360 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
16370 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
16380 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70  CODED;.    if( p
16390 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  Term->iParent>=0
163a0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
163b0 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
163c0 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65  Term->pWC->a[pTe
163d0 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
163e0 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65      if( (--pOthe
163f0 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b  r->nChild)==0 ){
16400 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
16410 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74  Term(pLevel, pOt
16420 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  her);.      }.  
16430 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
16440 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69   Code an OP_Affi
16450 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61  nity opcode to a
16460 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pply the column 
16470 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
16480 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  zAff.** to the n
16490 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
164a0 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a  ing at base. .**
164b0 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69  .** As an optimi
164c0 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41  zation, SQLITE_A
164d0 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
164e0 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70  (which are no-op
164f0 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67  s) at the.** beg
16500 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f  inning and end o
16510 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72  f zAff are ignor
16520 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72  ed.  If all entr
16530 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a  ies in zAff are.
16540 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
16550 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65  NE, then no code
16560 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e   gets generated.
16570 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
16580 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77  ine makes its ow
16590 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73  n copy of zAff s
165a0 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  o that the calle
165b0 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20  r is free.** to 
165c0 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65  modify zAff afte
165d0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
165e0 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  eturns..*/.stati
165f0 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79  c void codeApply
16600 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
16610 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65  pParse, int base
16620 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a  , int n, char *z
16630 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Aff){.  Vdbe *v 
16640 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
16650 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29  .  if( zAff==0 )
16660 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
16670 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
16680 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
16690 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
166a0 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f  rt( v!=0 );..  /
166b0 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e  * Adjust base an
166c0 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  d n to skip over
166d0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
166e0 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20   entries at the 
166f0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61  beginning.  ** a
16700 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66  nd end of the af
16710 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20  finity string.. 
16720 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30   */.  while( n>0
16730 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c   && zAff[0]==SQL
16740 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
16750 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73      n--;.    bas
16760 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b  e++;.    zAff++;
16770 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e  .  }.  while( n>
16780 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d  1 && zAff[n-1]==
16790 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
167a0 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a  ){.    n--;.  }.
167b0 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f  .  /* Code the O
167c0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
167d0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
167e0 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64  ything left to d
167f0 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20  o. */.  if( n>0 
16800 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16810 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
16820 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e  ffinity, base, n
16830 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16840 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
16850 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20  , zAff, n);.    
16860 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16870 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
16880 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
16890 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
168a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
168b0 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
168c0 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
168d0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
168e0 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
168f0 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
16900 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
16910 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
16920 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
16930 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
16940 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
16950 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
16960 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
16970 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
16980 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
16990 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
169a0 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
169b0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
169c0 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
169d0 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
169e0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
169f0 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
16a00 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
16a10 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
16a20 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
16a30 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
16a40 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
16a50 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
16a60 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
16a70 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20  EqualityTerm(.  
16a80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16a90 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
16aa0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
16ab0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
16ac0 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20  ,   /* The term 
16ad0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
16ae0 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20  use to be coded 
16af0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
16b00 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20  *pLevel, /* The 
16b10 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
16b20 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
16b30 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
16b40 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20  int iEq,        
16b50 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
16b60 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
16b70 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65  m within this le
16b80 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  vel */.  int bRe
16b90 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v,           /* 
16ba0 54 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65  True for reverse
16bb0 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74  -order IN operat
16bc0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
16bd0 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a  arget         /*
16be0 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76   Attempt to leav
16bf0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69  e results in thi
16c00 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
16c10 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
16c20 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64  erm->pExpr;.  Vd
16c30 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
16c40 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65  pVdbe;.  int iRe
16c50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
16c60 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
16c70 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20  holding results 
16c80 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54  */..  assert( iT
16c90 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28  arget>0 );.  if(
16ca0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
16cb0 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  {.    iReg = sql
16cc0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
16cd0 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  et(pParse, pX->p
16ce0 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
16cf0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d  .  }else if( pX-
16d00 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
16d10 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
16d20 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rget;.    sqlite
16d30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16d40 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
16d50 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16d60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
16d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
16d80 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69  eType;.    int i
16d90 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
16da0 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
16db0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
16dc0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
16dd0 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c  op;..    if( (pL
16de0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
16df0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
16e00 45 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70  E)==0.      && p
16e10 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
16e20 6e 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26  ndex!=0.      &&
16e30 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
16e40 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
16e50 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20  er[iEq].    ){. 
16e60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
16e70 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  Eq==0 );.      t
16e80 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
16e90 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
16ea0 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  Rev;.    }.    a
16eb0 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
16ec0 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67  K_IN );.    iReg
16ed0 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
16ee0 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
16ef0 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
16f00 65 2c 20 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f  e, pX, IN_INDEX_
16f10 4c 4f 4f 50 2c 20 30 29 3b 0a 20 20 20 20 69 66  LOOP, 0);.    if
16f20 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
16f30 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
16f40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16f50 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52  bRev );.      bR
16f60 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
16f70 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d  }.    iTab = pX-
16f80 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c  >iTable;.    sql
16f90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16fa0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
16fb0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54   : OP_Rewind, iT
16fc0 61 62 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65  ab, 0);.    Vdbe
16fd0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
16fe0 65 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ev);.    VdbeCov
16ff0 65 72 61 67 65 49 66 28 76 2c 20 21 62 52 65 76  erageIf(v, !bRev
17000 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
17010 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
17020 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29   WHERE_MULTI_OR)
17030 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  ==0 );.    pLoop
17040 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
17050 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20  RE_IN_ABLE;.    
17060 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  if( pLevel->u.in
17070 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .nIn==0 ){.     
17080 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
17090 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
170a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
170b0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
170c0 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  in.nIn++;.    pL
170d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
170e0 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  op =.       sqli
170f0 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
17100 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
17110 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
17120 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
17150 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30  ->u.in.aInLoop[0
17160 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  ])*pLevel->u.in.
17170 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20  nIn);.    pIn = 
17180 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
17190 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
171a0 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
171b0 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
171c0 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
171d0 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
171e0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
171f0 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
17200 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
17210 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
17220 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17230 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
17240 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65   iReg);.      }e
17250 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
17260 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
17270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17280 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
17290 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20  ab, 0, iReg);.  
172a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d      }.      pIn-
172b0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52  >eEndLoopOp = bR
172c0 65 76 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70  ev ? OP_PrevIfOp
172d0 65 6e 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70  en : OP_NextIfOp
172e0 65 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  en;.      sqlite
172f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17300 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b  P_IsNull, iReg);
17310 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17320 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17330 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
17340 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
17350 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
17360 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
17370 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
17380 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
17390 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
173a0 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
173b0 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
173c0 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
173d0 6e 0a 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e  n.** index scan.
173e0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
173f0 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
17400 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
17410 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
17420 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
17430 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
17440 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
17450 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
17460 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
17470 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
17480 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
17490 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
174a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
174b0 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
174c0 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
174d0 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
174e0 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
174f0 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
17500 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
17510 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
17520 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
17530 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
17540 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
17550 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
17560 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
17570 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
17580 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
17590 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
175a0 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
175b0 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
175c0 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
175d0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
175e0 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
175f0 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
17600 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
17610 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
17620 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
17630 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
17640 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
17650 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
17660 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
17670 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
17680 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
17690 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
176a0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
176b0 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
176c0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
176d0 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 52 65 67  ** The nExtraReg
176e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
176f0 6f 72 20 31 2e 20 20 49 74 20 69 73 20 30 20 69  or 1.  It is 0 i
17700 66 20 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75  f all WHERE clau
17710 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  se constraints.*
17720 2a 20 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61  * are == or IN a
17730 6e 64 20 61 72 65 20 63 6f 76 65 72 65 64 20 62  nd are covered b
17740 79 20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74  y the nEq.  nExt
17750 72 61 52 65 67 20 69 73 20 31 20 69 66 20 74 68  raReg is 1 if th
17760 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65  ere is.** an ine
17770 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
17780 6e 74 20 28 73 75 63 68 20 61 73 20 74 68 65 20  nt (such as the 
17790 22 63 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20  "c>=5 AND c<10" 
177a0 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20  in the example) 
177b0 74 68 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61  that.** occurs a
177c0 66 74 65 72 20 74 68 65 20 6e 45 71 20 71 75 61  fter the nEq qua
177d0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
177e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
177f0 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
17800 20 72 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45   range of nEq+nE
17810 78 74 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63  xtraReg memory c
17820 65 6c 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ells and returns
17830 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
17840 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72   the first memor
17850 79 20 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72  y cell in that r
17860 61 6e 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74  ange. The code t
17870 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
17880 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
17890 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72  se that memory r
178a0 61 6e 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65  ange to store ke
178b0 79 73 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20  ys for.** start 
178c0 61 6e 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  and termination 
178d0 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68  conditions of th
178e0 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76  e loop..** key v
178f0 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
17900 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
17910 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
17920 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
17930 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
17940 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
17950 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
17960 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
17970 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  l.** use..**.** 
17980 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
17990 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20  , *pzAff is set 
179a0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
179b0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
179c0 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65  a.** copy of the
179d0 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
179e0 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69   string of the i
179f0 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75  ndex allocated u
17a00 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44  sing.** sqlite3D
17a10 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70  bMalloc(). Excep
17a20 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  t, entries in th
17a30 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  e copy of the st
17a40 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a  ring associated.
17a50 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79  ** with equality
17a60 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
17a70 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e  t use NONE affin
17a80 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a  ity are set to.*
17a90 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
17aa0 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65  E. This is to de
17ab0 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68  al with SQL such
17ac0 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   as the followin
17ad0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
17ae0 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58  E TABLE t1(a TEX
17af0 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  T PRIMARY KEY, b
17b00 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e  );.**   SELECT .
17b10 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32  .. FROM t1 AS t2
17b20 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20  , t1 WHERE t1.a 
17b30 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e  = t2.b;.**.** In
17b40 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
17b50 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ve, the index on
17b60 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20   t1(a) has TEXT 
17b70 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69  affinity. But si
17b80 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74  nce.** the right
17b90 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68   hand side of th
17ba0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
17bb0 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73  raint (t2.b) has
17bc0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a   NONE affinity,.
17bd0 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  ** no conversion
17be0 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d   should be attem
17bf0 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e  pted before usin
17c00 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61  g a t2.b value a
17c10 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b  s part of.** a k
17c20 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65  ey to search the
17c30 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68   index. Hence th
17c40 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20  e first byte in 
17c50 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66  the returned aff
17c60 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20  inity.** string 
17c70 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20  in this example 
17c80 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  would be set to 
17c90 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
17ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
17cb0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
17cc0 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
17cd0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
17ce0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
17cf0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
17d00 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
17d10 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
17d20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
17d30 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69  re coding */.  i
17d40 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
17d50 20 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20       /* Reverse 
17d60 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
17d70 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
17d80 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20  nt nExtraReg,   
17d90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17da0 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
17db0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
17dc0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20  .  char **pzAff 
17dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
17de0 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   Set to point to
17df0 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
17e00 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71   */.){.  u16 nEq
17e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
17e30 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
17e40 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
17e50 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53  code */.  u16 nS
17e60 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kip;            
17e70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17e80 72 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63  r of left-most c
17e90 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a  olumns to skip *
17ea0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
17eb0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
17ec0 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65    /* The vm unde
17ed0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
17ee0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
17f10 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
17f20 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  is loop */.  Whe
17f30 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
17f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
17f50 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
17f60 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72  t term */.  Wher
17f70 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
17f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17f90 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
17fa0 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  t */.  int j;   
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
17fd0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
17fe0 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
17ff0 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
18000 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
18010 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20  t nReg;         
18020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18030 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65  umber of registe
18040 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
18050 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20  /.  char *zAff; 
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
18080 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a  ring to return *
18090 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64  /..  /* This mod
180a0 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ule is only call
180b0 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e  ed on query plan
180c0 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e  s that use an in
180d0 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20  dex. */.  pLoop 
180e0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
180f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f  ;.  assert( (pLo
18100 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
18110 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
18120 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20  )==0 );.  nEq = 
18130 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
18140 45 71 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c  Eq;.  nSkip = pL
18150 6f 6f 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 70 49  oop->nSkip;.  pI
18160 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
18170 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73  ree.pIndex;.  as
18180 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
18190 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
181a0 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
181b0 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
181c0 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
181d0 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  te them..  */.  
181e0 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
181f0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52  ->nMem + 1;.  nR
18200 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  eg = pLoop->u.bt
18210 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61  ree.nEq + nExtra
18220 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  Reg;.  pParse->n
18230 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20  Mem += nReg;..  
18240 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  zAff = sqlite3Db
18250 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
18260 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  b, sqlite3IndexA
18270 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49  ffinityStr(v, pI
18280 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66  dx));.  if( !zAf
18290 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  f ){.    pParse-
182a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
182b0 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66  d = 1;.  }..  if
182c0 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 69  ( nSkip ){.    i
182d0 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
182e0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
182f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18300 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f  Op1(v, (bRev?OP_
18310 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c  Last:OP_Rewind),
18320 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56   iIdxCur);.    V
18330 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
18340 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56   bRev==0);.    V
18350 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
18360 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 56   bRev!=0);.    V
18370 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
18380 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20  begin skip-scan 
18390 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  on %s", pIdx->zN
183a0 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73  ame));.    j = s
183b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
183c0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
183d0 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b    pLevel->addrSk
183e0 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ip = sqlite3Vdbe
183f0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62 52  AddOp4Int(v, (bR
18400 65 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f  ev?OP_SeekLT:OP_
18410 53 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20 20  SeekGT),.       
18420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18430 20 20 20 20 20 69 49 64 78 43 75 72 2c 20 30 2c       iIdxCur, 0,
18440 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70 29   regBase, nSkip)
18450 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
18460 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
18470 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
18480 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
18490 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
184a0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b  eJumpHere(v, j);
184b0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
184c0 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nSkip; j++){.   
184d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
184e0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
184f0 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20 72  n, iIdxCur, j, r
18500 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20  egBase+j);.     
18510 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
18520 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b  iColumn[j]>=0 );
18530 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
18540 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
18550 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
18560 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
18570 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  ]].zName));.    
18580 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20  }.  }    ..  /* 
18590 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
185a0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
185b0 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
185c0 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74   zAff==0 || (int
185d0 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e  )strlen(zAff)>=n
185e0 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53  Eq );.  for(j=nS
185f0 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  kip; j<nEq; j++)
18600 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20  {.    int r1;.  
18610 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
18620 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
18630 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
18640 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   );.    /* The f
18650 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61 73  ollowing testcas
18660 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 69 6e  e is true for in
18670 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e  dices with redun
18680 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20  dant columns. . 
18690 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45     ** Ex: CREATE
186a0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
186b0 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a  a,b,a); SELECT *
186c0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
186d0 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20  =0 AND b=0; */. 
186e0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54     testcase( (pT
186f0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
18700 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b  ERM_CODED)!=0 );
18710 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
18720 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
18730 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
18740 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75      r1 = codeEqu
18750 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
18760 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
18770 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73   j, bRev, regBas
18780 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
18790 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
187a0 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31       if( nReg==1
187b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
187c0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
187d0 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  g(pParse, regBas
187e0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42  e);.        regB
187f0 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20  ase = r1;.      
18800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
18810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18820 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
18830 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
18840 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18850 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
18860 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
18870 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
18880 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
18890 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
188a0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
188b0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
188c0 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
188d0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ))==0 ){.      E
188e0 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
188f0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
18900 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ht;.      if( sq
18910 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
18920 6c 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  ll(pRight) ){.  
18930 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18940 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
18950 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c  Null, regBase+j,
18960 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
18970 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
18980 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
18990 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 41    }.      if( zA
189a0 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
189b0 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
189c0 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
189d0 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
189e0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
189f0 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
18a00 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
18a10 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
18a20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
18a30 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
18a40 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
18a50 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
18a60 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
18a70 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
18a80 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
18a90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
18aa0 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
18ab0 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
18ac0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
18ad0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
18ae0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
18af0 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20  ine is a helper 
18b00 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  for explainIndex
18b10 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a  Range() below.**
18b20 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74  .** pStr holds t
18b30 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78  he text of an ex
18b40 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65  pression that we
18b50 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70   are building up
18b60 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20   one term.** at 
18b70 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f  a time.  This ro
18b80 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77  utine adds a new
18b90 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64   term to the end
18ba0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
18bb0 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65  on..** Terms are
18bc0 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e   separated by AN
18bd0 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e  D so add the "AN
18be0 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f  D" text for seco
18bf0 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
18c00 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e  t.** terms only.
18c10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18c20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
18c30 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  m(.  StrAccum *p
18c40 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Str,            
18c50 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70   /* The text exp
18c60 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75  ression being bu
18c70 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ilt */.  int iTe
18c80 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
18c90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
18ca0 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72   this term.  Fir
18cb0 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20  st is zero */.  
18cc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
18cd0 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  umn,        /* N
18ce0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
18cf0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
18d00 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20  r *zOp          
18d10 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
18d20 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  e operator */.){
18d30 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73  .  if( iTerm ) s
18d40 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
18d50 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
18d60 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65   ", 5);.  sqlite
18d70 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
18d80 6c 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e  ll(pStr, zColumn
18d90 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
18da0 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
18db0 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69   zOp, 1);.  sqli
18dc0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
18dd0 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b  d(pStr, "?", 1);
18de0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
18df0 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69  nt pLevel descri
18e00 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66  bes a strategy f
18e10 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c  or scanning tabl
18e20 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a  e pTab. This .**
18e30 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
18e40 73 20 74 65 78 74 20 74 6f 20 70 53 74 72 20 74  s text to pStr t
18e50 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
18e60 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c  e subset of tabl
18e70 65 0a 2a 2a 20 72 6f 77 73 20 73 63 61 6e 6e 65  e.** rows scanne
18e80 64 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67  d by the strateg
18e90 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66  y in the form of
18ea0 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69   an SQL expressi
18eb0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  on..**.** For ex
18ec0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
18ed0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
18ee0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
18ef0 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
18f00 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
18f10 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
18f20 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
18f30 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
18f40 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
18f50 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
18f60 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
18f70 4e 44 20 62 3e 3f 22 0a 2a 2f 0a 73 74 61 74 69  ND b>?".*/.stati
18f80 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 49 6e  c void explainIn
18f90 64 65 78 52 61 6e 67 65 28 53 74 72 41 63 63 75  dexRange(StrAccu
18fa0 6d 20 2a 70 53 74 72 2c 20 57 68 65 72 65 4c 6f  m *pStr, WhereLo
18fb0 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65  op *pLoop, Table
18fc0 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
18fd0 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   *pIndex = pLoop
18fe0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
18ff0 3b 0a 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c  ;.  u16 nEq = pL
19000 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
19010 3b 0a 20 20 75 31 36 20 6e 53 6b 69 70 20 3d 20  ;.  u16 nSkip = 
19020 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20  pLoop->nSkip;.  
19030 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75  int i, j;.  Colu
19040 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *aCol = pTab-
19050 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69  >aCol;.  i16 *ai
19060 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
19070 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 69 66  >aiColumn;..  if
19080 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f  ( nEq==0 && (pLo
19090 6f 70 2d 3e 77 73 46 6c 61 67 73 26 28 57 48 45  op->wsFlags&(WHE
190a0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
190b0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d  RE_TOP_LIMIT))==
190c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
190d0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
190e0 65 6e 64 28 70 53 74 72 2c 20 22 20 28 22 2c 20  end(pStr, " (", 
190f0 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  2);.  for(i=0; i
19100 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nEq; i++){.    
19110 63 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75  char *z = aiColu
19120 6d 6e 5b 69 5d 20 3c 20 30 20 3f 20 22 72 6f 77  mn[i] < 0 ? "row
19130 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
19140 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[i]].zName;. 
19150 20 20 20 69 66 28 20 69 3e 3d 6e 53 6b 69 70 20     if( i>=nSkip 
19160 29 7b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  ){.      explain
19170 41 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c  AppendTerm(pStr,
19180 20 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 20   i, z, "=");.   
19190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
191a0 28 20 69 20 29 20 73 71 6c 69 74 65 33 53 74 72  ( i ) sqlite3Str
191b0 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
191c0 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
191d0 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
191e0 6e 74 66 28 70 53 74 72 2c 20 30 2c 20 22 41 4e  ntf(pStr, 0, "AN
191f0 59 28 25 73 29 22 2c 20 7a 29 3b 0a 20 20 20 20  Y(%s)", z);.    
19200 7d 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a  }.  }..  j = i;.
19210 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
19220 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
19230 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72  IMIT ){.    char
19240 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a   *z = aiColumn[j
19250 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20  ] < 0 ? "rowid" 
19260 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
19270 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
19280 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
19290 28 70 53 74 72 2c 20 69 2b 2b 2c 20 7a 2c 20 22  (pStr, i++, z, "
192a0 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  >");.  }.  if( p
192b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
192c0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
192d0 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
192e0 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f  iColumn[j] < 0 ?
192f0 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
19300 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
19310 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
19320 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20  ppendTerm(pStr, 
19330 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a  i, z, "<");.  }.
19340 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
19350 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 29  mAppend(pStr, ")
19360 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ", 1);.}../*.** 
19370 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
19380 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
19390 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
193a0 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20  sing an EXPLAIN 
193b0 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f  QUERY PLAN.** co
193c0 6d 6d 61 6e 64 2c 20 6f 72 20 69 66 20 65 69 74  mmand, or if eit
193d0 68 65 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47  her SQLITE_DEBUG
193e0 20 6f 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   or SQLITE_ENABL
193f0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
19400 53 20 77 61 73 0a 2a 2a 20 64 65 66 69 6e 65 64  S was.** defined
19410 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
19420 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61  . If it is not a
19430 20 6e 6f 2d 6f 70 2c 20 61 20 73 69 6e 67 6c 65   no-op, a single
19440 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
19450 64 65 20 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  de .** is added 
19460 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f  to the output to
19470 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61   describe the ta
19480 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
19490 79 20 69 6e 20 70 4c 65 76 65 6c 2e 0a 2a 2a 0a  y in pLevel..**.
194a0 2a 2a 20 49 66 20 61 6e 20 4f 50 5f 45 78 70 6c  ** If an OP_Expl
194b0 61 69 6e 20 6f 70 63 6f 64 65 20 69 73 20 61 64  ain opcode is ad
194c0 64 65 64 20 74 6f 20 74 68 65 20 56 4d 2c 20 69  ded to the VM, i
194d0 74 73 20 61 64 64 72 65 73 73 20 69 73 20 72 65  ts address is re
194e0 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
194f0 77 69 73 65 2c 20 69 66 20 6e 6f 20 4f 50 5f 45  wise, if no OP_E
19500 78 70 6c 61 69 6e 20 69 73 20 63 6f 64 65 64 2c  xplain is coded,
19510 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
19520 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
19530 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
19540 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19550 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19560 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
19570 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
19580 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
19590 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
195a0 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70  e list this loop
195b0 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20   refers to */.  
195c0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
195d0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
195e0 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65  /* Scan to write
195f0 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
19600 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  de for */.  int 
19610 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
19620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
19630 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22  alue for "level"
19640 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
19650 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
19660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19670 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
19680 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d  for "from" colum
19690 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
196a0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
196d0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
196e0 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  Begin() */.){.  
196f0 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 23 69 66  int ret = 0;.#if
19700 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
19710 5f 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  _DEBUG) && !defi
19720 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
19730 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
19740 53 29 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  S).  if( pParse-
19750 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65  >explain==2 ).#e
19760 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 74 72  ndif.  {.    str
19770 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19780 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
19790 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
197a0 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20  From];.    Vdbe 
197b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
197c0 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62  be;      /* VM b
197d0 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
197e0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20   */.    sqlite3 
197f0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
19800 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
19810 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  e handle */.    
19820 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73 65  int iId = pParse
19830 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a  ->iSelectId;  /*
19840 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74   Select id (left
19850 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c  -most output col
19860 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  umn) */.    int 
19870 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20 20  isSearch;       
19880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
19890 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20  e for a SEARCH. 
198a0 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20  False for SCAN. 
198b0 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
198c0 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
198d0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
198e0 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f  rolling WhereLoo
198f0 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  p object */.    
19900 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20  u32 flags;      
19910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19920 20 46 6c 61 67 73 20 74 68 61 74 20 64 65 73 63   Flags that desc
19930 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a  ribe this loop *
19940 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  /.    char *zMsg
19950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19960 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61      /* Text to a
19970 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74  dd to EQP output
19980 20 2a 2f 0a 20 20 20 20 53 74 72 41 63 63 75 6d   */.    StrAccum
19990 20 73 74 72 3b 20 20 20 20 20 20 20 20 20 20 20   str;           
199a0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 6f 75 74        /* EQP out
199b0 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  put string */.  
199c0 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
199d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
199e0 2f 2a 20 49 6e 69 74 69 61 6c 20 73 70 61 63 65  /* Initial space
199f0 20 66 6f 72 20 45 51 50 20 6f 75 74 70 75 74 20   for EQP output 
19a00 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 70  string */..    p
19a10 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
19a20 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73  WLoop;.    flags
19a30 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
19a40 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  s;.    if( (flag
19a50 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
19a60 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73  ) || (wctrlFlags
19a70 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f  &WHERE_ONETABLE_
19a80 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 20 30  ONLY) ) return 0
19a90 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20  ;..    isSearch 
19aa0 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f  = (flags&(WHERE_
19ab0 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
19ac0 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20  TOP_LIMIT))!=0. 
19ad0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28             || ((
19ae0 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52 54  flags&WHERE_VIRT
19af0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20  UALTABLE)==0 && 
19b00 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  (pLoop->u.btree.
19b10 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20  nEq>0)).        
19b20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61      || (wctrlFla
19b30 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42  gs&(WHERE_ORDERB
19b40 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45  Y_MIN|WHERE_ORDE
19b50 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20  RBY_MAX));..    
19b60 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
19b70 6e 69 74 28 26 73 74 72 2c 20 7a 42 75 66 2c 20  nit(&str, zBuf, 
19b80 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 53 51  sizeof(zBuf), SQ
19b90 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29  LITE_MAX_LENGTH)
19ba0 3b 0a 20 20 20 20 73 74 72 2e 64 62 20 3d 20 64  ;.    str.db = d
19bb0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  b;.    sqlite3St
19bc0 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
19bd0 26 73 74 72 2c 20 69 73 53 65 61 72 63 68 20 3f  &str, isSearch ?
19be0 20 22 53 45 41 52 43 48 22 20 3a 20 22 53 43 41   "SEARCH" : "SCA
19bf0 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
19c00 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
19c10 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
19c20 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20 53  ntf(&str, 0, " S
19c30 55 42 51 55 45 52 59 20 25 64 22 2c 20 70 49 74  UBQUERY %d", pIt
19c40 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a  em->iSelectId);.
19c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19c60 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
19c70 26 73 74 72 2c 20 30 2c 20 22 20 54 41 42 4c 45  &str, 0, " TABLE
19c80 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61   %s", pItem->zNa
19c90 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
19ca0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
19cb0 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
19cc0 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20  e3XPrintf(&str, 
19cd0 30 2c 20 22 20 41 53 20 25 73 22 2c 20 70 49 74  0, " AS %s", pIt
19ce0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
19cf0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
19d00 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
19d10 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
19d20 45 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  E))==0 ){.      
19d30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
19d40 20 3d 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65   = 0;.      Inde
19d50 78 20 2a 70 49 64 78 3b 0a 0a 20 20 20 20 20 20  x *pIdx;..      
19d60 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75  assert( pLoop->u
19d70 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
19d80 20 29 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   );.      pIdx =
19d90 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
19da0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 61 73  pIndex;.      as
19db0 73 65 72 74 28 20 21 28 66 6c 61 67 73 26 57 48  sert( !(flags&WH
19dc0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20  ERE_AUTO_INDEX) 
19dd0 7c 7c 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  || (flags&WHERE_
19de0 49 44 58 5f 4f 4e 4c 59 29 20 29 3b 0a 20 20 20  IDX_ONLY) );.   
19df0 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
19e00 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 26 26  (pItem->pTab) &&
19e10 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
19e20 65 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20  ex(pIdx) ){.    
19e30 20 20 20 20 69 66 28 20 69 73 53 65 61 72 63 68      if( isSearch
19e40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46   ){.          zF
19e50 6d 74 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45  mt = "PRIMARY KE
19e60 59 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Y";.        }.  
19e70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
19e80 61 67 73 20 26 20 57 48 45 52 45 5f 50 41 52 54  ags & WHERE_PART
19e90 49 41 4c 49 44 58 20 29 7b 0a 20 20 20 20 20 20  IALIDX ){.      
19ea0 20 20 7a 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41    zFmt = "AUTOMA
19eb0 54 49 43 20 50 41 52 54 49 41 4c 20 43 4f 56 45  TIC PARTIAL COVE
19ec0 52 49 4e 47 20 49 4e 44 45 58 22 3b 0a 20 20 20  RING INDEX";.   
19ed0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
19ee0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
19ef0 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20  INDEX ){.       
19f00 20 7a 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54   zFmt = "AUTOMAT
19f10 49 43 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  IC COVERING INDE
19f20 58 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  X";.      }else 
19f30 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52  if( flags & WHER
19f40 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
19f50 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 43 4f        zFmt = "CO
19f60 56 45 52 49 4e 47 20 49 4e 44 45 58 20 25 73 22  VERING INDEX %s"
19f70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19f80 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 49         zFmt = "I
19f90 4e 44 45 58 20 25 73 22 3b 0a 20 20 20 20 20 20  NDEX %s";.      
19fa0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 46 6d 74  }.      if( zFmt
19fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19fc0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
19fd0 64 28 26 73 74 72 2c 20 22 20 55 53 49 4e 47 20  d(&str, " USING 
19fe0 22 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 73  ", 7);.        s
19ff0 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73  qlite3XPrintf(&s
1a000 74 72 2c 20 30 2c 20 7a 46 6d 74 2c 20 70 49 64  tr, 0, zFmt, pId
1a010 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
1a020 20 20 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52     explainIndexR
1a030 61 6e 67 65 28 26 73 74 72 2c 20 70 4c 6f 6f 70  ange(&str, pLoop
1a040 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
1a050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1a060 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
1a070 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20  HERE_IPK)!=0 && 
1a080 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  (flags & WHERE_C
1a090 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b  ONSTRAINT)!=0 ){
1a0a0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1a0b0 72 20 2a 7a 52 61 6e 67 65 3b 0a 20 20 20 20 20  r *zRange;.     
1a0c0 20 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52   if( flags&(WHER
1a0d0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
1a0e0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a  E_COLUMN_IN) ){.
1a0f0 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d          zRange =
1a100 20 22 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 20 20   "(rowid=?)";.  
1a110 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1a120 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f  lags&WHERE_BOTH_
1a130 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f  LIMIT)==WHERE_BO
1a140 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TH_LIMIT ){.    
1a150 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72      zRange = "(r
1a160 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64  owid>? AND rowid
1a170 3c 3f 29 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  <?)";.      }els
1a180 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52  e if( flags&WHER
1a190 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
1a1a0 20 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20         zRange = 
1a1b0 22 28 72 6f 77 69 64 3e 3f 29 22 3b 0a 20 20 20  "(rowid>?)";.   
1a1c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a1d0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 26    assert( flags&
1a1e0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
1a1f0 3b 0a 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65  ;.        zRange
1a200 20 3d 20 22 28 72 6f 77 69 64 3c 3f 29 22 3b 0a   = "(rowid<?)";.
1a210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1a220 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1a230 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20 22 20 55  endAll(&str, " U
1a240 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49  SING INTEGER PRI
1a250 4d 41 52 59 20 4b 45 59 20 22 29 3b 0a 20 20 20  MARY KEY ");.   
1a260 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
1a270 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 73 74 72  umAppendAll(&str
1a280 2c 20 7a 52 61 6e 67 65 29 3b 0a 20 20 20 20 7d  , zRange);.    }
1a290 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a2a0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1a2b0 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28  E.    else if( (
1a2c0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  flags & WHERE_VI
1a2d0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
1a2e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
1a2f0 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20  Printf(&str, 0, 
1a300 22 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  " VIRTUAL TABLE 
1a310 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 0a 20 20  INDEX %d:%s",.  
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a330 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1a340 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  xNum, pLoop->u.v
1a350 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
1a360 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
1a370 20 53 51 4c 49 54 45 5f 45 58 50 4c 41 49 4e 5f   SQLITE_EXPLAIN_
1a380 45 53 54 49 4d 41 54 45 44 5f 52 4f 57 53 0a 20  ESTIMATED_ROWS. 
1a390 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f     if( pLoop->nO
1a3a0 75 74 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  ut>=10 ){.      
1a3b0 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
1a3c0 73 74 72 2c 20 30 2c 20 22 20 28 7e 25 6c 6c 75  str, 0, " (~%llu
1a3d0 20 72 6f 77 73 29 22 2c 20 73 71 6c 69 74 65 33   rows)", sqlite3
1a3e0 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 4c 6f 6f  LogEstToInt(pLoo
1a3f0 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d  p->nOut));.    }
1a400 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1a410 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1a420 64 28 26 73 74 72 2c 20 22 20 28 7e 31 20 72 6f  d(&str, " (~1 ro
1a430 77 29 22 2c 20 39 29 3b 0a 20 20 20 20 7d 0a 23  w)", 9);.    }.#
1a440 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d  endif.    zMsg =
1a450 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1a460 46 69 6e 69 73 68 28 26 73 74 72 29 3b 0a 20 20  Finish(&str);.  
1a470 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 56    ret = sqlite3V
1a480 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1a490 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c  Explain, iId, iL
1a4a0 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73  evel, iFrom, zMs
1a4b0 67 2c 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  g,P4_DYNAMIC);. 
1a4c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
1a4d0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1a4e0 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  e explainOneScan
1a4f0 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a  (u,v,w,x,y,z) 0.
1a500 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a510 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
1a520 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a530 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
1a540 53 54 41 54 55 53 0a 2f 2a 0a 2a 2a 20 43 6f 6e  STATUS./*.** Con
1a550 66 69 67 75 72 65 20 74 68 65 20 56 4d 20 70 61  figure the VM pa
1a560 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
1a570 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  t argument with 
1a580 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74  an.** sqlite3_st
1a590 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20  mt_scanstatus() 
1a5a0 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64  entry correspond
1a5b0 69 6e 67 20 74 6f 20 74 68 65 20 73 63 61 6e 20  ing to the scan 
1a5c0 75 73 65 64 20 74 6f 20 0a 2a 2a 20 69 6d 70 6c  used to .** impl
1a5d0 65 6d 65 6e 74 20 6c 65 76 65 6c 20 70 4c 76 6c  ement level pLvl
1a5e0 2e 20 41 72 67 75 6d 65 6e 74 20 70 53 72 63 6c  . Argument pSrcl
1a5f0 69 73 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ist is a pointer
1a600 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 0a 2a 2a   to the FROM .**
1a610 20 63 6c 61 75 73 65 20 74 68 61 74 20 74 68 65   clause that the
1a620 20 73 63 61 6e 20 72 65 61 64 73 20 64 61 74 61   scan reads data
1a630 20 66 72 6f 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   from..**.** If 
1a640 61 72 67 75 6d 65 6e 74 20 61 64 64 72 45 78 70  argument addrExp
1a650 6c 61 69 6e 20 69 73 20 6e 6f 74 20 30 2c 20 69  lain is not 0, i
1a660 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 61 64  t must be the ad
1a670 64 72 65 73 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  dress of an .** 
1a680 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
1a690 75 63 74 69 6f 6e 20 74 68 61 74 20 64 65 73 63  uction that desc
1a6a0 72 69 62 65 73 20 74 68 65 20 73 61 6d 65 20 6c  ribes the same l
1a6b0 6f 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oop..*/.static v
1a6c0 6f 69 64 20 61 64 64 53 63 61 6e 53 74 61 74 75  oid addScanStatu
1a6d0 73 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  s(.  Vdbe *v,   
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6f0 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20       /* Vdbe to 
1a700 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 20 65  add scanstatus e
1a710 6e 74 72 79 20 74 6f 20 2a 2f 0a 20 20 53 72 63  ntry to */.  Src
1a720 4c 69 73 74 20 2a 70 53 72 63 6c 69 73 74 2c 20  List *pSrclist, 
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a740 46 52 4f 4d 20 63 6c 61 75 73 65 20 70 4c 76 6c  FROM clause pLvl
1a750 20 72 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d   reads data from
1a760 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
1a770 20 2a 70 4c 76 6c 2c 20 20 20 20 20 20 20 20 20   *pLvl,         
1a780 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74        /* Level t
1a790 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73  o add scanstatus
1a7a0 28 29 20 65 6e 74 72 79 20 66 6f 72 20 2a 2f 0a  () entry for */.
1a7b0 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69    int addrExplai
1a7c0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
1a7d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1a7e0 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30  OP_Explain (or 0
1a7f0 29 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  ) */.){.  const 
1a800 63 68 61 72 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a  char *zObj = 0;.
1a810 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1a820 6f 70 20 3d 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f  op = pLvl->pWLoo
1a830 70 3b 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  p;.  if( (pLoop-
1a840 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1a850 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
1a860 30 20 20 26 26 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0  &&  pLoop->u.
1a870 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
1a880 29 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 4c  ){.    zObj = pL
1a890 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1a8a0 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 65  dex->zName;.  }e
1a8b0 6c 73 65 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20  lse{.    zObj = 
1a8c0 70 53 72 63 6c 69 73 74 2d 3e 61 5b 70 4c 76 6c  pSrclist->a[pLvl
1a8d0 2d 3e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a  ->iFrom].zName;.
1a8e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1a8f0 65 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 20  eScanStatus(.   
1a900 20 20 20 76 2c 20 61 64 64 72 45 78 70 6c 61 69     v, addrExplai
1a910 6e 2c 20 70 4c 76 6c 2d 3e 61 64 64 72 42 6f 64  n, pLvl->addrBod
1a920 79 2c 20 70 4c 76 6c 2d 3e 61 64 64 72 56 69 73  y, pLvl->addrVis
1a930 69 74 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c  it, pLoop->nOut,
1a940 20 7a 4f 62 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6c   zObj.  );.}.#el
1a950 73 65 0a 23 20 64 65 66 69 6e 65 20 61 64 64 53  se.# define addS
1a960 63 61 6e 53 74 61 74 75 73 28 61 2c 20 62 2c 20  canStatus(a, b, 
1a970 63 2c 20 64 29 20 28 28 76 6f 69 64 29 64 29 0a  c, d) ((void)d).
1a980 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
1a990 6f 6b 20 61 74 20 74 68 65 20 6c 61 73 74 20 69  ok at the last i
1a9a0 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 64 65 64  nstruction coded
1a9b0 2e 20 20 49 66 20 74 68 61 74 20 69 6e 73 74 72  .  If that instr
1a9c0 75 63 74 69 6f 6e 20 69 73 20 4f 50 5f 53 74 72  uction is OP_Str
1a9d0 69 6e 67 38 0a 2a 2a 20 61 6e 64 20 69 66 20 70  ing8.** and if p
1a9e0 4c 6f 6f 70 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  Loop->iLikeRepCn
1a9f0 74 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  tr is non-zero, 
1aa00 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
1aa10 50 33 20 74 6f 20 62 65 0a 2a 2a 20 70 4c 6f 6f  P3 to be.** pLoo
1aa20 70 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20  p->iLikeRepCntr 
1aa30 61 6e 64 20 73 65 74 20 50 35 2e 0a 2a 2a 0a 2a  and set P5..**.*
1aa40 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f  * This is part o
1aa50 66 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  f the LIKE optim
1aa60 69 7a 61 74 69 6f 6e 2e 20 20 46 49 58 4d 45 3a  ization.  FIXME:
1aa70 20 20 45 78 70 6c 61 69 6e 20 69 6e 20 6d 6f 72    Explain in mor
1aa80 65 20 64 65 74 61 69 6c 0a 2a 2f 0a 73 74 61 74  e detail.*/.stat
1aa90 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 69 6b  ic void whereLik
1aaa0 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72  eOptimizationStr
1aab0 69 6e 67 46 69 78 75 70 28 56 64 62 65 20 2a 76  ingFixup(Vdbe *v
1aac0 2c 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  , WhereLevel *pL
1aad0 65 76 65 6c 29 7b 0a 20 20 56 64 62 65 4f 70 20  evel){.  VdbeOp 
1aae0 2a 70 4f 70 3b 0a 20 20 70 4f 70 20 3d 20 73 71  *pOp;.  pOp = sq
1aaf0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
1ab00 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 70 4c 65  , -1);.  if( pLe
1ab10 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
1ab20 72 20 26 26 20 41 4c 57 41 59 53 28 70 4f 70 2d  r && ALWAYS(pOp-
1ab30 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 72 69  >opcode==OP_Stri
1ab40 6e 67 38 29 20 29 7b 0a 20 20 20 20 70 4f 70 2d  ng8) ){.    pOp-
1ab50 3e 70 33 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 4c  >p3 = pLevel->iL
1ab60 69 6b 65 52 65 70 43 6e 74 72 3b 0a 20 20 20 20  ikeRepCntr;.    
1ab70 70 4f 70 2d 3e 70 35 20 3d 20 31 3b 0a 20 20 7d  pOp->p5 = 1;.  }
1ab80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1ab90 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
1aba0 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65  start of the iLe
1abb0 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74  vel-th loop in t
1abc0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  he WHERE clause.
1abd0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
1abe0 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  n described by p
1abf0 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  WInfo..*/.static
1ac00 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65   Bitmask codeOne
1ac10 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65  LoopStart(.  Whe
1ac20 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
1ac30 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e    /* Complete in
1ac40 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1ac50 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1ac60 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
1ac70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
1ac80 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49  ich level of pWI
1ac90 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20  nfo->a[] should 
1aca0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69  be coded */.  Bi
1acb0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
1acc0 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c     /* Which tabl
1acd0 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  es are currently
1ace0 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b   available */.){
1acf0 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20  .  int j, k;    
1ad00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1ad10 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1ad20 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
1ad30 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
1ad40 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
1ad50 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ble */.  int add
1ad60 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rNxt;         /*
1ad70 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74   Where to jump t
1ad80 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
1ad90 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65  the next IN case
1ada0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61   */.  int omitTa
1adb0 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  ble;       /* Tr
1adc0 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
1add0 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
1ade0 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
1adf0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ae00 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
1ae10 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
1ae20 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  r */.  WhereLeve
1ae30 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54  l *pLevel;  /* T
1ae40 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74  he where level t
1ae50 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1ae60 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1ae70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72  ;    /* The Wher
1ae80 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69  eLoop object bei
1ae90 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  ng coded */.  Wh
1aea0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
1aeb0 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1aec0 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
1aed0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1aee0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
1aef0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
1af00 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
1af10 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
1af20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af40 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1af50 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
1af60 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
1af70 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1af80 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1af90 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afb0 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
1afc0 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63  red stmt under c
1afd0 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  onstructions */.
1afe0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1aff0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
1b000 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1b010 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65   term being code
1b020 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  d */.  int addrB
1b030 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
1b040 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1b050 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
1b060 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
1b070 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20    int addrCont; 
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b090 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
1b0a0 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
1b0b0 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
1b0c0 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20  int iRowidReg = 
1b0d0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  0;        /* Row
1b0e0 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  id is stored in 
1b0f0 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69  this register, i
1b100 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20  f not zero */.  
1b110 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20  int iReleaseReg 
1b120 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d  = 0;      /* Tem
1b130 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
1b140 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ee before return
1b150 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ing */..  pParse
1b160 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1b170 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  e;.  v = pParse-
1b180 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20  >pVdbe;.  pWC = 
1b190 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
1b1a0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1b1b0 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
1b1c0 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
1b1d0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
1b1e0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62  ->pWLoop;.  pTab
1b1f0 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Item = &pWInfo->
1b200 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
1b210 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43  el->iFrom];.  iC
1b220 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
1b230 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c  Cursor;.  pLevel
1b240 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74  ->notReady = not
1b250 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b  Ready & ~getMask
1b260 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
1b270 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65  et, iCur);.  bRe
1b280 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76  v = (pWInfo->rev
1b290 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b  Mask>>iLevel)&1;
1b2a0 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28  .  omitTable = (
1b2b0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1b2c0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
1b2d0 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
1b2e0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
1b2f0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46  lFlags & WHERE_F
1b300 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a  ORCE_TABLE)==0;.
1b310 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
1b320 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
1b330 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22  HERE-loop%d: %s"
1b340 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d  ,iLevel,pTabItem
1b350 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1b360 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61  ..  /* Create la
1b370 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
1b380 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
1b390 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
1b3a0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75  .  ** for the cu
1b3b0 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d  rrent loop.  Jum
1b3c0 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20  p to addrBrk to 
1b3d0 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
1b3e0 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74  oop..  ** Jump t
1b3f0 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
1b400 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
1b410 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
1b420 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e  f the.  ** loop.
1b430 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
1b440 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
1b450 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
1b460 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74   have a "addrNxt
1b470 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a  " label that.  *
1b480 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69  * means to conti
1b490 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
1b4a0 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69  t IN value combi
1b4b0 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20  nation.  When.  
1b4c0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
1b4d0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
1b4e0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
1b4f0 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c   the "addrNxt" l
1b500 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65  abel.  ** is the
1b510 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72   same as "addrBr
1b520 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42  k"..  */.  addrB
1b530 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
1b540 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
1b550 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
1b560 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1b570 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70  ;.  addrCont = p
1b580 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20  Level->addrCont 
1b590 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b5a0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
1b5b0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1b5c0 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
1b5d0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1b5e0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
1b5f0 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
1b600 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b610 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
1b620 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
1b630 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  any.  ** row of 
1b640 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
1b650 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
1b660 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
1b670 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49  From>0 && (pTabI
1b680 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  tem[0].jointype 
1b690 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
1b6a0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  .    pLevel->iLe
1b6b0 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73  ftJoin = ++pPars
1b6c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
1b6d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b6e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1b6f0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1b700 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
1b710 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c  ment((v, "init L
1b720 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
1b730 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a  h flag"));.  }..
1b740 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
1b750 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  e of a FROM clau
1b760 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c  se subquery impl
1b770 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
1b780 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28  routine */.  if(
1b790 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f   pTabItem->viaCo
1b7a0 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69  routine ){.    i
1b7b0 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54  nt regYield = pT
1b7c0 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  abItem->regRetur
1b7d0 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
1b7e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1b7f0 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1b800 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49  gYield, 0, pTabI
1b810 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
1b820 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
1b830 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65  2 =  sqlite3Vdbe
1b840 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b850 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61 64  ld, regYield, ad
1b860 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62 65  drBrk);.    Vdbe
1b870 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1b880 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1b890 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22   "next row of \"
1b8a0 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d  %s\"", pTabItem-
1b8b0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
1b8c0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1b8d0 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73   OP_Goto;.  }els
1b8e0 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
1b8f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1b900 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f  BLE.  if(  (pLoo
1b910 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1b920 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1b930 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
1b940 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65  se 1:  The table
1b950 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
1b960 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
1b970 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
1b980 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1b990 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1b9a0 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
1b9b0 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
1b9c0 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
1b9d0 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ilter */.    int
1b9e0 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20   addrNotFound;. 
1b9f0 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
1ba00 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  nt = pLoop->nLTe
1ba10 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rm;..    sqlite3
1ba20 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1ba30 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20  arse);.    iReg 
1ba40 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1ba50 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
1ba60 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
1ba70 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
1ba80 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1ba90 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1baa0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
1bab0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  +){.      int iT
1bac0 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32  arget = iReg+j+2
1bad0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
1bae0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1baf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1bb00 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
1bb10 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1bb20 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1bb30 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _IN ){.        c
1bb40 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1bb50 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1bb60 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
1bb70 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
1bb80 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
1bb90 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1bba0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1bbb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1bbc0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1bbd0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
1bbe0 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
1bbf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1bc00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bc10 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1bc20 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
1bc30 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
1bc40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bc50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1bc60 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  er, nConstraint,
1bc70 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
1bc80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1bc90 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
1bca0 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
1bcb0 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20  d, iReg,.       
1bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1bcd0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1bce0 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
1bcf0 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1bd00 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
1bd10 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a  e ? P4_MPRINTF :
1bd20 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1bd30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1bd40 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76  ;.    pLoop->u.v
1bd50 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1bd60 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1bd70 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20  <nConstraint && 
1bd80 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  j<16; j++){.    
1bd90 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e    if( (pLoop->u.
1bda0 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a  vtab.omitMask>>j
1bdb0 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64  )&1 ){.        d
1bdc0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1bdd0 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  l, pLoop->aLTerm
1bde0 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [j]);.      }.  
1bdf0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1be00 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
1be10 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1be20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1be30 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1be40 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1be50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1be60 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1be70 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
1be80 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
1be90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1bea0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  Pop(pParse);.  }
1beb0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
1bec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1bed0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66  ALTABLE */..  if
1bee0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1bef0 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
1bf00 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  0.   && (pLoop->
1bf10 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1bf20 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
1bf30 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a  _COLUMN_EQ))!=0.
1bf40 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65    ){.    /* Case
1bf50 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   2:  We can dire
1bf60 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
1bf70 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
1bf80 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  g an.    **     
1bf90 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
1bfa0 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
1bfb0 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
1bfc0 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20  .  Or.    **    
1bfd0 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
1bfe0 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
1bff0 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
1c000 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  IN (...)".    **
1c010 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
1c020 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
1c030 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75  assert( pLoop->u
1c040 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b  .btree.nEq==1 );
1c050 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
1c060 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
1c070 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1c080 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1c090 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
1c0a0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1c0b0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
1c0c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c0d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1c0e0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1c0f0 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67  .    iReleaseReg
1c100 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1c110 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  m;.    iRowidReg
1c120 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
1c130 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1c140 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
1c150 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
1c160 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  ;.    if( iRowid
1c170 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65 67  Reg!=iReleaseReg
1c180 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
1c190 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1c1a0 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
1c1b0 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
1c1c0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
1c1d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c1e0 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
1c1f0 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  Int, iRowidReg, 
1c200 61 64 64 72 4e 78 74 29 3b 20 56 64 62 65 43 6f  addrNxt); VdbeCo
1c210 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1c220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c230 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
1c240 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  , iCur, addrNxt,
1c250 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1c260 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1c270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1c280 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1c290 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f  ange(pParse, iRo
1c2a0 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20  widReg, 1);.    
1c2b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c2c0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1c2d0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1c2e0 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  g);.    VdbeComm
1c2f0 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1c300 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1c310 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73   OP_Noop;.  }els
1c320 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  e if( (pLoop->ws
1c330 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
1c340 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  K)!=0.         &
1c350 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
1c360 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1c370 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a  _RANGE)!=0.  ){.
1c380 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20      /* Case 3:  
1c390 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
1c3a0 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
1c3b0 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
1c3c0 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f  ID field..    */
1c3d0 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20  .    int testOp 
1c3e0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69  = OP_Noop;.    i
1c3f0 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e  nt start;.    in
1c400 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20  t memEndValue = 
1c410 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  0;.    WhereTerm
1c420 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b   *pStart, *pEnd;
1c430 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ..    assert( om
1c440 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
1c450 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74    j = 0;.    pSt
1c460 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a  art = pEnd = 0;.
1c470 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1c480 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
1c490 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72  TM_LIMIT ) pStar
1c4a0 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  t = pLoop->aLTer
1c4b0 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20  m[j++];.    if( 
1c4c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1c4d0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1c4e0 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d   ) pEnd = pLoop-
1c4f0 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1c500 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
1c510 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29  !=0 || pEnd!=0 )
1c520 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29  ;.    if( bRev )
1c530 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
1c540 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53  pStart;.      pS
1c550 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
1c560 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
1c570 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c580 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
1c590 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
1c5a0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
1c5b0 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
1c5c0 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
1c5d0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
1c5e0 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
1c5f0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
1c600 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
1c610 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
1c620 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
1c630 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61  following consta
1c640 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f  nt maps TK_xx co
1c650 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70  des into corresp
1c660 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  onding .      **
1c670 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20   seek opcodes.  
1c680 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20  It depends on a 
1c690 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
1c6a0 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20  ing of TK_xx.   
1c6b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
1c6c0 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d  t u8 aMoveOp[] =
1c6d0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {.           /*
1c6e0 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_GT */  OP_Se
1c6f0 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  ekGT,.          
1c700 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50   /* TK_LE */  OP
1c710 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20  _SeekLE,.       
1c720 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20      /* TK_LT */ 
1c730 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20   OP_SeekLT,.    
1c740 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20         /* TK_GE 
1c750 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20  */  OP_SeekGE.  
1c760 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73      };.      ass
1c770 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47  ert( TK_LE==TK_G
1c780 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d  T+1 );      /* M
1c790 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64  ake sure the ord
1c7a0 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20  ering.. */.     
1c7b0 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
1c7c0 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
1c7d0 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
1c7e0 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
1c7f0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1c800 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29  TK_GE==TK_GT+3 )
1c810 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69  ;      /*  ... i
1c820 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a  s correcct. */..
1c830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1c840 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1c850 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
1c860 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c870 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  e( pStart->wtFla
1c880 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1c890 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d 20  L );.      pX = 
1c8a0 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
1c8b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1c8c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1c8d0 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c 65  case( pStart->le
1c8e0 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
1c8f0 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65 20  ; /* transitive 
1c900 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1c910 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1c920 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1c930 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
1c940 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20  , &rTemp);.     
1c950 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c960 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58  p3(v, aMoveOp[pX
1c970 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75  ->op-TK_GT], iCu
1c980 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b  r, addrBrk, r1);
1c990 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1c9a0 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
1c9b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1c9c0 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
1c9d0 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_GT);.      Vdb
1c9e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
1c9f0 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20  X->op==TK_LE);. 
1ca00 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ca10 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
1ca20 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_LT);.      Vdb
1ca30 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
1ca40 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20  X->op==TK_GE);. 
1ca50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ca60 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1ca70 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
1ca80 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1ca90 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1caa0 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a  pParse, rTemp);.
1cab0 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
1cac0 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74  m(pLevel, pStart
1cad0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1cae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1caf0 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20  ddOp2(v, bRev ? 
1cb00 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77  OP_Last : OP_Rew
1cb10 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ind, iCur, addrB
1cb20 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rk);.      VdbeC
1cb30 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
1cb40 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62  v==0);.      Vdb
1cb50 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1cb60 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20  Rev!=0);.    }. 
1cb70 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
1cb80 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
1cb90 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
1cba0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1cbb0 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1cbc0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 6e      assert( (pEn
1cbd0 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1cbe0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
1cbf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1cc00 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  End->leftCursor!
1cc10 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e  =iCur ); /* Tran
1cc20 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
1cc30 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
1cc40 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
1cc50 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1cc60 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45  AL );.      memE
1cc70 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
1cc80 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1cc90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1cca0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1ccb0 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
1ccc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
1ccd0 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
1cce0 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
1ccf0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1cd00 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
1cd10 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
1cd20 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1cd30 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
1cd40 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
1cd50 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1cd60 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
1cd70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
1cd80 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1cd90 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1cda0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1cdb0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1cdc0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
1cdd0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1cde0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1cdf0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73  = start;.    ass
1ce00 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
1ce10 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65  =0 );.    if( te
1ce20 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
1ce30 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1ce40 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ce50 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1ce60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ce70 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
1ce80 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1ce90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1cea0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1ceb0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1cec0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1ced0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
1cee0 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
1cef0 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
1cf00 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 56  widReg);.      V
1cf10 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1cf20 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b   testOp==OP_Le);
1cf30 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1cf40 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
1cf50 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56  =OP_Lt);.      V
1cf60 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1cf70 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b   testOp==OP_Ge);
1cf80 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1cf90 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
1cfa0 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 73  =OP_Gt);.      s
1cfb0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1cfc0 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
1cfd0 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
1cfe0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1cff0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1d000 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1d010 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
1d020 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34  ){.    /* Case 4
1d030 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61  : A scan using a
1d040 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
1d050 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1d060 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d070 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
1d080 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
1d090 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1d0a0 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
1d0b0 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
1d0c0 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
1d0d0 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20  he N.    **     
1d0e0 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f      left-most co
1d0f0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
1d100 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20  ex. It may also 
1d110 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20  contain.    **  
1d120 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
1d130 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
1d140 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
1d150 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
1d160 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
1d170 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
1d180 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
1d190 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
1d1a0 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  nly .    **     
1d1b0 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f      the right-mo
1d1c0 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
1d1d0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
1d1e0 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
1d1f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73     **         us
1d200 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22  e the "==" and "
1d210 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  IN" operators. F
1d220 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1d230 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  he .    **      
1d240 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28     index is on (
1d250 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65  x,y,z), then the
1d260 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73   following claus
1d270 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20  es are all .    
1d280 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
1d290 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ized:.    **.   
1d2a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1d2b0 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  =5.    **       
1d2c0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
1d2d0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1d2e0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
1d2f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1d300 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41     x=5 AND y>5 A
1d310 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
1d320 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1d330 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a  D y=5 AND z<=10.
1d340 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1d350 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
1d360 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
1d370 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
1d380 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  sed, only.    **
1d390 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
1d3a0 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20   term:.    **.  
1d3b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1d3c0 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
1d3d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1d3e0 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f     N may be zero
1d3f0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
1d400 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1d410 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ints..    **    
1d420 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72       If there ar
1d430 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20  e no inequality 
1d440 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1d450 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a  n N is at.    **
1d460 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f           least o
1d470 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
1d480 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
1d490 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
1d4a0 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
1d4b0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
1d4c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1d4d0 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
1d4e0 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
1d4f0 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
1d500 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  rder.    **     
1d510 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
1d520 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
1d530 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
1d540 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20  RDER BY..    */ 
1d550 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e   .    static con
1d560 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d  st u8 aStartOp[]
1d570 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
1d580 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
1d590 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
1d5a0 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
1d5b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1d5c0 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
1d5d0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
1d5e0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1d5f0 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
1d600 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1d610 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
1d620 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1d630 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  GT,           /*
1d640 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
1d650 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1d660 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
1d670 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54  .      OP_SeekLT
1d680 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
1d690 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1d6a0 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1d6b0 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
1d6c0 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20       OP_SeekGE, 
1d6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
1d6e0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1d6f0 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1d700 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1d710 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20     OP_SeekLE    
1d720 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
1d730 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1d740 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1d750 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
1d760 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1d770 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d  st u8 aEndOp[] =
1d780 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47   {.      OP_IdxG
1d790 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1d7a0 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   0: (end_constra
1d7b0 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26 26  ints && !bRev &&
1d7c0 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20   !endEq) */.    
1d7d0 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20 20    OP_IdxGT,     
1d7e0 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
1d7f0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1d800 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45 71   !bRev &&  endEq
1d810 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1d820 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xLE,            
1d830 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
1d840 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76 20  raints &&  bRev 
1d850 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20  && !endEq) */.  
1d860 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20      OP_IdxLT,   
1d870 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
1d880 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
1d890 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e 64  &&  bRev &&  end
1d8a0 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  Eq) */.    };.  
1d8b0 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f    u16 nEq = pLoo
1d8c0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
1d8d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d8e0 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
1d8f0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61  */.    int regBa
1d900 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1d910 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1d920 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ster holding con
1d930 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a  straint values *
1d940 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
1d950 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30  *pRangeStart = 0
1d960 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79  ;  /* Inequality
1d970 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
1d980 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20  ange start */.  
1d990 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
1d9a0 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f  ngeEnd = 0;    /
1d9b0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
1d9c0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
1d9d0 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
1d9e0 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
1d9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1da00 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
1da10 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
1da20 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64  = */.    int end
1da30 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1da40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1da50 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20   range end uses 
1da60 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
1da70 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f      int start_co
1da80 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20  nstraints;      
1da90 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e   /* Start of ran
1daa0 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  ge is constraine
1dab0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  d */.    int nCo
1dac0 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20  nstraint;       
1dad0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1dae0 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  of constraint te
1daf0 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  rms */.    Index
1db00 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1db10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1db20 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
1db30 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
1db40 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
1db50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1db60 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1db70 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
1db80 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
1db90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1dba0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
1dbb0 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
1dbc0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
1dbd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dbe0 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
1dbf0 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ction opcode */.
1dc00 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74      char *zStart
1dc10 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
1dc20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
1dc30 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   start of range 
1dc40 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
1dc50 20 20 63 68 61 72 20 63 45 6e 64 41 66 66 20 3d    char cEndAff =
1dc60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
1dc70 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65  * Affinity for e
1dc80 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  nd of range cons
1dc90 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38  traint */.    u8
1dca0 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
1dcb0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1dcc0 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74 20  ue to seek past 
1dcd0 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f  initial nulls */
1dce0 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74 4e  .    u8 bStopAtN
1dcf0 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ull = 0;        
1dd00 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74 69    /* Add conditi
1dd10 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  on to terminate 
1dd20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20  at NULLs */..   
1dd30 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
1dd40 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1dd50 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
1dd60 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
1dd70 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 70    assert( nEq>=p
1dd80 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a 0a  Loop->nSkip );..
1dd90 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
1dda0 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
1ddb0 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
1ddc0 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
1ddd0 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
1dde0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1ddf0 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
1de00 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
1de10 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
1de20 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
1de30 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
1de40 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
1de50 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
1de60 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
1de70 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
1de80 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
1de90 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
1dea0 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
1deb0 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
1dec0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
1ded0 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
1dee0 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
1def0 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
1df00 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
1df10 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
1df20 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
1df30 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
1df40 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
1df50 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1df60 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1df70 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20 20  pOrderBy==0.    
1df80 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e       || pWInfo->
1df90 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
1dfa0 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
1dfb0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1dfc0 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
1dfd0 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20  _MIN)==0 );.    
1dfe0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
1dff0 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
1e000 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
1e010 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f     && pWInfo->nO
1e020 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20 28  BSat>0.     && (
1e030 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45  pIdx->nKeyCol>nE
1e040 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
1e050 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 6e  assert( pLoop->n
1e060 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Skip==0 );.     
1e070 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
1e080 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   1;.      nExtra
1e090 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
1e0a0 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20      /* Find any 
1e0b0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1e0c0 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  raint terms for 
1e0d0 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
1e0e0 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
1e0f0 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a   range. .    */.
1e100 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20      j = nEq;.   
1e110 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1e120 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1e130 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1e140 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f  RangeStart = pLo
1e150 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1e160 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1e170 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1e180 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1e190 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
1e1a0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
1e1b0 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d  angeEnd = pLoop-
1e1c0 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1e1d0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1e1e0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 61  1;.      if( pRa
1e1f0 6e 67 65 53 74 61 72 74 0a 20 20 20 20 20 20 20  ngeStart.       
1e200 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
1e210 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1e220 4c 49 4b 45 4f 50 54 29 21 3d 30 0a 20 20 20 20  LIKEOPT)!=0.    
1e230 20 20 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64     && (pRangeEnd
1e240 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1e250 5f 4c 49 4b 45 4f 50 54 29 21 3d 30 0a 20 20 20  _LIKEOPT)!=0.   
1e260 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c     ){.        pL
1e270 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
1e280 74 72 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tr = ++pParse->n
1e290 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
1e2a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e2b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1e2c0 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65   pLevel->iLikeRe
1e2d0 70 43 6e 74 72 29 3b 0a 20 20 20 20 20 20 20 20  pCntr);.        
1e2e0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
1e2f0 52 65 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Rep = sqlite3Vdb
1e300 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1e310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e320 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 3d 3d  f( pRangeStart==
1e330 30 0a 20 20 20 20 20 20 20 26 26 20 28 6a 20 3d  0.       && (j =
1e340 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1e350 6e 45 71 5d 29 3e 3d 30 20 0a 20 20 20 20 20 20  nEq])>=0 .      
1e360 20 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65   && pIdx->pTable
1e370 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c  ->aCol[j].notNul
1e380 6c 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  l==0.      ){.  
1e390 20 20 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e        bSeekPastN
1e3a0 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ull = 1;.      }
1e3b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1e3c0 74 28 20 70 52 61 6e 67 65 45 6e 64 3d 3d 30 20  t( pRangeEnd==0 
1e3d0 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77  || (pRangeEnd->w
1e3e0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1e3f0 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  ULL)==0 );..    
1e400 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1e410 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c   to evaluate all
1e420 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1e430 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e  s using == or IN
1e440 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72  .    ** and stor
1e450 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  e the values of 
1e460 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61  those terms in a
1e470 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
1e480 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
1e490 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e  ting at regBase.
1e4a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42  .    */.    regB
1e4b0 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75  ase = codeAllEqu
1e4c0 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73  alityTerms(pPars
1e4d0 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45  e,pLevel,bRev,nE
1e4e0 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41  xtraReg,&zStartA
1e4f0 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
1e500 20 7a 53 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c   zStartAff==0 ||
1e510 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1e520 28 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e 45 71  (zStartAff)>=nEq
1e530 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 61   );.    if( zSta
1e540 72 74 41 66 66 20 29 20 63 45 6e 64 41 66 66 20  rtAff ) cEndAff 
1e550 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  = zStartAff[nEq]
1e560 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
1e570 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1e580 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
1e590 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72  re doing a rever
1e5a0 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  se order scan on
1e5b0 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
1e5c0 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  dex, or.    ** a
1e5d0 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73   forward order s
1e5e0 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  can on a descend
1e5f0 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72  ing index, inter
1e600 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20  change the .    
1e610 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  ** start and end
1e620 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74   terms (pRangeSt
1e630 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e  art and pRangeEn
1e640 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
1e650 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b  f( (nEq<pIdx->nK
1e660 65 79 43 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28  eyCol && bRev==(
1e670 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1e680 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
1e690 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28  _ASC)).     || (
1e6a0 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b  bRev && pIdx->nK
1e6b0 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20  eyCol==nEq).    
1e6c0 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68  ){.      SWAP(Wh
1e6d0 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67  ereTerm *, pRang
1e6e0 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72  eEnd, pRangeStar
1e6f0 74 29 3b 0a 20 20 20 20 20 20 53 57 41 50 28 75  t);.      SWAP(u
1e700 38 2c 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c  8, bSeekPastNull
1e710 2c 20 62 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a  , bStopAtNull);.
1e720 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
1e730 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
1e740 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74   && (pRangeStart
1e750 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1e760 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _LE)!=0 );.    t
1e770 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
1e780 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53  tart && (pRangeS
1e790 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
1e7a0 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20  & WO_GE)!=0 );. 
1e7b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1e7c0 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67  ngeEnd && (pRang
1e7d0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1e7e0 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20  & WO_LE)!=0 );. 
1e7f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1e800 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67  ngeEnd && (pRang
1e810 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1e820 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20  & WO_GE)!=0 );. 
1e830 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52     startEq = !pR
1e840 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61  angeStart || pRa
1e850 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
1e860 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
1e870 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d  GE);.    endEq =
1e880 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c     !pRangeEnd ||
1e890 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
1e8a0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
1e8b0 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74  O_GE);.    start
1e8c0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70  _constraints = p
1e8d0 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45  RangeStart || nE
1e8e0 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  q>0;..    /* See
1e8f0 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  k the index curs
1e900 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
1e910 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
1e920 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
1e930 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
1e940 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20  pRangeStart ){. 
1e950 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1e960 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d  t = pRangeStart-
1e970 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
1e980 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e990 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
1e9a0 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
1e9b0 71 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  q);.      whereL
1e9c0 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53  ikeOptimizationS
1e9d0 74 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c  tringFixup(v, pL
1e9e0 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  evel);.      if(
1e9f0 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
1ea00 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1ea10 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  ULL)==0.       &
1ea20 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
1ea30 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20  BeNull(pRight). 
1ea40 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1ea50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ea60 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
1ea70 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
1ea80 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56  rNxt);.        V
1ea90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1eaa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1eab0 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20  ( zStartAff ){. 
1eac0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1ead0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1eae0 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  y(pRight, zStart
1eaf0 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
1eb00 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
1eb10 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
1eb20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1eb30 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
1eb40 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
1eb50 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
1eb60 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
1eb70 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
1eb80 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
1eb90 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
1eba0 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
1ebb0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1ebc0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
1ebd0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
1ebe0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1ebf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ec00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1ec10 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
1ec20 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
1ec30 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
1ec40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
1ec50 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53  tartAff[nEq] = S
1ec60 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1ec70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ec80 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  }  .      nConst
1ec90 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
1eca0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
1ecb0 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1ecc0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
1ecd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53      }else if( bS
1ece0 65 65 6b 50 61 73 74 4e 75 6c 6c 20 29 7b 0a 20  eekPastNull ){. 
1ecf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ed00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1ed10 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
1ed20 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  q);.      nConst
1ed30 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  raint++;.      s
1ed40 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
1ed50 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
1ed60 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nts = 1;.    }. 
1ed70 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
1ed80 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
1ed90 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
1eda0 74 20 2d 20 62 53 65 65 6b 50 61 73 74 4e 75 6c  t - bSeekPastNul
1edb0 6c 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  l, zStartAff);. 
1edc0 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
1edd0 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
1ede0 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
1edf0 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
1ee00 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
1ee10 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1ee20 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1ee30 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
1ee40 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
1ee50 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
1ee60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1ee70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1ee80 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1ee90 52 65 77 69 6e 64 29 3b 20 20 74 65 73 74 63 61  Rewind);  testca
1eea0 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  se( op==OP_Rewin
1eeb0 64 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  d );.    VdbeCov
1eec0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1eed0 50 5f 4c 61 73 74 29 3b 20 20 20 20 74 65 73 74  P_Last);    test
1eee0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
1eef0 74 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  t );.    VdbeCov
1ef00 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1ef10 50 5f 53 65 65 6b 47 54 29 3b 20 20 74 65 73 74  P_SeekGT);  test
1ef20 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
1ef30 6b 47 54 20 29 3b 0a 20 20 20 20 56 64 62 65 43  kGT );.    VdbeC
1ef40 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1ef50 3d 4f 50 5f 53 65 65 6b 47 45 29 3b 20 20 74 65  =OP_SeekGE);  te
1ef60 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
1ef70 65 65 6b 47 45 20 29 3b 0a 20 20 20 20 56 64 62  eekGE );.    Vdb
1ef80 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1ef90 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 29 3b 20 20  p==OP_SeekLE);  
1efa0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1efb0 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 56  _SeekLE );.    V
1efc0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1efd0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b   op==OP_SeekLT);
1efe0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1eff0 4f 50 5f 53 65 65 6b 4c 54 20 29 3b 0a 0a 20 20  OP_SeekLT );..  
1f000 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61    /* Load the va
1f010 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71  lue for the ineq
1f020 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1f030 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
1f040 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65  the.    ** range
1f050 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
1f060 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
1f070 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
1f080 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20   pRangeEnd ){.  
1f090 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1f0a0 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45   = pRangeEnd->pE
1f0b0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
1f0c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f0d0 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1f0e0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31  , regBase+nEq, 1
1f0f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f100 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1f110 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
1f120 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 77 68 65  +nEq);.      whe
1f130 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69  reLikeOptimizati
1f140 6f 6e 53 74 72 69 6e 67 46 69 78 75 70 28 76 2c  onStringFixup(v,
1f150 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
1f160 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e  if( (pRangeEnd->
1f170 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1f180 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20  NULL)==0.       
1f190 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
1f1a0 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a  nBeNull(pRight).
1f1b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1f1c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f1d0 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1f1e0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
1f1f0 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20  drNxt);.        
1f200 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1f210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f220 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1f230 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1f240 2c 20 63 45 6e 64 41 66 66 29 21 3d 53 51 4c 49  , cEndAff)!=SQLI
1f250 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20 20 20  TE_AFF_NONE.    
1f260 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 45 78     && !sqlite3Ex
1f270 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1f280 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1f290 63 45 6e 64 41 66 66 29 0a 20 20 20 20 20 20 29  cEndAff).      )
1f2a0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 41 70  {.        codeAp
1f2b0 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
1f2c0 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  se, regBase+nEq,
1f2d0 20 31 2c 20 26 63 45 6e 64 41 66 66 29 3b 0a 20   1, &cEndAff);. 
1f2e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f       }.      nCo
1f2f0 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1f300 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1f310 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
1f320 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1f330 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62  .    }else if( b
1f340 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a 20 20  StopAtNull ){.  
1f350 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f360 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1f370 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
1f380 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71 20 3d  );.      endEq =
1f390 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74   0;.      nConst
1f3a0 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  raint++;.    }. 
1f3b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1f3c0 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  (db, zStartAff);
1f3d0 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  ..    /* Top of 
1f3e0 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f  the loop body */
1f3f0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1f400 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1f410 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
1f420 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
1f430 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
1f440 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
1f450 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
1f460 20 20 20 20 69 66 28 20 6e 43 6f 6e 73 74 72 61      if( nConstra
1f470 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 20  int ){.      op 
1f480 3d 20 61 45 6e 64 4f 70 5b 62 52 65 76 2a 32 20  = aEndOp[bRev*2 
1f490 2b 20 65 6e 64 45 71 5d 3b 0a 20 20 20 20 20 20  + endEq];.      
1f4a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f4b0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
1f4c0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
1f4d0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1f4e0 6e 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  nt);.      testc
1f4f0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
1f500 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  T );  VdbeCovera
1f510 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49  geIf(v, op==OP_I
1f520 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  dxGT );.      te
1f530 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
1f540 64 78 47 45 20 29 3b 20 20 56 64 62 65 43 6f 76  dxGE );  VdbeCov
1f550 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1f560 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 20  P_IdxGE );.     
1f570 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1f580 50 5f 49 64 78 4c 54 20 29 3b 20 20 56 64 62 65  P_IdxLT );  Vdbe
1f590 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1f5a0 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20  ==OP_IdxLT );.  
1f5b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f5c0 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 20 20 56  ==OP_IdxLE );  V
1f5d0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f5e0 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b   op==OP_IdxLE );
1f5f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
1f600 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75  eek the table cu
1f610 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65  rsor, if require
1f620 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65  d */.    disable
1f630 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
1f640 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64  ngeStart);.    d
1f650 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1f660 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20  l, pRangeEnd);. 
1f670 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62 6c 65     if( omitTable
1f680 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49 64   ){.      /* pId
1f690 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  x is a covering 
1f6a0 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20  index.  No need 
1f6b0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d 61  to access the ma
1f6c0 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  in table. */.   
1f6d0 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f   }else if( HasRo
1f6e0 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  wid(pIdx->pTable
1f6f0 29 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  ) ){.      iRowi
1f700 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  dReg = ++pParse-
1f710 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1f720 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f730 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
1f740 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65  IdxCur, iRowidRe
1f750 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1f760 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
1f770 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
1f780 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1f790 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f7a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp2(v, OP_Seek
1f7b0 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
1f7c0 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64  g);  /* Deferred
1f7d0 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 65 6c   seek */.    }el
1f7e0 73 65 20 69 66 28 20 69 43 75 72 21 3d 69 49 64  se if( iCur!=iId
1f7f0 78 43 75 72 20 29 7b 0a 20 20 20 20 20 20 49 6e  xCur ){.      In
1f800 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
1f810 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
1f820 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b  x(pIdx->pTable);
1f830 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1f840 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1f850 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
1f860 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
1f870 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1f880 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
1f890 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73  ){.        k = s
1f8a0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1f8b0 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61  dex(pIdx, pPk->a
1f8c0 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20  iColumn[j]);.   
1f8d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f8e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1f8f0 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c  umn, iIdxCur, k,
1f900 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20   iRowidReg+j);. 
1f910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1f920 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1f930 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
1f940 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f 6e 74  , iCur, addrCont
1f950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 69 52 6f               iRo
1f970 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65  widReg, pPk->nKe
1f980 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
1f990 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20  age(v);.    }.. 
1f9a0 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65     /* Record the
1f9b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65   instruction use
1f9c0 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
1f9d0 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65  he loop. Disable
1f9e0 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63   .    ** WHERE c
1f9f0 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65  lause terms made
1fa00 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68   redundant by th
1fa10 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63  e index range sc
1fa20 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  an..    */.    i
1fa30 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1fa40 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
1fa50 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1fa60 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
1fa70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52      }else if( bR
1fa80 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  ev ){.      pLev
1fa90 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76  el->op = OP_Prev
1faa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fab0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1fac0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  OP_Next;.    }. 
1fad0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1fae0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 70 4c 65  iIdxCur;.    pLe
1faf0 76 65 6c 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70  vel->p3 = (pLoop
1fb00 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1fb10 55 4e 51 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f  UNQ_WANTED)!=0 ?
1fb20 20 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 28 70   1:0;.    if( (p
1fb30 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1fb40 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54  WHERE_CONSTRAINT
1fb50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  )==0 ){.      pL
1fb60 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
1fb70 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
1fb80 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20  LSCAN_STEP;.    
1fb90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1fba0 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
1fbb0 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  =0 );.    }.  }e
1fbc0 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
1fbd0 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
1fbe0 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70  MIZATION.  if( p
1fbf0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1fc00 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
1fc10 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a  {.    /* Case 5:
1fc20 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65    Two or more se
1fc30 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64  parately indexed
1fc40 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
1fc50 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20   by OR.    **.  
1fc60 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1fc70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52    **.    **   CR
1fc80 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
1fc90 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20  b,c,d);.    **  
1fca0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
1fcb0 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a   ON t1(a);.    *
1fcc0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1fcd0 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20   i2 ON t1(b);.  
1fce0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
1fcf0 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b  DEX i3 ON t1(c);
1fd00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fd10 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1fd20 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62  1 WHERE a=5 OR b
1fd30 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20  =7 OR (c=11 AND 
1fd40 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20  d=13).    **.   
1fd50 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70   ** In the examp
1fd60 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68  le, there are th
1fd70 72 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ree indexed term
1fd80 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
1fd90 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f  R..    ** The to
1fda0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f  p of the loop lo
1fdb0 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  oks like this:. 
1fdc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1fdd0 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
1fde0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
1fdf0 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
1fe00 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
1fe10 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c   **.    ** Then,
1fe20 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65   for each indexe
1fe30 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c  d term, the foll
1fe40 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d  owing. The argum
1fe50 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52  ents to.    ** R
1fe60 6f 77 53 65 74 54 65 73 74 20 61 72 65 20 73 75  owSetTest are su
1fe70 63 68 20 74 68 61 74 20 74 68 65 20 72 6f 77 69  ch that the rowi
1fe80 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
1fe90 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64   row is inserted
1fea0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
1feb0 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69   RowSet. If it i
1fec0 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
1fed0 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73  t, control skips
1fee0 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75   the.    ** Gosu
1fef0 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d  b opcode and jum
1ff00 70 73 20 73 74 72 61 69 67 68 74 20 74 6f 20 74  ps straight to t
1ff10 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
1ff20 64 20 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e  d by WhereEnd().
1ff30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ff40 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
1ff50 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a  reBegin(<term>).
1ff60 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1ff70 52 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 20  RowSetTest      
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 23 20 49 6e              # In
1ff90 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20  sert rowid into 
1ffa0 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20  rowset.    **   
1ffb0 20 20 20 20 20 20 20 47 6f 73 75 62 20 20 20 20         Gosub    
1ffc0 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20    2 A.    **    
1ffd0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1ffe0 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20  End().    **.   
1fff0 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** Following th
20000 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f  e above, code to
20010 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
20020 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68  oop. Label A, th
20030 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20  e target.    ** 
20040 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f  of the Gosub abo
20050 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65  ve, jumps to the
20060 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67   instruction rig
20070 68 74 20 61 66 74 65 72 20 74 68 65 20 47 6f 74  ht after the Got
20080 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  o..    **.    **
20090 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
200a0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
200b0 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
200c0 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
200d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
200e0 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20   Goto       B   
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 54               # T
20100 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73  he loop is finis
20110 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  hed..    **.    
20120 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f  **       A: <loo
20130 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20  p body>         
20140 20 20 20 20 20 20 20 20 23 20 52 65 74 75 72 6e          # Return
20150 20 64 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e   data, whatever.
20160 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
20170 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20          Return  
20180 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
20190 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20      # Jump back 
201a0 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20  to the Gosub.   
201b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
201c0 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c   B: <after the l
201d0 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oop>.    **.    
201e0 2a 2a 20 41 64 64 65 64 20 32 30 31 34 2d 30 35  ** Added 2014-05
201f0 2d 32 36 3a 20 49 66 20 74 68 65 20 74 61 62 6c  -26: If the tabl
20200 65 20 69 73 20 61 20 57 49 54 48 4f 55 54 20 52  e is a WITHOUT R
20210 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65 6e  OWID table, then
20220 0a 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 20 65  .    ** use an e
20230 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 69  phemeral index i
20240 6e 73 74 65 61 64 20 6f 66 20 61 20 52 6f 77 53  nstead of a RowS
20250 65 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  et to record the
20260 20 70 72 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20   primary.    ** 
20270 6b 65 79 73 20 6f 66 20 74 68 65 20 72 6f 77 73  keys of the rows
20280 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79   we have already
20290 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20   seen..    **.  
202a0 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c    */.    WhereCl
202b0 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
202c0 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65  /* The OR-clause
202d0 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
202e0 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20   subterms */.   
202f0 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62   SrcList *pOrTab
20300 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74  ;       /* Short
20310 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20  ened table list 
20320 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e  or OR-clause gen
20330 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49  eration */.    I
20340 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20  ndex *pCov = 0; 
20350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
20360 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e  otential coverin
20370 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c  g index (or NULL
20380 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  ) */.    int iCo
20390 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  vCur = pParse->n
203a0 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f  Tab++;  /* Curso
203b0 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78  r used for index
203c0 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29 20   scans (if any) 
203d0 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52  */..    int regR
203e0 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
203f0 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
20400 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73    /* Register us
20410 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62  ed with OP_Gosub
20420 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
20430 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  owset = 0;      
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20450 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
20460 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  r RowSet object 
20470 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
20480 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204a0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
204b0 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20  ding rowid */.  
204c0 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20    int iLoopBody 
204d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
204e0 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53  eLabel(v);  /* S
204f0 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64  tart of loop bod
20500 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65  y */.    int iRe
20510 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20530 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
20540 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20   regReturn init 
20550 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73  */.    int untes
20560 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20  tedTerms = 0;   
20570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d            /* Som
20580 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70  e terms not comp
20590 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f  letely tested */
205a0 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
205d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75  counter */.    u
205e0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20 20  16 wctrlFlags;  
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
20610 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20  ub-WHERE clause 
20620 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e  */.    Expr *pAn
20630 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20  dExpr = 0;      
20640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
20650 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65  ".. AND (...)" e
20660 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
20670 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
20680 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
20690 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70    .    pTerm = p
206a0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
206b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
206c0 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
206d0 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
206e0 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b  rator & WO_OR );
206f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
20700 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
20710 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29  ERM_ORINFO)!=0 )
20720 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70  ;.    pOrWc = &p
20730 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
20740 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  >wc;.    pLevel-
20750 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b  >op = OP_Return;
20760 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
20770 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20  = regReturn;..  
20780 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65    /* Set up a ne
20790 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72  w SrcList in pOr
207a0 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  Tab containing t
207b0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73  he table being s
207c0 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79  canned.    ** by
207d0 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68   this loop in th
207e0 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20  e a[0] slot and 
207f0 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62  all notReady tab
20800 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c  les in a[1..] sl
20810 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  ots..    ** This
20820 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63   becomes the Src
20830 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75  List in the recu
20840 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71  rsive call to sq
20850 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
20860 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
20870 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
20880 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
20890 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20  nNotReady;      
208a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
208b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52  e number of notR
208c0 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20  eady tables */. 
208d0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
208e0 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72  ist_item *origSr
208f0 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  c;     /* Origin
20900 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65  al list of table
20910 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52  s */.      nNotR
20920 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  eady = pWInfo->n
20930 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d  Level - iLevel -
20940 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62   1;.      pOrTab
20950 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41   = sqlite3StackA
20960 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20  llocRaw(db,.    
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
20990 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61  pOrTab)+ nNotRea
209a0 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  dy*sizeof(pOrTab
209b0 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[0]));.      
209c0 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20  if( pOrTab==0 ) 
209d0 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b  return notReady;
209e0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
209f0 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f  Alloc = (u8)(nNo
20a00 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20  tReady + 1);.   
20a10 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20     pOrTab->nSrc 
20a20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63  = pOrTab->nAlloc
20a30 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
20a40 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74  OrTab->a, pTabIt
20a50 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62  em, sizeof(*pTab
20a60 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72  Item));.      or
20a70 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e  igSrc = pWInfo->
20a80 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pTabList->a;.   
20a90 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e     for(k=1; k<=n
20aa0 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a  NotReady; k++){.
20ab0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
20ac0 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f  pOrTab->a[k], &o
20ad0 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d  rigSrc[pLevel[k]
20ae0 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28  .iFrom], sizeof(
20af0 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a  pOrTab->a[k]));.
20b00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
20b10 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  e{.      pOrTab 
20b20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
20b30 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  st;.    }..    /
20b40 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
20b50 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72   rowset register
20b60 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c   to contain NULL
20b70 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73  . An SQL NULL is
20b80 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c   .    ** equival
20b90 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ent to an empty 
20ba0 72 6f 77 73 65 74 2e 20 20 4f 72 2c 20 63 72 65  rowset.  Or, cre
20bb0 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
20bc0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
20bd0 70 61 62 6c 65 20 6f 66 20 68 6f 6c 64 69 6e 67  pable of holding
20be0 20 70 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e   primary keys in
20bf0 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 57   the case of a W
20c00 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 20 20  ITHOUT ROWID..  
20c10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
20c20 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52   initialize regR
20c30 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e  eturn to contain
20c40 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
20c50 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
20c60 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74  .    ** immediat
20c70 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
20c80 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74  e OP_Return at t
20c90 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
20ca0 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20   loop. This.    
20cb0 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69  ** is required i
20cc0 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20  n a few obscure 
20cd0 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20  LEFT JOIN cases 
20ce0 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75  where control ju
20cf0 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20  mps.    ** over 
20d00 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  the top of the l
20d10 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  oop into the bod
20d20 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73  y of it. In this
20d30 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a   case the .    *
20d40 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e  * correct respon
20d50 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f  se for the end-o
20d60 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65  f-loop code (the
20d70 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74   OP_Return) is t
20d80 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74  o .    ** fall t
20d90 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
20da0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  xt instruction, 
20db0 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65  just as an OP_Ne
20dc0 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a  xt does if.    *
20dd0 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75  * called on an u
20de0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72  ninitialized cur
20df0 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  sor..    */.    
20e00 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
20e10 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
20e20 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
20e30 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48  0 ){.      if( H
20e40 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
20e50 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 73  .        regRows
20e60 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
20e70 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
20e80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20e90 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
20ea0 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 20 20  gRowset);.      
20eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 49  }else{.        I
20ec0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
20ed0 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
20ee0 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
20ef0 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 70 50    regRowset = pP
20f00 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
20f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20f20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
20f30 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 72 65 67  enEphemeral, reg
20f40 52 6f 77 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b 65  Rowset, pPk->nKe
20f50 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  yCol);.        s
20f60 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
20f70 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
20f80 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pk);.      }.   
20f90 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
20fa0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
20fb0 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74    }.    iRetInit
20fc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
20fd0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
20fe0 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e  er, 0, regReturn
20ff0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
21000 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
21010 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20   clause is z of 
21020 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f  the form:  (x1 O
21030 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44  R x2 OR ...) AND
21040 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66   y.    ** Then f
21050 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e  or every term xN
21060 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68  , evaluate as th
21070 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a  e subexpression:
21080 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a   xN AND z.    **
21090 20 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73   That way, terms
210a0 20 69 6e 20 79 20 74 68 61 74 20 61 72 65 20 66   in y that are f
210b0 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65  actored into the
210c0 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c   disjunction wil
210d0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b  l.    ** be pick
210e0 65 64 20 75 70 20 62 79 20 74 68 65 20 72 65 63  ed up by the rec
210f0 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20  ursive calls to 
21100 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21110 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  n() below..    *
21120 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c  *.    ** Actuall
21130 79 2c 20 65 61 63 68 20 73 75 62 65 78 70 72 65  y, each subexpre
21140 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74  ssion is convert
21150 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22  ed to "xN AND w"
21160 20 77 68 65 72 65 20 77 20 69 73 0a 20 20 20 20   where w is.    
21170 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73 74  ** the "interest
21180 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20  ing" terms of z 
21190 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64 69 64  - terms that did
211a0 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
211b0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20  n the.    ** ON 
211c0 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
211d0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
211e0 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20 61  and terms that a
211f0 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20  re usable as .  
21200 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20    ** indices..  
21210 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
21220 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c   optimization al
21230 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  so only applies 
21240 69 66 20 74 68 65 20 28 78 31 20 4f 52 20 78 32  if the (x1 OR x2
21250 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20   OR ...) term.  
21260 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74    ** is not cont
21270 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ained in the ON 
21280 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
21290 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65   JOIN..    ** Se
212a0 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f  e ticket http://
212b0 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
212c0 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34  rc/info/f2369304
212d0 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e4.    */.    if
212e0 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29  ( pWC->nTerm>1 )
212f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72  {.      int iTer
21300 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65  m;.      for(iTe
21310 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d  rm=0; iTerm<pWC-
21320 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29  >nTerm; iTerm++)
21330 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
21340 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69  pExpr = pWC->a[i
21350 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20  Term].pExpr;.   
21360 20 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61       if( &pWC->a
21370 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d  [iTerm] == pTerm
21380 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21390 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
213a0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
213b0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63  EP_FromJoin) ) c
213c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
213d0 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65   if( (pWC->a[iTe
213e0 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 54 45  rm].wtFlags & TE
213f0 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29  RM_VIRTUAL)!=0 )
21400 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21410 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
21420 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20  Term].eOperator 
21430 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63  & WO_ALL)==0 ) c
21440 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
21450 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e   testcase( pWC->
21460 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73  a[iTerm].wtFlags
21470 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
21480 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
21490 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
214a0 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
214b0 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
214c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
214d0 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20  d(db, pAndExpr, 
214e0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
214f0 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
21500 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  pr ){.        pA
21510 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
21520 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
21530 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70  _AND, 0, pAndExp
21540 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
21550 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e     }..    /* Run
21560 20 61 20 73 65 70 61 72 61 74 65 20 57 48 45 52   a separate WHER
21570 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
21580 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  h term of the OR
21590 20 63 6c 61 75 73 65 2e 20 20 41 66 74 65 72 0a   clause.  After.
215a0 20 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61 74 69      ** eliminati
215b0 6e 67 20 64 75 70 6c 69 63 61 74 65 73 20 66 72  ng duplicates fr
215c0 6f 6d 20 6f 74 68 65 72 20 57 48 45 52 45 20 63  om other WHERE c
215d0 6c 61 75 73 65 73 2c 20 74 68 65 20 61 63 74 69  lauses, the acti
215e0 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  on for each.    
215f0 2a 2a 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  ** sub-WHERE cla
21600 75 73 65 20 69 73 20 74 6f 20 74 6f 20 69 6e 76  use is to to inv
21610 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  oke the main loo
21620 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62 72  p body as a subr
21630 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
21640 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20     wctrlFlags = 
21650 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
21660 5f 43 4c 4f 53 45 0a 20 20 20 20 20 20 20 20 20  _CLOSE.         
21670 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 46         | WHERE_F
21680 4f 52 43 45 5f 54 41 42 4c 45 0a 20 20 20 20 20  ORCE_TABLE.     
21690 20 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45             | WHE
216a0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
216b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
216c0 20 7c 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f   | WHERE_NO_AUTO
216d0 49 4e 44 45 58 3b 0a 20 20 20 20 66 6f 72 28 69  INDEX;.    for(i
216e0 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e  i=0; ii<pOrWc->n
216f0 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
21700 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
21710 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e  rTerm = &pOrWc->
21720 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  a[ii];.      if(
21730 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
21740 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70  rsor==iCur || (p
21750 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
21760 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
21770 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49  {.        WhereI
21780 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20  nfo *pSubWInfo; 
21790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
217a0 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
217b0 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
217c0 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
217d0 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
217e0 78 70 72 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  xpr; /* Current 
217f0 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  OR clause term *
21800 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31  /.        int j1
21810 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
21830 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 6f 70 65  ress of jump ope
21840 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
21850 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 26    if( pAndExpr &
21860 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
21870 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46  ty(pOrExpr, EP_F
21880 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
21890 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
218a0 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b  pLeft = pOrExpr;
218b0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45 78  .          pOrEx
218c0 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20  pr = pAndExpr;. 
218d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
218e0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
218f0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
21900 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
21910 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
21920 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
21930 66 66 66 66 2c 20 28 22 53 75 62 70 6c 61 6e 20  ffff, ("Subplan 
21940 66 6f 72 20 4f 52 2d 63 6c 61 75 73 65 3a 5c 6e  for OR-clause:\n
21950 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75  "));.        pSu
21960 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  bWInfo = sqlite3
21970 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
21980 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78  e, pOrTab, pOrEx
21990 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  pr, 0, 0,.      
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 77 63 74 72 6c 46 6c 61 67 73 2c 20 69 43 6f 76  wctrlFlags, iCov
219d0 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Cur);.        as
219e0 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20  sert( pSubWInfo 
219f0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
21a00 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
21a10 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
21a20 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a  f( pSubWInfo ){.
21a30 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c            WhereL
21a40 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20  oop *pSubLoop;. 
21a50 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64           int add
21a60 72 45 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  rExplain = expla
21a70 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
21a80 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
21a90 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49   pOrTab, &pSubWI
21aa0 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65  nfo->a[0], iLeve
21ab0 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  l, pLevel->iFrom
21ac0 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b  , 0.          );
21ad0 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 53 63  .          addSc
21ae0 61 6e 53 74 61 74 75 73 28 76 2c 20 70 4f 72 54  anStatus(v, pOrT
21af0 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e  ab, &pSubWInfo->
21b00 61 5b 30 5d 2c 20 61 64 64 72 45 78 70 6c 61 69  a[0], addrExplai
21b10 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  n);..          /
21b20 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 73 75  * This is the su
21b30 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20 62  b-WHERE clause b
21b40 6f 64 79 2e 20 20 46 69 72 73 74 20 73 6b 69 70  ody.  First skip
21b50 20 6f 76 65 72 0a 20 20 20 20 20 20 20 20 20 20   over.          
21b60 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  ** duplicate row
21b70 73 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62  s from prior sub
21b80 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20  -WHERE clauses, 
21b90 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 0a 20  and record the. 
21ba0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
21bb0 64 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  d (or PRIMARY KE
21bc0 59 29 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  Y) for the curre
21bd0 6e 74 20 72 6f 77 20 73 6f 20 74 68 61 74 20 74  nt row so that t
21be0 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20  he same.        
21bf0 20 20 2a 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65    ** row will be
21c00 20 73 6b 69 70 70 65 64 20 69 6e 20 73 75 62 73   skipped in subs
21c10 65 71 75 65 6e 74 20 73 75 62 2d 57 48 45 52 45  equent sub-WHERE
21c20 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20   clauses..      
21c30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
21c40 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
21c50 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
21c60 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
21c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
21c80 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
21c90 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20       int iSet = 
21ca0 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65  ((ii==pOrWc->nTe
21cb0 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20  rm-1)?-1:ii);.  
21cc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 48 61            if( Ha
21cd0 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 20                r 
21cf0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
21d00 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
21d10 65 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69 43 75  e, pTab, -1, iCu
21d20 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b  r, regRowid, 0);
21d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a  .              j
21d40 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
21d50 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52  ddOp4Int(v, OP_R
21d60 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f  owSetTest, regRo
21d70 77 73 65 74 2c 20 30 2c 20 72 2c 69 53 65 74 29  wset, 0, r,iSet)
21d80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21d90 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
21da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
21db0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
21dc0 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
21dd0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
21de0 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
21df0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
21e00 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk = pPk->nKeyCo
21e10 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
21e20 20 69 6e 74 20 69 50 6b 3b 0a 0a 20 20 20 20 20   int iPk;..     
21e30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
21e40 20 74 68 65 20 50 4b 20 69 6e 74 6f 20 61 6e 20   the PK into an 
21e50 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65  array of temp re
21e60 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20  gisters. */.    
21e70 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71            r = sq
21e80 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
21e90 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 29 3b 0a  e(pParse, nPk);.
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
21eb0 72 28 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b  r(iPk=0; iPk<nPk
21ec0 3b 20 69 50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iPk++){.      
21ed0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
21ee0 6f 6c 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  ol = pPk->aiColu
21ef0 6d 6e 5b 69 50 6b 5d 3b 0a 20 20 20 20 20 20 20  mn[iPk];.       
21f00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21f10 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
21f20 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
21f30 69 43 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69 50  iCol, iCur, r+iP
21f40 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
21f50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
21f60 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
21f70 66 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  f the temp table
21f80 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
21f90 73 20 74 68 69 73 20 6b 65 79 2e 20 49 66 20 73  s this key. If s
21fa0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
21fb0 20 2a 2a 20 74 68 65 20 72 6f 77 20 68 61 73 20   ** the row has 
21fc0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
21fd0 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 73  luded in the res
21fe0 75 6c 74 20 73 65 74 20 61 6e 64 0a 20 20 20 20  ult set and.    
21ff0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e            ** can
22000 20 62 65 20 69 67 6e 6f 72 65 64 20 28 62 79 20   be ignored (by 
22010 6a 75 6d 70 69 6e 67 20 70 61 73 74 20 74 68 65  jumping past the
22020 20 47 6f 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f   Gosub below). O
22030 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
22040 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
22050 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74  t the key into t
22060 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6e  he temp table an
22070 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 70  d proceed with p
22080 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
22090 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72          ** the r
220a0 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow..            
220b0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
220c0 20 20 20 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f     ** Use some o
220d0 66 20 74 68 65 20 73 61 6d 65 20 6f 70 74 69 6d  f the same optim
220e0 69 7a 61 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52  izations as OP_R
220f0 6f 77 53 65 74 54 65 73 74 3a 20 49 66 20 69 53  owSetTest: If iS
22100 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  et.             
22110 20 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 61 73 73   ** is zero, ass
22120 75 6d 65 20 74 68 61 74 20 74 68 65 20 6b 65 79  ume that the key
22130 20 63 61 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20   cannot already 
22140 62 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20  be present in.  
22150 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
22160 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 41  he temp table. A
22170 6e 64 20 69 66 20 69 53 65 74 20 69 73 20 2d 31  nd if iSet is -1
22180 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
22190 65 72 65 20 69 73 20 6e 6f 20 0a 20 20 20 20 20  ere is no .     
221a0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
221b0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 6b   to insert the k
221c0 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ey into the temp
221d0 20 74 61 62 6c 65 2c 20 61 73 20 69 74 20 77 69   table, as it wi
221e0 6c 6c 20 6e 65 76 65 72 20 0a 20 20 20 20 20 20  ll never .      
221f0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 74 65          ** be te
22200 73 74 65 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20  sted for.  */ . 
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
22220 20 69 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20   iSet ){.       
22230 20 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71           j1 = sq
22240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
22250 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
22260 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c  regRowset, 0, r,
22270 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20   nPk);.         
22280 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
22290 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
222a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
222b0 20 20 20 20 20 20 69 66 28 20 69 53 65 74 3e 3d        if( iSet>=
222c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
222d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
222e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
222f0 65 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c  eRecord, r, nPk,
22300 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
22310 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
22320 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
22330 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 72   OP_IdxInsert, r
22340 65 67 52 6f 77 73 65 74 2c 20 72 65 67 52 6f 77  egRowset, regRow
22350 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  id, 0);.        
22360 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74          if( iSet
22370 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
22380 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
22390 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
223a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
223b0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
223c0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 61  /* Release the a
223d0 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67  rray of temp reg
223e0 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  isters */.      
223f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
22400 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
22410 70 50 61 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b  pParse, r, nPk);
22420 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
22430 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
22440 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20        /* Invoke 
22450 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f  the main loop bo
22460 64 79 20 61 73 20 61 20 73 75 62 72 6f 75 74 69  dy as a subrouti
22470 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
22480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22490 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
224a0 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42  egReturn, iLoopB
224b0 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ody);..         
224c0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 28 73   /* Jump here (s
224d0 6b 69 70 70 69 6e 67 20 74 68 65 20 6d 61 69 6e  kipping the main
224e0 20 6c 6f 6f 70 20 62 6f 64 79 20 73 75 62 72 6f   loop body subro
224f0 75 74 69 6e 65 29 20 69 66 20 74 68 65 0a 20 20  utine) if the.  
22500 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65          ** curre
22510 6e 74 20 73 75 62 2d 57 48 45 52 45 20 72 6f 77  nt sub-WHERE row
22520 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
22530 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57  from prior sub-W
22540 48 45 52 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20  HEREs. */.      
22550 20 20 20 20 69 66 28 20 6a 31 20 29 20 73 71 6c      if( j1 ) sql
22560 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
22570 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 20 20  (v, j1);..      
22580 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57      /* The pSubW
22590 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
225a0 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  rms flag means t
225b0 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d  hat this OR term
225c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
225d0 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d  ntained one or m
225e0 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f  ore AND term fro
225f0 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62  m a notReady tab
22600 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  le.  The.       
22610 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d     ** terms from
22620 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61   the notReady ta
22630 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ble could not be
22640 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c   tested and will
22650 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  .          ** ne
22660 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ed to be tested 
22670 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20  later..         
22680 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
22690 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  ( pSubWInfo->unt
226a0 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74  estedTerms ) unt
226b0 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
226c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
226d0 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63   all of the OR-c
226e0 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61  onnected terms a
226f0 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  re optimized usi
22700 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  ng the same.    
22710 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20        ** index, 
22720 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73  and the index is
22730 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
22740 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75  e same cursor nu
22750 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  mber.          *
22760 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74  * by each call t
22770 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
22780 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68  gin() made by th
22790 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a  is loop, it may.
227a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
227b0 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
227c0 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61 20  that index as a 
227d0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
227e0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
227f0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
22800 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
22810 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f  WhereBegin() abo
22820 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61  ve resulted in a
22830 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20   scan that.     
22840 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20       ** uses an 
22850 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20  index, and this 
22860 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66 69  is either the fi
22870 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  rst OR-connected
22880 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
22890 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20  ** processed or 
228a0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68 65  the index is the
228b0 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75 73   same as that us
228c0 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f  ed by all previo
228d0 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
228e0 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20  terms, set pCov 
228f0 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  to the candidate
22900 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
22910 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
22920 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43  .          ** pC
22930 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e  ov to NULL to in
22940 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63  dicate that no c
22950 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
22960 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20  g index will .  
22970 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76          ** be av
22980 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ailable..       
22990 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
229a0 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57  pSubLoop = pSubW
229b0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
229c0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
229d0 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e  ert( (pSubLoop->
229e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
229f0 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29  AUTO_INDEX)==0 )
22a00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22a10 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (pSubLoop->wsFla
22a20 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
22a30 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)!=0.         
22a40 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70    && (ii==0 || p
22a50 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
22a60 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20  .pIndex==pCov). 
22a70 20 20 20 20 20 20 20 20 20 20 26 26 20 28 48 61            && (Ha
22a80 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
22a90 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
22aa0 65 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62  ex(pSubLoop->u.b
22ab0 74 72 65 65 2e 70 49 6e 64 65 78 29 29 0a 20 20  tree.pIndex)).  
22ac0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
22ad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22ae0 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69  SubWInfo->a[0].i
22af0 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20  IdxCur==iCovCur 
22b00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
22b10 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e  Cov = pSubLoop->
22b20 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
22b30 20 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72              wctr
22b40 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
22b50 52 45 4f 50 45 4e 5f 49 44 58 3b 0a 20 20 20 20  REOPEN_IDX;.    
22b60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22b70 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
22b80 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  0;.          }..
22b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
22ba0 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72  ish the loop thr
22bb0 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
22bc0 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
22bd0 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
22be0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22bf0 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e  WhereEnd(pSubWIn
22c00 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fo);.        }. 
22c10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22c20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
22c30 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69  dx = pCov;.    i
22c40 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c  f( pCov ) pLevel
22c50 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76  ->iIdxCur = iCov
22c60 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e  Cur;.    if( pAn
22c70 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  dExpr ){.      p
22c80 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  AndExpr->pLeft =
22c90 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
22ca0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
22cb0 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d  pAndExpr);.    }
22cc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22cd0 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74  ChangeP1(v, iRet
22ce0 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62  Init, sqlite3Vdb
22cf0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
22d00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22d10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
22d20 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
22d30 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c  ddrBrk);.    sql
22d40 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
22d50 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64  abel(v, iLoopBod
22d60 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49  y);..    if( pWI
22d70 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20  nfo->nLevel>1 ) 
22d80 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65  sqlite3StackFree
22d90 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20  (db, pOrTab);.  
22da0 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54    if( !untestedT
22db0 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65  erms ) disableTe
22dc0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
22dd0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
22de0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
22df0 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
22e00 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20   */..  {.    /* 
22e10 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69  Case 6:  There i
22e20 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
22e30 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
22e40 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
22e50 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
22e60 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
22e70 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  le..    */.    s
22e80 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
22e90 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65  Step[] = { OP_Ne
22ea0 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20  xt, OP_Prev };. 
22eb0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
22ec0 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20  u8 aStart[] = { 
22ed0 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61  OP_Rewind, OP_La
22ee0 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  st };.    assert
22ef0 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65  ( bRev==0 || bRe
22f00 76 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  v==1 );.    if( 
22f10 70 54 61 62 49 74 65 6d 2d 3e 69 73 52 65 63 75  pTabItem->isRecu
22f20 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f  rsive ){.      /
22f30 2a 20 54 61 62 6c 65 73 20 6d 61 72 6b 65 64 20  * Tables marked 
22f40 69 73 52 65 63 75 72 73 69 76 65 20 68 61 76 65  isRecursive have
22f50 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
22f60 6f 77 20 74 68 61 74 20 69 73 20 73 74 6f 72 65  ow that is store
22f70 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  d in.      ** a 
22f80 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20  pseudo-cursor.  
22f90 4e 6f 20 6e 65 65 64 20 74 6f 20 52 65 77 69 6e  No need to Rewin
22fa0 64 20 6f 72 20 4e 65 78 74 20 73 75 63 68 20 63  d or Next such c
22fb0 75 72 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20  ursors. */.     
22fc0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
22fd0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  _Noop;.    }else
22fe0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
22ff0 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d  op = aStep[bRev]
23000 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
23010 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
23020 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
23030 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
23040 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
23050 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
23060 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rk);.      VdbeC
23070 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
23080 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62  v==0);.      Vdb
23090 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
230a0 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70  Rev!=0);.      p
230b0 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
230c0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
230d0 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
230e0 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
230f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
23100 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 70  T_SCANSTATUS.  p
23110 4c 65 76 65 6c 2d 3e 61 64 64 72 56 69 73 69 74  Level->addrVisit
23120 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
23130 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 23 65  rrentAddr(v);.#e
23140 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  ndif..  /* Inser
23150 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
23160 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
23170 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
23180 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
23190 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
231a0 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
231b0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
231c0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
231d0 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
231e0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
231f0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
23200 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
23210 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
23220 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
23230 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
23240 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
23250 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
23260 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
23270 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
23280 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
23290 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
232a0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
232b0 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
232c0 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
232d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
232e0 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
232f0 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
23300 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
23310 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
23320 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
23330 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
23340 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
23350 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
23360 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
23370 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
23380 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
23390 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
233a0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
233b0 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
233c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
233d0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
233e0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
233f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23400 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
23410 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
23420 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
23430 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
23440 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
23450 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
23460 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
23470 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
23480 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
23490 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
234a0 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
234b0 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
234c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
234d0 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
234e0 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
234f0 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
23500 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
23510 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
23520 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
23530 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
23540 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
23550 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
23560 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
23570 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
23580 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
23590 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
235a0 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
235b0 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
235c0 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
235d0 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
235e0 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
235f0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
23600 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a  pr *pE, *pEAlt;.
23610 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
23620 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65  Alt;.    if( pTe
23630 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
23640 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
23650 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
23660 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
23670 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57  m->eOperator!=(W
23680 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29  O_EQUIV|WO_EQ) )
23690 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
236a0 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
236b0 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e  rsor!=iCur ) con
236c0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
236d0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
236e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
236f0 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
23700 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
23710 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
23720 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
23730 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
23740 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
23750 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  ight & pLevel->n
23760 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
23770 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
23780 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
23790 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
237a0 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
237b0 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
237c0 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
237d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
237e0 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
237f0 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
23800 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
23810 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
23820 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
23830 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
23840 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
23850 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
23860 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
23870 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72  nt((v, "begin tr
23880 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
23890 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c  int"));.    pEAl
238a0 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  t = sqlite3Stack
238b0 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  AllocRaw(db, siz
238c0 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20  eof(*pEAlt));.  
238d0 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20    if( pEAlt ){. 
238e0 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70       *pEAlt = *p
238f0 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
23900 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d    pEAlt->pLeft =
23910 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20   pE->pLeft;.    
23920 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
23930 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 41  alse(pParse, pEA
23940 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  lt, addrCont, SQ
23950 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
23960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
23970 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41  tackFree(db, pEA
23980 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  lt);.    }.  }..
23990 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
239a0 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
239b0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
239c0 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
239d0 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74  act that.  ** at
239e0 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f   least one row o
239f0 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
23a00 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68  e has matched th
23a10 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a  e left table.  .
23a20 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
23a30 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
23a40 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
23a50 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56  First = sqlite3V
23a60 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
23a70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
23a80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
23a90 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65  nteger, 1, pLeve
23aa0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
23ab0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
23ac0 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20  v, "record LEFT 
23ad0 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
23ae0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
23af0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
23b00 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
23b10 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43  C->a, j=0; j<pWC
23b20 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  ->nTerm; j++, pT
23b30 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65  erm++){.      te
23b40 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
23b50 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
23b60 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74  RTUAL );.      t
23b70 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
23b80 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
23b90 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
23ba0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
23bb0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
23bc0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
23bd0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
23be0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
23bf0 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
23c00 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
23c10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
23c20 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
23c30 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
23c40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23c50 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
23c60 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
23c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23c80 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
23c90 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
23ca0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
23cb0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
23cc0 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
23cd0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
23ce0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
23cf0 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  turn pLevel->not
23d00 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  Ready;.}..#ifdef
23d10 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
23d20 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
23d30 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
23d40 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
23d50 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
23d60 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
23d70 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
23d80 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20  , int iTerm){.  
23d90 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a  if( pTerm==0 ){.
23da0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23db0 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33  Printf("TERM-%-3
23dc0 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d  d NULL\n", iTerm
23dd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23de0 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20  char zType[4];. 
23df0 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c     memcpy(zType,
23e00 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20   "...", 4);.    
23e10 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
23e20 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
23e30 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27  L ) zType[0] = '
23e40 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  V';.    if( pTer
23e50 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
23e60 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65  O_EQUIV  ) zType
23e70 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69  [1] = 'E';.    i
23e80 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
23e90 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
23ea0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
23eb0 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a  zType[2] = 'L';.
23ec0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23ed0 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33  Printf("TERM-%-3
23ee0 64 20 25 70 20 25 73 20 63 75 72 73 6f 72 3d 25  d %p %s cursor=%
23ef0 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70  -3d prob=%-3d op
23f00 3d 30 78 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  =0x%03x\n",.    
23f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f20 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c     iTerm, pTerm,
23f30 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e 6c   zType, pTerm->l
23f40 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d  eftCursor, pTerm
23f50 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20  ->truthProb,.   
23f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f70 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
23f80 61 74 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ator);.    sqlit
23f90 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30  e3TreeViewExpr(0
23fa0 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
23fb0 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  0);.  }.}.#endif
23fc0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
23fd0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
23fe0 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
23ff0 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
24000 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
24010 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
24020 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
24030 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
24040 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
24050 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
24060 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
24070 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  fo;.  int nb = 1
24080 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  +(pWInfo->pTabLi
24090 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20  st->nSrc+7)/8;. 
240a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
240b0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57  item *pItem = pW
240c0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
240d0 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
240e0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
240f0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
24100 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24110 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
24120 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
24150 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
24160 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
24170 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24180 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
241b0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
241c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
241d0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
241e0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
241f0 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
24200 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
24210 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  e;.    if( p->u.
24220 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
24230 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
24240 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
24250 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
24260 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
24270 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
24280 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
24290 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
242a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
242b0 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
242c0 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
242d0 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
242e0 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
242f0 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
24300 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24310 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
24320 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
24330 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
24340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
24350 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24360 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
24370 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
24380 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
24390 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
243a0 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
243b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
243c0 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
243d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243e0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
243f0 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
24400 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
24410 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
24420 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
24430 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
24440 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
24450 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
24460 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
24470 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24480 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
24490 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
244a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
244b0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46    }.  if( p->wsF
244c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
244d0 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c  PSCAN ){.    sql
244e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
244f0 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c  " f %05x %d-%d",
24500 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
24510 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29  nLTerm,p->nSkip)
24520 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
24530 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24540 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22  f(" f %05x N %d"
24550 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
24560 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  >nLTerm);.  }.  
24570 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24580 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
24590 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
245a0 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
245b0 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  ut);.  if( p->nL
245c0 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33  Term && (sqlite3
245d0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
245e0 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  00)!=0 ){.    in
245f0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
24600 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69  ; i<p->nLTerm; i
24610 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
24620 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54  TermPrint(p->aLT
24630 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  erm[i], i);.    
24640 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
24650 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75  /*.** Convert bu
24660 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61  lk memory into a
24670 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70   valid WhereLoop
24680 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73   that can be pas
24690 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c  sed.** to whereL
246a0 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73  oopClear harmles
246b0 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sly..*/.static v
246c0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  oid whereLoopIni
246d0 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  t(WhereLoop *p){
246e0 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
246f0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20  ->aLTermSpace;. 
24700 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a   p->nLTerm = 0;.
24710 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72    p->nLSlot = Ar
24720 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72  raySize(p->aLTer
24730 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73  mSpace);.  p->ws
24740 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Flags = 0;.}../*
24750 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68  .** Clear the Wh
24760 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e  ereLoop.u union.
24770 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f    Leave WhereLoo
24780 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e  p.pLTerm intact.
24790 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
247a0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
247b0 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
247c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
247d0 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
247e0 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41   & (WHERE_VIRTUA
247f0 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54  LTABLE|WHERE_AUT
24800 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  O_INDEX) ){.    
24810 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
24820 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
24830 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75  ABLE)!=0 && p->u
24840 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
24850 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24860 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69  free(p->u.vtab.i
24870 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d  dxStr);.      p-
24880 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
24890 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75   = 0;.      p->u
248a0 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30  .vtab.idxStr = 0
248b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
248c0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
248d0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
248e0 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65  =0 && p->u.btree
248f0 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
24900 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
24910 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
24920 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
24930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24940 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
24950 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20  btree.pIndex);. 
24960 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
24970 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
24980 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
24990 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
249a0 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
249b0 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
249c0 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
249d0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
249e0 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
249f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
24a00 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
24a10 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
24a20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24a30 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
24a40 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
24a50 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
24a60 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
24a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
24a80 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
24a90 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
24aa0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
24ab0 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
24ac0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
24ad0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
24ae0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
24af0 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
24b00 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
24b10 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
24b20 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
24b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
24b40 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
24b50 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
24b60 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
24b70 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
24b80 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
24b90 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
24ba0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
24bb0 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61  mcpy(paNew, p->a
24bc0 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d  LTerm, sizeof(p-
24bd0 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e  >aLTerm[0])*p->n
24be0 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d  LSlot);.  if( p-
24bf0 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
24c00 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
24c10 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
24c20 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54  LTerm);.  p->aLT
24c30 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70  erm = paNew;.  p
24c40 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20  ->nLSlot = n;.  
24c50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24c60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
24c70 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  fer content from
24c80 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f   the second pLoo
24c90 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74  p into the first
24ca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24cb0 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71  whereLoopXfer(sq
24cc0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
24cd0 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65  Loop *pTo, Where
24ce0 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  Loop *pFrom){.  
24cf0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
24d00 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20  ion(db, pTo);.  
24d10 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
24d20 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72  ize(db, pTo, pFr
24d30 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20  om->nLTerm) ){. 
24d40 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e     memset(&pTo->
24d50 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f  u, 0, sizeof(pTo
24d60 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->u));.    retur
24d70 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
24d80 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f    }.  memcpy(pTo
24d90 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
24da0 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
24db0 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
24dc0 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
24dd0 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
24de0 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
24df0 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
24e00 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
24e10 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
24e20 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
24e30 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
24e40 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
24e50 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
24e60 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
24e70 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
24e80 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
24e90 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
24ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
24ec0 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
24ed0 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
24ee0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
24ef0 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
24f00 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
24f10 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
24f20 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
24f30 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
24f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
24f50 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
24f60 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
24f70 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
24f80 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
24f90 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
24fa0 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
24fb0 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77  pWInfo) ){.    w
24fc0 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
24fd0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
24fe0 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
24ff0 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20  ->pLoops ){.    
25000 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d    WhereLoop *p =
25010 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b   pWInfo->pLoops;
25020 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
25030 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
25040 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72  Loop;.      wher
25050 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
25060 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
25070 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25080 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
25090 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
250a0 45 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  E if all of the 
250b0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
250c0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
250d0 20 58 20 68 61 73 20 74 68 65 20 73 61 6d 65 20   X has the same 
250e0 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
250f0 61 74 20 59 0a 2a 2a 20 20 20 28 32 29 20 20 58  at Y.**   (2)  X
25100 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
25110 73 65 74 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33  set of Y.**   (3
25120 29 20 20 58 20 73 6b 69 70 73 20 61 74 20 6c 65  )  X skips at le
25130 61 73 74 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75  ast as many colu
25140 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42  mns as Y.**.** B
25150 79 20 22 70 72 6f 70 65 72 20 73 75 62 73 65 74  y "proper subset
25160 22 20 77 65 20 6d 65 61 6e 20 74 68 61 74 20 58  " we mean that X
25170 20 75 73 65 73 20 66 65 77 65 72 20 57 48 45 52   uses fewer WHER
25180 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a  E clause terms.*
25190 2a 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61  * than Y and tha
251a0 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  t every WHERE cl
251b0 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62  ause term used b
251c0 79 20 58 20 69 73 20 61 6c 73 6f 20 75 73 65 64  y X is also used
251d0 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20  .** by Y..**.** 
251e0 49 66 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  If X is a proper
251f0 20 73 75 62 73 65 74 20 6f 66 20 59 20 74 68 65   subset of Y the
25200 6e 20 59 20 69 73 20 61 20 62 65 74 74 65 72 20  n Y is a better 
25210 63 68 6f 69 63 65 20 61 6e 64 20 6f 75 67 68 74  choice and ought
25220 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61 20 6c 6f  .** to have a lo
25230 77 65 72 20 63 6f 73 74 2e 20 20 54 68 69 73 20  wer cost.  This 
25240 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
25250 54 52 55 45 20 77 68 65 6e 20 74 68 61 74 20 63  TRUE when that c
25260 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e  ost .** relation
25270 73 68 69 70 20 69 73 20 69 6e 76 65 72 74 65 64  ship is inverted
25280 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
25290 20 61 64 6a 75 73 74 65 64 2e 20 20 54 68 65 20   adjusted.  The 
252a0 74 68 69 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61  third rule.** wa
252b0 73 20 61 64 64 65 64 20 62 65 63 61 75 73 65 20  s added because 
252c0 69 66 20 58 20 75 73 65 73 20 73 6b 69 70 2d 73  if X uses skip-s
252d0 63 61 6e 20 6c 65 73 73 20 74 68 61 6e 20 59 20  can less than Y 
252e0 69 74 20 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a  it still might.*
252f0 2a 20 64 65 73 65 72 76 65 20 61 20 6c 6f 77 65  * deserve a lowe
25300 72 20 63 6f 73 74 20 65 76 65 6e 20 69 66 20 69  r cost even if i
25310 74 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  t is a proper su
25320 62 73 65 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74  bset of Y..*/.st
25330 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
25340 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
25350 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57  ubset(.  const W
25360 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20  hereLoop *pX,   
25370 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65      /* First Whe
25380 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72  reLoop to compar
25390 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65  e */.  const Whe
253a0 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20  reLoop *pY      
253b0 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61    /* Compare aga
253c0 69 6e 73 74 20 74 68 69 73 20 57 68 65 72 65 4c  inst this WhereL
253d0 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  oop */.){.  int 
253e0 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e  i, j;.  if( pX->
253f0 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70  nLTerm-pX->nSkip
25400 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70   >= pY->nLTerm-p
25410 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  Y->nSkip ){.    
25420 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69  return 0; /* X i
25430 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  s not a subset o
25440 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  f Y */.  }.  if(
25450 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d   pY->nSkip > pX-
25460 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20  >nSkip ) return 
25470 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75  0;.  if( pX->rRu
25480 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b  n >= pY->rRun ){
25490 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75  .    if( pX->rRu
254a0 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72  n > pY->rRun ) r
254b0 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
254c0 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
254d0 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58   Y */.    if( pX
254e0 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75  ->nOut > pY->nOu
254f0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
25500 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
25510 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20   than Y */.  }. 
25520 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72   for(i=pX->nLTer
25530 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
25540 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54  .    if( pX->aLT
25550 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  erm[i]==0 ) cont
25560 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
25570 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  pY->nLTerm-1; j>
25580 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
25590 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a  if( pY->aLTerm[j
255a0 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  ]==pX->aLTerm[i]
255b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
255c0 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65      if( j<0 ) re
255d0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f  turn 0;  /* X no
255e0 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
255f0 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20  since term X[i] 
25600 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f  not used by Y */
25610 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
25620 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69    /* All conditi
25630 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f  ons meet */.}../
25640 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75  *.** Try to adju
25650 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57  st the cost of W
25660 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61  hereLoop pTempla
25670 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f  te upwards or do
25680 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68  wnwards so.** th
25690 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  at:.**.**   (1) 
256a0 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
256b0 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74  less than any ot
256c0 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74  her WhereLoops t
256d0 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72  hat are a proper
256e0 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74  .**       subset
256f0 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a   of pTemplate.**
25700 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c  .**   (2) pTempl
25710 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  ate costs more t
25720 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
25730 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69  ereLoops for whi
25740 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20  ch pTemplate.** 
25750 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65        is a prope
25760 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  r subset..**.** 
25770 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f  To say "WhereLoo
25780 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  p X is a proper 
25790 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61  subset of Y" mea
257a0 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66  ns that X uses f
257b0 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c  ewer.** WHERE cl
257c0 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20  ause terms than 
257d0 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
257e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
257f0 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a  rm used by X is.
25800 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20  ** also used by 
25810 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  Y..*/.static voi
25820 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73  d whereLoopAdjus
25830 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72  tCost(const Wher
25840 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c  eLoop *p, WhereL
25850 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
25860 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
25870 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
25880 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
25890 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b   return;.  for(;
258a0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
258b0 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  op){.    if( p->
258c0 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
258d0 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  >iTab ) continue
258e0 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  ;.    if( (p->ws
258f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
25900 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74  DEXED)==0 ) cont
25910 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68  inue;.    if( wh
25920 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
25930 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54  operSubset(p, pT
25940 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  emplate) ){.    
25950 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
25960 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77  plate cost downw
25970 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  ard so that it i
25980 73 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69  s cheaper than i
25990 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62  ts .      ** sub
259a0 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20  set p. */.      
259b0 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c  WHERETRACE(0x80,
259c0 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64  ("subset cost ad
259d0 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74  justment %d,%d t
259e0 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  o %d,%d\n",.    
259f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a00 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
25a10 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  un, pTemplate->n
25a20 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  Out, p->rRun, p-
25a30 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20 20  >nOut-1));.     
25a40 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
25a50 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
25a60 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
25a70 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b  t = p->nOut - 1;
25a80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
25a90 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50  hereLoopCheaperP
25aa0 72 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d  roperSubset(pTem
25ab0 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20  plate, p) ){.   
25ac0 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65     /* Adjust pTe
25ad0 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61  mplate cost upwa
25ae0 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
25af0 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70   costlier than p
25b00 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20   since.      ** 
25b10 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70  pTemplate is a p
25b20 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
25b30 70 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  p */.      WHERE
25b40 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62  TRACE(0x80,("sub
25b50 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  set cost adjustm
25b60 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c  ent %d,%d to %d,
25b70 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
25b90 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70  emplate->rRun, p
25ba0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20  Template->nOut, 
25bb0 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
25bc0 2b 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d  +1));.      pTem
25bd0 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
25be0 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
25bf0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
25c00 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20  ->nOut + 1;.    
25c10 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
25c20 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f  earch the list o
25c30 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20  f WhereLoops in 
25c40 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20  *ppPrev looking 
25c50 66 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e  for one that can
25c60 20 62 65 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65   be.** supplante
25c70 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a  d by pTemplate..
25c80 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c  **.** Return NUL
25c90 4c 20 69 66 20 74 68 65 20 57 68 65 72 65 4c 6f  L if the WhereLo
25ca0 6f 70 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73  op list contains
25cb0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
25cc0 61 6e 20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70  an supplant.** p
25cd0 54 65 6d 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68  Template, in oth
25ce0 65 72 20 77 6f 72 64 73 20 69 66 20 70 54 65 6d  er words if pTem
25cf0 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62  plate does not b
25d00 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73  elong on the lis
25d10 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69  t..**.** If pX i
25d20 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  s a WhereLoop th
25d30 61 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  at pTemplate can
25d40 20 73 75 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20   supplant, then 
25d50 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69  return the.** li
25d60 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  nk that points t
25d70 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  o pX..**.** If p
25d80 54 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20  Template cannot 
25d90 73 75 70 70 6c 61 6e 74 20 61 6e 79 20 65 78 69  supplant any exi
25da0 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66  sting element of
25db0 20 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65   the list but ne
25dc0 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64  eds.** to be add
25dd0 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 2c 20  ed to the list, 
25de0 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
25df0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 61 69  inter to the tai
25e00 6c 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  l of the list..*
25e10 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f  /.static WhereLo
25e20 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69  op **whereLoopFi
25e30 6e 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72  ndLesser(.  Wher
25e40 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a  eLoop **ppPrev,.
25e50 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
25e60 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a  p *pTemplate.){.
25e70 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
25e80 20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76    for(p=(*ppPrev
25e90 29 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d  ); p; ppPrev=&p-
25ea0 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70  >pNextLoop, p=*p
25eb0 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20  pPrev){.    if( 
25ec0 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61  p->iTab!=pTempla
25ed0 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69  te->iTab || p->i
25ee0 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61  SortIdx!=pTempla
25ef0 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a  te->iSortIdx ){.
25f00 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68        /* If eith
25f10 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69  er the iTab or i
25f20 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66  SortIdx values f
25f30 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70  or two WhereLoop
25f40 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20   are different. 
25f50 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f       ** then tho
25f60 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  se WhereLoops ne
25f70 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
25f80 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  red separately. 
25f90 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20   Neither is.    
25fa0 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65    ** a candidate
25fb0 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20   to replace the 
25fc0 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  other. */.      
25fd0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
25fe0 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75      /* In the cu
25ff0 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
26000 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70  tion, the rSetup
26010 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
26020 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20   zero.    ** or 
26030 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c  the cost of buil
26040 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ding an automati
26050 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20  c index (NlogN) 
26060 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20  and the NlogN.  
26070 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
26080 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20   for compatible 
26090 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20  WhereLoops. */. 
260a0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
260b0 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70  etup==0 || pTemp
260c0 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20  late->rSetup==0 
260d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
260e0 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d    || p->rSetup==
260f0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
26100 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65  p );..    /* whe
26110 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29  reLoopAddBtree()
26120 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65   always generate
26130 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68  s and inserts th
26140 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
26150 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69  x.    ** case fi
26160 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70  rst.  Hence comp
26170 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65  atible candidate
26180 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65   WhereLoops neve
26190 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a  r have a larger.
261a0 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43      ** rSetup. C
261b0 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49  all this SETUP-I
261c0 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20  NVARIANT */.    
261d0 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
261e0 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
261f0 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
26200 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61  Any loop using a
26210 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66  n appliation-def
26220 69 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50  ined index (or P
26230 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20  RIMARY KEY or.  
26240 20 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73    ** UNIQUE cons
26250 74 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65  traint) with one
26260 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73   or more == cons
26270 74 72 61 69 6e 74 73 20 69 73 20 62 65 74 74 65  traints is bette
26280 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e  r.    ** than an
26290 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
262a0 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 61  . Unless it is a
262b0 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20   skip-scan. */. 
262c0 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
262d0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
262e0 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20 26  INDEX)!=0.     &
262f0 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53  & (pTemplate->nS
26300 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  kip)==0.     && 
26310 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
26320 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
26330 58 45 44 29 21 3d 30 0a 20 20 20 20 20 26 26 20  XED)!=0.     && 
26340 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
26350 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
26360 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 26  MN_EQ)!=0.     &
26370 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
26380 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
26390 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
263a0 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20 20 20  ereq.    ){.    
263b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
263c0 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74 69      /* If existi
263d0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  ng WhereLoop p i
263e0 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54  s better than pT
263f0 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61  emplate, pTempla
26400 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a  te can be.    **
26410 20 64 69 73 63 61 72 64 65 64 2e 20 20 57 68 65   discarded.  Whe
26420 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
26430 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20  er if:.    **   
26440 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f  (1)  p has no mo
26450 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  re dependencies 
26460 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
26470 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
26480 20 20 70 20 68 61 73 20 61 6e 20 65 71 75 61 6c    p has an equal
26490 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
264a0 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  han pTemplate.  
264b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
264c0 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
264d0 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d  ate->prereq)==p-
264e0 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28 31  >prereq    /* (1
264f0 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
26500 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61  >rSetup<=pTempla
26510 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20 20  te->rSetup      
26520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26530 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
26540 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74  ->rRun<=pTemplat
26550 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20  e->rRun         
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26570 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2b) */.     && 
26580 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61  p->nOut<=pTempla
26590 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20  te->nOut        
265a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
265b0 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2c) */.    ){.
265c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
265d0 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65 6d   /* Discard pTem
265e0 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a  plate */.    }..
265f0 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c      /* If pTempl
26600 61 74 65 20 69 73 20 61 6c 77 61 79 73 20 62 65  ate is always be
26610 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68 65  tter than p, the
26620 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62 65 20  n cause p to be 
26630 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20 20  overwritten.    
26640 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ** with pTemplat
26650 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  e.  pTemplate is
26660 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 20 69   better than p i
26670 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20  f:.    **   (1) 
26680 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 6e   pTemplate has n
26690 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
266a0 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20  es than p, and. 
266b0 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54 65     **   (2)  pTe
266c0 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65 71  mplate has an eq
266d0 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
266e0 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f  t than p..    */
266f0 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
26700 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
26710 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c  >prereq)==pTempl
26720 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a  ate->prereq   /*
26730 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
26740 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c   p->rRun>=pTempl
26750 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20  ate->rRun       
26760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26770 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
26780 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
26790 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  >=pTemplate->nOu
267a0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
267c0 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2b) */.    ){.
267d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
267e0 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
267f0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a  te->rSetup ); /*
26800 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
26810 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20   above */.      
26820 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73  break;   /* Caus
26830 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
26840 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c 61  itten by pTempla
26850 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  te */.    }.  }.
26860 20 20 72 65 74 75 72 6e 20 70 70 50 72 65 76 3b    return ppPrev;
26870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
26880 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68   or replace a Wh
26890 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73  ereLoop entry us
268a0 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65  ing the template
268b0 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a   supplied..**.**
268c0 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   An existing Whe
268d0 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67  reLoop entry mig
268e0 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ht be overwritte
268f0 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d  n if the new tem
26900 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74  plate.** is bett
26910 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72  er and has fewer
26920 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20   dependencies.  
26930 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  Or the template 
26940 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a  will be ignored.
26950 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74  ** and no insert
26960 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61   will occur if a
26970 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
26980 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61  Loop is faster a
26990 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20  nd has.** fewer 
269a0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
269b0 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20  n the template. 
269c0 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77   Otherwise a new
269d0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a   WhereLoop is.**
269e0 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20   added based on 
269f0 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a  the template..**
26a00 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d  .** If pBuilder-
26a10 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e  >pOrSet is not N
26a20 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72 65  ULL then we care
26a30 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a   about only the.
26a40 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ** prerequisites
26a50 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f   and rRun and nO
26a60 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20  ut costs of the 
26a70 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54  N best loops.  T
26a80 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  hat.** informati
26a90 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69  on is gathered i
26aa0 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e  n the pBuilder->
26ab0 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  pOrSet object.  
26ac0 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20  This special.** 
26ad0 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20  processing mode 
26ae0 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72  is used only for
26af0 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
26b00 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ssing..**.** Whe
26b10 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d  n accumulating m
26b20 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77  ultiple loops (w
26b30 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  hen pBuilder->pO
26b40 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65  rSet is NULL) we
26b50 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20  .** still might 
26b60 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61  overwrite simila
26b70 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65  r loops with the
26b80 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66   new template if
26b90 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70   the.** new temp
26ba0 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
26bb0 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
26bc0 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
26bd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
26be0 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
26bf0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
26c00 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
26c10 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
26c20 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
26c30 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
26c40 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
26c50 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
26c60 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
26c70 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
26c80 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
26c90 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
26ca0 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
26cb0 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
26cc0 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
26cd0 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69  nt loop.*/.stati
26ce0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49  c int whereLoopI
26cf0 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42  nsert(WhereLoopB
26d00 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
26d10 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
26d20 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65  mplate){.  Where
26d30 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a  Loop **ppPrev, *
26d40 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p;.  WhereInfo *
26d50 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
26d60 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c  r->pWInfo;.  sql
26d70 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
26d80 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a  o->pParse->db;..
26d90 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72    /* If pBuilder
26da0 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66 69  ->pOrSet is defi
26db0 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ned, then only k
26dc0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
26dd0 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20   costs.  ** and 
26de0 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20  prereqs..  */.  
26df0 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  if( pBuilder->pO
26e00 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66 20 57  rSet!=0 ){.#if W
26e10 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
26e20 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42  D.    u16 n = pB
26e30 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e  uilder->pOrSet->
26e40 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a 23  n;.    int x =.#
26e50 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72 65 4f  endif.    whereO
26e60 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  rInsert(pBuilder
26e70 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c  ->pOrSet, pTempl
26e80 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65  ate->prereq, pTe
26e90 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20  mplate->rRun,.  
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ec0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
26ed0 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  t);.#if WHERETRA
26ee0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
26ef0 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  8 */.    if( sql
26f00 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
26f10 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71   0x8 ){.      sq
26f20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26f30 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22  (x?"   or-%d:  "
26f40 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e  :"   or-X:  ", n
26f50 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
26f60 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
26f70 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
26f80 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
26f90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26fa0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
26fb0 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73  Look for an exis
26fc0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74  ting WhereLoop t
26fd0 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68 20 70  o replace with p
26fe0 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20 20  Template.  */.  
26ff0 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43  whereLoopAdjustC
27000 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  ost(pWInfo->pLoo
27010 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  ps, pTemplate);.
27020 20 20 70 70 50 72 65 76 20 3d 20 77 68 65 72 65    ppPrev = where
27030 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 26  LoopFindLesser(&
27040 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
27050 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20 69  pTemplate);..  i
27060 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b 0a  f( ppPrev==0 ){.
27070 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c 72      /* There alr
27080 65 61 64 79 20 65 78 69 73 74 73 20 61 20 57 68  eady exists a Wh
27090 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20 6c  ereLoop on the l
270a0 69 73 74 20 74 68 61 74 20 69 73 20 62 65 74 74  ist that is bett
270b0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 70  er.    ** than p
270c0 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75 73  Template, so jus
270d0 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c 61  t ignore pTempla
270e0 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54  te */.#if WHERET
270f0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
27100 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  0x8 */.    if( s
27110 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
27120 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
27130 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
27140 74 66 28 22 20 20 20 73 6b 69 70 3a 20 22 29 3b  tf("   skip: ");
27150 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
27160 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
27170 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
27180 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
27190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
271a0 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a 20  OK;  .  }else{. 
271b0 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b 0a     p = *ppPrev;.
271c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
271d0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
271e0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65   it means that e
271f0 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64  ither p[] should
27200 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
27210 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c    ** with pTempl
27220 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69  ate[] if p[] exi
27230 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55  sts, or if p==NU
27240 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  LL then allocate
27250 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72   a new.  ** Wher
27260 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74  eLoop and insert
27270 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48   it..  */.#if WH
27280 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
27290 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28   /* 0x8 */.  if(
272a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
272b0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
272c0 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20  if( p!=0 ){.    
272d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
272e0 69 6e 74 66 28 22 72 65 70 6c 61 63 65 3a 20 22  intf("replace: "
272f0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
27300 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69 6c  opPrint(p, pBuil
27310 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
27320 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
27330 67 50 72 69 6e 74 66 28 22 20 20 20 20 61 64 64  gPrintf("    add
27340 3a 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c  : ");.    whereL
27350 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
27360 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
27370 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  C);.  }.#endif. 
27380 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
27390 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
273a0 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  ew WhereLoop to 
273b0 61 64 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  add to the end o
273c0 66 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  f the list */.  
273d0 20 20 2a 70 70 50 72 65 76 20 3d 20 70 20 3d 20    *ppPrev = p = 
273e0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
273f0 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68  aw(db, sizeof(Wh
27400 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69  ereLoop));.    i
27410 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
27420 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
27430 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74     whereLoopInit
27440 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  (p);.    p->pNex
27450 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c  tLoop = 0;.  }el
27460 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69  se{.    /* We wi
27470 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e  ll be overwritin
27480 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e  g WhereLoop p[].
27490 20 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20    But before we 
274a0 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  do, first.    **
274b0 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20   go through the 
274c0 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74  rest of the list
274d0 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20   and delete any 
274e0 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65  other entries be
274f0 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d  sides.    ** p[]
27500 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73   that are also s
27510 75 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d  upplated by pTem
27520 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65  plate */.    Whe
27530 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20  reLoop **ppTail 
27540 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  = &p->pNextLoop;
27550 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
27560 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c  pToDel;.    whil
27570 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20  e( *ppTail ){.  
27580 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65      ppTail = whe
27590 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
275a0 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61  (ppTail, pTempla
275b0 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
275c0 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b  pTail==0 ) break
275d0 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d  ;.      pToDel =
275e0 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20   *ppTail;.      
275f0 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20  if( pToDel==0 ) 
27600 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70  break;.      *pp
27610 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70  Tail = pToDel->p
27620 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48  NextLoop;.#if WH
27630 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
27640 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
27650 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
27660 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
27670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
27680 65 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c  ebugPrintf(" del
27690 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20  ete: ");.       
276a0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
276b0 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72  pToDel, pBuilder
276c0 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  ->pWC);.      }.
276d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
276e0 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
276f0 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a   pToDel);.    }.
27700 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58    }.  whereLoopX
27710 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70  fer(db, p, pTemp
27720 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  late);.  if( (p-
27730 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27740 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
27750 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
27760 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74  pIndex = p->u.bt
27770 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
27780 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49  if( pIndex && pI
27790 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b  ndex->tnum==0 ){
277a0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
277b0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
277c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
277d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
277e0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
277f0 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76  WhereLoop.nOut v
27800 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f  alue downward to
27810 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72   account for ter
27820 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45  ms of the.** WHE
27830 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72  RE clause that r
27840 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f  eference the loo
27850 70 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20  p but which are 
27860 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a  not used by an.*
27870 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f  * index..*.** Fo
27880 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  r every WHERE cl
27890 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69  ause term that i
278a0 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  s not used by th
278b0 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77  e index.** and w
278c0 68 69 63 68 20 68 61 73 20 61 20 74 72 75 74 68  hich has a truth
278d0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73 73   probability ass
278e0 69 67 6e 65 64 20 62 79 20 6f 6e 65 20 6f 66 20  igned by one of 
278f0 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  the likelihood()
27900 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f  ,.** likely(), o
27910 72 20 75 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c  r unlikely() SQL
27920 20 66 75 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75   functions, redu
27930 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ce the estimated
27940 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75   number.** of ou
27950 74 70 75 74 20 72 6f 77 73 20 62 79 20 74 68 65  tput rows by the
27960 20 70 72 6f 62 61 62 69 6c 69 74 79 20 73 70 65   probability spe
27970 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55  cified..**.** TU
27980 4e 49 4e 47 3a 20 20 46 6f 72 20 65 76 65 72 79  NING:  For every
27990 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
279a0 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75  rm that is not u
279b0 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  sed by the index
279c0 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 64 6f  .** and which do
279d0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 61  es not have an a
279e0 73 73 69 67 6e 65 64 20 74 72 75 74 68 20 70 72  ssigned truth pr
279f0 6f 62 61 62 69 6c 69 74 79 2c 20 68 65 75 72 69  obability, heuri
27a00 73 74 69 63 73 0a 2a 2a 20 64 65 73 63 72 69 62  stics.** describ
27a10 65 64 20 62 65 6c 6f 77 20 61 72 65 20 75 73 65  ed below are use
27a20 64 20 74 6f 20 74 72 79 20 74 6f 20 65 73 74 69  d to try to esti
27a30 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
27a40 72 6f 62 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54  robability..** T
27a50 4f 44 4f 20 2d 2d 3e 20 50 65 72 68 61 70 73 20  ODO --> Perhaps 
27a60 74 68 69 73 20 69 73 20 73 6f 6d 65 74 68 69 6e  this is somethin
27a70 67 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20  g that could be 
27a80 69 6d 70 72 6f 76 65 64 20 62 79 20 62 65 74 74  improved by bett
27a90 65 72 0a 2a 2a 20 74 61 62 6c 65 20 73 74 61 74  er.** table stat
27aa0 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65  istics..**.** He
27ab0 75 72 69 73 74 69 63 20 31 3a 20 20 45 73 74 69  uristic 1:  Esti
27ac0 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
27ad0 72 6f 62 61 62 69 6c 69 74 79 20 61 73 20 39 33  robability as 93
27ae0 2e 37 35 25 2e 20 20 54 68 65 20 39 33 2e 37 35  .75%.  The 93.75
27af0 25 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 72 72 65  %.** value corre
27b00 73 70 6f 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20  sponds to -1 in 
27b10 4c 6f 67 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c  LogEst notation,
27b20 20 73 6f 20 74 68 69 73 20 6d 65 61 6e 73 20 64   so this means d
27b30 65 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20  ecrement.** the 
27b40 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66  WhereLoop.nOut f
27b50 69 65 6c 64 20 66 6f 72 20 65 76 65 72 79 20 73  ield for every s
27b60 75 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  uch WHERE clause
27b70 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75   term..**.** Heu
27b80 72 69 73 74 69 63 20 32 3a 20 20 49 66 20 74 68  ristic 2:  If th
27b90 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f  ere exists one o
27ba0 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61  r more WHERE cla
27bb0 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
27bc0 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50  .** form "x==EXP
27bd0 52 22 20 61 6e 64 20 45 58 50 52 20 69 73 20 6e  R" and EXPR is n
27be0 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 20  ot a constant 0 
27bf0 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20  or 1, then make 
27c00 73 75 72 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61  sure the.** fina
27c10 6c 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74  l output row est
27c20 69 6d 61 74 65 20 69 73 20 6e 6f 20 67 72 65 61  imate is no grea
27c30 74 65 72 20 74 68 61 6e 20 31 2f 34 20 6f 66 20  ter than 1/4 of 
27c40 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
27c50 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  .** of rows in t
27c60 68 65 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  he table.  In ot
27c70 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
27c80 65 20 74 68 61 74 20 78 3d 3d 45 58 50 52 20 77  e that x==EXPR w
27c90 69 6c 6c 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75  ill filter.** ou
27ca0 74 20 61 74 20 6c 65 61 73 74 20 33 20 6f 75 74  t at least 3 out
27cb0 20 6f 66 20 34 20 72 6f 77 73 2e 20 20 49 66 20   of 4 rows.  If 
27cc0 45 58 50 52 20 69 73 20 2d 31 20 6f 72 20 30 20  EXPR is -1 or 0 
27cd0 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 79 62 65  or 1, then maybe
27ce0 20 74 68 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75   the.** "x" colu
27cf0 6d 6e 20 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72  mn is boolean or
27d00 20 65 6c 73 65 20 2d 31 20 6f 72 20 30 20 6f 72   else -1 or 0 or
27d10 20 31 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64   1 is a common d
27d20 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20  efault value.** 
27d30 6f 6e 20 74 68 65 20 22 78 22 20 63 6f 6c 75 6d  on the "x" colum
27d40 6e 20 61 6e 64 20 73 6f 20 69 6e 20 74 68 61 74  n and so in that
27d50 20 63 61 73 65 20 6f 6e 6c 79 20 63 61 70 20 74   case only cap t
27d60 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73  he output row es
27d70 74 69 6d 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32  timate.** at 1/2
27d80 20 69 6e 73 74 65 61 64 20 6f 66 20 31 2f 34 2e   instead of 1/4.
27d90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27da0 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
27db0 64 6a 75 73 74 28 0a 20 20 57 68 65 72 65 43 6c  djust(.  WhereCl
27dc0 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
27dd0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
27de0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  use */.  WhereLo
27df0 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20  op *pLoop,      
27e00 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61  /* The loop to a
27e10 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64 20 2a  djust downward *
27e20 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20  /.  LogEst nRow 
27e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27e40 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
27e50 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
27e60 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
27e70 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a  rm *pTerm, *pX;.
27e80 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c    Bitmask notAll
27e90 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e  owed = ~(pLoop->
27ea0 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61  prereq|pLoop->ma
27eb0 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69  skSelf);.  int i
27ec0 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74  , j, k;.  LogEst
27ed0 20 69 52 65 64 75 63 65 20 3d 20 30 3b 20 20 20   iReduce = 0;   
27ee0 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20   /* pLoop->nOut 
27ef0 73 68 6f 75 6c 64 20 6e 6f 74 20 65 78 63 65 65  should not excee
27f00 64 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 2a  d nRow-iReduce *
27f10 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c  /..  assert( (pL
27f20 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
27f30 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
27f40 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ==0 );.  for(i=p
27f50 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d  WC->nTerm, pTerm
27f60 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  =pWC->a; i>0; i-
27f70 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
27f80 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
27f90 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
27fa0 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  UAL)!=0 ) break;
27fb0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
27fc0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
27fd0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30  op->maskSelf)==0
27fe0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27ff0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
28000 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f  reqAll & notAllo
28010 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  wed)!=0 ) contin
28020 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ue;.    for(j=pL
28030 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  oop->nLTerm-1; j
28040 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
28050 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54   pX = pLoop->aLT
28060 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
28070 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ( pX==0 ) contin
28080 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ue;.      if( pX
28090 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
280a0 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69  .      if( pX->i
280b0 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70  Parent>=0 && (&p
280c0 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e  WC->a[pX->iParen
280d0 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65  t])==pTerm ) bre
280e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
280f0 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ( j<0 ){.      i
28100 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
28110 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
28120 20 20 2f 2a 20 49 66 20 61 20 74 72 75 74 68 20    /* If a truth 
28130 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73 20 73  probability is s
28140 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 74  pecified using t
28150 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  he likelihood() 
28160 68 69 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a  hints,.        *
28170 2a 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 70  * then use the p
28180 72 6f 62 61 62 69 6c 69 74 79 20 70 72 6f 76 69  robability provi
28190 64 65 64 20 62 79 20 74 68 65 20 61 70 70 6c 69  ded by the appli
281a0 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
281b0 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b     pLoop->nOut +
281c0 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
281d0 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ob;.      }else{
281e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
281f0 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 65 78  he absence of ex
28200 70 6c 69 63 69 74 20 74 72 75 74 68 20 70 72 6f  plicit truth pro
28210 62 61 62 69 6c 69 74 69 65 73 2c 20 75 73 65 20  babilities, use 
28220 68 65 75 72 69 73 74 69 63 73 20 74 6f 0a 20 20  heuristics to.  
28230 20 20 20 20 20 20 2a 2a 20 67 75 65 73 73 20 61        ** guess a
28240 20 72 65 61 73 6f 6e 61 62 6c 65 20 74 72 75 74   reasonable trut
28250 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a  h probability. *
28260 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  /.        pLoop-
28270 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20  >nOut--;.       
28280 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
28290 72 61 74 6f 72 26 57 4f 5f 45 51 20 29 7b 0a 20  rator&WO_EQ ){. 
282a0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
282b0 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70  Right = pTerm->p
282c0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
282d0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
282e0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
282f0 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26 20  (pRight, &k) && 
28300 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20  k>=(-1) && k<=1 
28310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  ){.            k
28320 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
28330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28340 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20      k = 20;.    
28350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28360 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b 20    if( iReduce<k 
28370 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20  ) iReduce = k;. 
28380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28390 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
283a0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e   pLoop->nOut > n
283b0 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20 70  Row-iReduce )  p
283c0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  Loop->nOut = nRo
283d0 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a  w - iReduce;.}..
283e0 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
283f0 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20 63   cost C by the c
28400 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20 54  ostMult facter T
28410 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63  .  This only occ
28420 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c  urs if.** compil
28430 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45  ed with -DSQLITE
28440 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54  _ENABLE_COSTMULT
28450 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
28460 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
28470 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79  T.# define Apply
28480 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43  CostMultiplier(C
28490 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73  ,T)  C += T.#els
284a0 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79  e.# define Apply
284b0 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43  CostMultiplier(C
284c0 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,T).#endif../*.*
284d0 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72  * We have so far
284e0 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64 65   matched pBuilde
284f0 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
28500 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68  .nEq terms of th
28510 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64  e .** index pInd
28520 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68  ex. Try to match
28530 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a   one more..**.**
28540 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
28550 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70  ion is called, p
28560 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e  Builder->pNew->n
28570 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Out contains the
28580 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72   .** number of r
28590 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 20  ows expected to 
285a0 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66 69  be visited by fi
285b0 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68  ltering using th
285c0 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20  e nEq .** terms 
285d0 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d  only. If it is m
285e0 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76 61  odified, this va
285f0 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  lue is restored 
28600 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  before this .** 
28610 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
28620 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62  ..**.** If pProb
28630 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74  e->tnum==0, that
28640 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73   means pIndex is
28650 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73   a fake index us
28660 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e  ed for the.** IN
28670 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
28680 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
28690 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
286a0 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  eeIndex(.  Where
286b0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
286c0 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68  ilder,     /* Th
286d0 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74  e WhereLoop fact
286e0 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ory */.  struct 
286f0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
28700 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  rc,      /* FROM
28710 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
28720 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
28730 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20   Index *pProbe, 
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20   /* An index on 
28760 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  pSrc */.  LogEst
28770 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20   nInMul         
28780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67            /* log
28790 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61  (Number of itera
287a0 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29  tions due to IN)
287b0 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
287c0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
287d0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20  ilder->pWInfo;  
287e0 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65  /* WHERE analyse
287f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
28800 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
28810 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
28820 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
28830 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
28840 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
28850 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
28860 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
28870 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65  ion malloc conte
28880 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
28890 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
288a0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
288b0 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e  ate WhereLoop un
288c0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
288d0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
288e0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
288f0 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65        /* A Where
28900 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69  Term under consi
28910 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  deration */.  in
28920 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20  t opMask;       
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28940 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73   Valid operators
28950 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
28960 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20   */.  WhereScan 
28970 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20  scan;           
28980 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
28990 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d  r for WHERE term
289a0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73  s */.  Bitmask s
289b0 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20  aved_prereq;    
289c0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
289d0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
289e0 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31  ->prereq */.  u1
289f0 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20  6 saved_nLTerm; 
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28a10 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
28a20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  of pNew->nLTerm 
28a30 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
28a40 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
28a50 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
28a60 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
28a70 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20  u.btree.nEq */. 
28a80 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70   u16 saved_nSkip
28a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28aa0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
28ab0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69  ue of pNew->nSki
28ac0 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64  p */.  u32 saved
28ad0 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  _wsFlags;       
28ae0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
28af0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
28b00 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c  ->wsFlags */.  L
28b10 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  ogEst saved_nOut
28b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
28b30 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
28b40 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a   of pNew->nOut *
28b50 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
28b80 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  the column in th
28b90 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
28ba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28bc0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
28bd0 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
28c00 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
28c10 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
28c20 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
28c30 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
28c40 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
28c50 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
28c60 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
28c70 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
28c80 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
28c90 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
28ca0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
28cb0 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
28cc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
28cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28ce0 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  EM;..  assert( (
28cf0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
28d00 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
28d10 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
28d20 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
28d30 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
28d40 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
28d50 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
28d60 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
28d70 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
28d80 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
28d90 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62   }else if( pProb
28da0 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70  e->tnum<=0 || (p
28db0 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
28dc0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
28dd0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
28de0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
28df0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
28e00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
28e10 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
28e20 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  IN|WO_ISNULL|WO_
28e30 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
28e40 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_LE;.  }.  if( 
28e50 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
28e60 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
28e70 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
28e80 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
28e90 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
28ea0 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
28eb0 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 43 6f  nColumn );.  iCo
28ec0 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  l = pProbe->aiCo
28ed0 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  lumn[pNew->u.btr
28ee0 65 65 2e 6e 45 71 5d 3b 0a 0a 20 20 70 54 65 72  ee.nEq];..  pTer
28ef0 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
28f00 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
28f10 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
28f20 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20  ursor, iCol,.   
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72       opMask, pPr
28f50 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45  obe);.  saved_nE
28f60 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  q = pNew->u.btre
28f70 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e  e.nEq;.  saved_n
28f80 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b  Skip = pNew->nSk
28f90 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65  ip;.  saved_nLTe
28fa0 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  rm = pNew->nLTer
28fb0 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61  m;.  saved_wsFla
28fc0 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61  gs = pNew->wsFla
28fd0 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72  gs;.  saved_prer
28fe0 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65  eq = pNew->prere
28ff0 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20  q;.  saved_nOut 
29000 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
29010 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
29020 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f  ;.  rSize = pPro
29030 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
29040 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  0];.  rLogSize =
29050 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
29060 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
29070 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d  TE_OK && pTerm!=
29080 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  0; pTerm = where
29090 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29  ScanNext(&scan))
290a0 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20  {.    u16 eOp = 
290b0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
290c0 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64  ;   /* Shorthand
290d0 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65   for pTerm->eOpe
290e0 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67  rator */.    Log
290f0 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20 20  Est rCostIdx;.  
29100 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61    LogEst nOutUna
29110 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20 20  djusted;        
29120 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20 49  /* nOut before I
29130 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20 61 64  N() and WHERE ad
29140 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  justments */.   
29150 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69   int nIn = 0;.#i
29160 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
29170 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
29180 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61  4.    int nRecVa
29190 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
291a0 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
291b0 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d 3d  f.    if( (eOp==
291c0 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54  WO_ISNULL || (pT
291d0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52  erm->wtFlags&TER
291e0 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20  M_VNULL)!=0).   
291f0 20 20 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c 20    && (iCol<0 || 
29200 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
29210 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a  [iCol].notNull).
29220 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e      ){.      con
29230 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65  tinue; /* ignore
29240 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63   IS [NOT] NULL c
29250 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f  onstraints on NO
29260 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
29270 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
29280 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
29290 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  ht & pNew->maskS
292a0 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  elf ) continue;.
292b0 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
292c0 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
292d0 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  gs;.    pNew->u.
292e0 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
292f0 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
29300 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
29310 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20  nLTerm;.    if( 
29320 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
29330 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e  db, pNew, pNew->
29340 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61  nLTerm+1) ) brea
29350 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20  k; /* OOM */.   
29360 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
29370 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
29380 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d  pTerm;.    pNew-
29390 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64  >prereq = (saved
293a0 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d  _prereq | pTerm-
293b0 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20  >prereqRight) & 
293c0 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b  ~pNew->maskSelf;
293d0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 49  ..    assert( nI
293e0 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  nMul==0.        
293f0 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
29400 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
29410 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20  _NULL)!=0 .     
29420 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
29430 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
29440 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20  UMN_IN)!=0 .    
29450 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
29460 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b  Flags & WHERE_SK
29470 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20  IPSCAN)!=0 .    
29480 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20  );..    if( eOp 
29490 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
294a0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
294b0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
294c0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
294d0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
294e0 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45  _IN;.      if( E
294f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
29500 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
29510 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
29520 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  * "x IN (SELECT 
29530 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20  ...)":  TUNING: 
29540 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72  the SELECT retur
29550 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
29560 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20        nIn = 46; 
29570 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c   assert( 46==sql
29580 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29  ite3LogEst(25) )
29590 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
295a0 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
295b0 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72  x.pList && pExpr
295c0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
295d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
295e0 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61  "x IN (value, va
295f0 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20  lue, ...)" */.  
29600 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69        nIn = sqli
29610 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d  te3LogEst(pExpr-
29620 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
29630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29640 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b  assert( nIn>0 );
29650 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20    /* RHS always 
29660 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65  has 2 or more te
29670 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73  rms...  The pars
29680 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
29690 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68             ** ch
296a0 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22  anges "x IN (?)"
296b0 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a   into "x=?". */.
296c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
296d0 4f 70 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a  Op & (WO_EQ) ){.
296e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
296f0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
29700 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66  UMN_EQ;.      if
29710 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e  ( iCol<0 || (nIn
29720 4d 75 6c 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e  Mul==0 && pNew->
29730 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72  u.btree.nEq==pPr
29740 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20  obe->nKeyCol-1) 
29750 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
29760 43 6f 6c 3e 3d 30 20 26 26 20 21 49 73 55 6e 69  Col>=0 && !IsUni
29770 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29  queIndex(pProbe)
29780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
29790 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
297a0 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b  HERE_UNQ_WANTED;
297b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
297c0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
297d0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
297e0 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20  _ONEROW;.       
297f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
29800 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 57  else if( eOp & W
29810 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
29820 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
29830 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
29840 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
29850 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54  if( eOp & (WO_GT
29860 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20  |WO_GE) ){.     
29870 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
29880 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20   WO_GT );.      
29890 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
298a0 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_GE );.      p
298b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
298c0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
298d0 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  GE|WHERE_BTM_LIM
298e0 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  IT;.      pBtm =
298f0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54   pTerm;.      pT
29900 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  op = 0;.    }els
29910 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
29920 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
29930 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
29940 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
29950 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
29960 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
29970 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
29980 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
29990 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
299a0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
299b0 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54  .      pTop = pT
299c0 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  erm;.      pBtm 
299d0 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  = (pNew->wsFlags
299e0 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
299f0 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  IT)!=0 ?.       
29a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
29a10 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
29a20 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a  >nLTerm-2] : 0;.
29a30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
29a40 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77   this point pNew
29a50 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ->nOut is set to
29a60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
29a70 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ows expected to.
29a80 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65      ** be visite
29a90 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 73  d by the index s
29aa0 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69  can before consi
29ab0 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72  dering term pTer
29ac0 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  m, or the.    **
29ad0 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61   values of nIn a
29ae0 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74  nd nInMul. In ot
29af0 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
29b00 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20  ing that all .  
29b10 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22    ** "x IN(...)"
29b20 20 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61   terms are repla
29b30 63 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22  ced with "x = ?"
29b40 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64  . This block upd
29b50 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ates.    ** the 
29b60 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
29b70 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  Out to account f
29b80 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f  or pTerm (but no
29b90 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20  t nIn/nInMul).  
29ba0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
29bb0 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
29bc0 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28  _nOut );.    if(
29bd0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
29be0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
29bf0 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
29c00 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e  Adjust nOut usin
29c10 67 20 73 74 61 74 33 2f 73 74 61 74 34 20 64 61  g stat3/stat4 da
29c20 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65  ta. Or, if there
29c30 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61   is no stat3/sta
29c40 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  t4.      ** data
29c50 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68  , using some oth
29c60 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f  er estimate.  */
29c70 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67  .      whereRang
29c80 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  eScanEst(pParse,
29c90 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c   pBuilder, pBtm,
29ca0 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20   pTop, pNew);.  
29cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
29cc0 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d  nt nEq = ++pNew-
29cd0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
29ce0 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20      assert( eOp 
29cf0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  & (WO_ISNULL|WO_
29d00 45 51 7c 57 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20  EQ|WO_IN) );..  
29d10 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
29d20 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f  ->nOut==saved_nO
29d30 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
29d40 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
29d50 3c 3d 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29  <=0 && iCol>=0 )
29d60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
29d70 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  ( (eOp & WO_IN) 
29d80 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  || nIn==0 );.   
29d90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
29da0 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  Op & WO_IN );.  
29db0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
29dc0 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
29dd0 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e  Prob;.        pN
29de0 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
29df0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  .      }else{.#i
29e00 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
29e10 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
29e20 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e  4.        tRowcn
29e30 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t nOut = 0;.    
29e40 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d      if( nInMul==
29e50 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
29e60 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a  Probe->nSample .
29e70 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
29e80 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
29e90 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f  Probe->nSampleCo
29ea0 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  l.         && ((
29eb0 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  eOp & WO_IN)==0 
29ec0 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
29ed0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
29ee0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
29ef0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
29f00 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
29f10 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
29f20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29f30 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
29f40 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a  _ISNULL))!=0 ){.
29f50 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
29f60 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45  case( eOp & WO_E
29f70 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Q );.           
29f80 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
29f90 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
29fa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
29fb0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
29fc0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
29fd0 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
29fe0 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
29ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a000 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2a010 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
2a020 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
2a030 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
2a040 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
2a050 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2a060 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
2a070 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
2a080 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _OK;.          i
2a090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a0a0 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
2a0b0 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f     /* Jump out o
2a0c0 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70  f the pTerm loop
2a0d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2a0e0 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
2a0f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2a100 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2a110 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
2a120 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f      if( pNew->nO
2a130 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20  ut>saved_nOut ) 
2a140 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
2a150 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  ed_nOut;.       
2a160 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2a170 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20  -= nIn;.        
2a180 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2a190 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d        if( nOut==
2a1a0 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0 ).#endif.     
2a1b0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70     {.          p
2a1c0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50  New->nOut += (pP
2a1d0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
2a1e0 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  t[nEq] - pProbe-
2a1f0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
2a200 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1]);.          
2a210 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
2a220 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
2a230 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66     /* TUNING: If
2a240 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b   there is no lik
2a250 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c  elihood() value,
2a260 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a   assume that a .
2a270 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22              ** "
2a280 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70  col IS NULL" exp
2a290 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
2a2a0 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f  twice as many ro
2a2b0 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws .            
2a2c0 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a  ** as (col=?). *
2a2d0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  /.            pN
2a2e0 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a  ew->nOut += 10;.
2a2f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a300 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2a310 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
2a320 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20  rCostIdx to the 
2a330 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
2a340 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69   selected rows i
2a350 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20  n index. Add.   
2a360 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e   ** it to pNew->
2a370 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63  rRun, which is c
2a380 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
2a390 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
2a3a0 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65  index.    ** see
2a3b0 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66  k only. Then, if
2a3c0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
2a3d0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61  overing index, a
2a3e0 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  dd the cost of. 
2a3f0 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74     ** visiting t
2a400 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  he rows in the m
2a410 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ain table.  */. 
2a420 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e     rCostIdx = pN
2a430 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28  ew->nOut + 1 + (
2a440 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
2a450 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d  Row)/pSrc->pTab-
2a460 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70  >szTabRow;.    p
2a470 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
2a480 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
2a490 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29  gSize, rCostIdx)
2a4a0 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
2a4b0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
2a4c0 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
2a4d0 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
2a4e0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2a4f0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
2a500 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
2a510 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20  w->nOut + 16);. 
2a520 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f     }.    ApplyCo
2a530 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
2a540 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d  w->rRun, pProbe-
2a550 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
2a560 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61  t);..    nOutUna
2a570 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e  djusted = pNew->
2a580 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
2a590 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  rRun += nInMul +
2a5a0 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   nIn;.    pNew->
2a5b0 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  nOut += nInMul +
2a5c0 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c   nIn;.    whereL
2a5d0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
2a5e0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
2a5f0 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
2a600 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2a610 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2a620 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
2a630 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
2a640 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
2a650 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
2a660 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
2a670 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
2a680 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2a690 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
2a6a0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
2a6b0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
2a6c0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
2a6d0 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
2a6e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2a6f0 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
2a700 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
2a710 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
2a720 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
2a730 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
2a740 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
2a750 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2a760 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
2a770 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2a780 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
2a790 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
2a7a0 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
2a7b0 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
2a7c0 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
2a7d0 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
2a7e0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2a7f0 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
2a800 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d  .  pNew->nSkip =
2a810 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
2a820 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2a830 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
2a840 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
2a850 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
2a860 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
2a870 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43  _nLTerm;..  /* C
2a880 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20  onsider using a 
2a890 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65  skip-scan if the
2a8a0 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
2a8b0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
2a8c0 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ts.  ** availabl
2a8d0 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d  e for the left-m
2a8e0 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ost terms of the
2a8f0 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74   index, and if t
2a900 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20  he average.  ** 
2a910 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74  number of repeat
2a920 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
2a930 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c  st terms is at l
2a940 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20  east 18. .  **. 
2a950 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75   ** The magic nu
2a960 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63  mber 18 is selec
2a970 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73  ted on the basis
2a980 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31   that scanning 1
2a990 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61  7 rows.  ** is a
2a9a0 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69  lmost always qui
2a9b0 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64  cker than an ind
2a9c0 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68  ex seek (even th
2a9d0 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65  ough if the inde
2a9e0 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  x.  ** contains 
2a9f0 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20  fewer than 2^17 
2aa00 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f  rows we assume o
2aa10 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65  therwise in othe
2aa20 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20  r parts of.  ** 
2aa30 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20  the code). And, 
2aa40 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  even if it is no
2aa50 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  t, it should not
2aa60 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f   be too much slo
2aa70 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68  wer. .  ** On th
2aa80 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
2aa90 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f  e extra seeks co
2aaa0 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67  uld end up being
2aab0 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
2aac0 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69   ** more expensi
2aad0 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ve.  */.  assert
2aae0 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 42==sqlite3Log
2aaf0 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28  Est(18) );.  if(
2ab00 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65   saved_nEq==save
2ab10 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61  d_nSkip.   && sa
2ab20 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65  ved_nEq+1<pProbe
2ab30 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20  ->nKeyCol.   && 
2ab40 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63  pProbe->noSkipSc
2ab50 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f  an==0.   && pPro
2ab60 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
2ab70 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32  saved_nEq+1]>=42
2ab80 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e    /* TUNING: Min
2ab90 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63  imum for skip-sc
2aba0 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20  an */.   && (rc 
2abb0 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  = whereLoopResiz
2abc0 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
2abd0 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51  ->nLTerm+1))==SQ
2abe0 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
2abf0 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20   LogEst nIter;. 
2ac00 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
2ac10 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  .nEq++;.    pNew
2ac20 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70  ->nSkip++;.    p
2ac30 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
2ac40 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b  ->nLTerm++] = 0;
2ac50 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
2ac60 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50  gs |= WHERE_SKIP
2ac70 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20  SCAN;.    nIter 
2ac80 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
2ac90 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d  ogEst[saved_nEq]
2aca0 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
2acb0 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
2acc0 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  +1];.    pNew->n
2acd0 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20  Out -= nIter;.  
2ace0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65    /* TUNING:  Be
2acf0 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74  cause uncertaint
2ad00 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d  ies in the estim
2ad10 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63  ates for skip-sc
2ad20 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20  an queries,.    
2ad30 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66  ** add a 1.375 f
2ad40 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d  udge factor to m
2ad50 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c  ake skip-scan sl
2ad60 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65  ightly less like
2ad70 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72  ly. */.    nIter
2ad80 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65   += 5;.    where
2ad90 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
2ada0 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
2adb0 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
2adc0 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
2add0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
2ade0 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77  d_nOut;.    pNew
2adf0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
2ae00 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
2ae10 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
2ae20 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e  ed_nSkip;.    pN
2ae30 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
2ae40 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d  ved_wsFlags;.  }
2ae50 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2ae60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2ae70 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  rue if it is pos
2ae80 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65  sible that pInde
2ae90 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75  x might be usefu
2aea0 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  l in.** implemen
2aeb0 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
2aec0 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69  Y clause in pBui
2aed0 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lder..**.** Retu
2aee0 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69  rn False if pBui
2aef0 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f  lder does not co
2af00 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  ntain an ORDER B
2af10 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69  Y clause or.** i
2af20 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  f there is no wa
2af30 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20  y for pIndex to 
2af40 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70  be useful in imp
2af50 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a  lementing that.*
2af60 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
2af70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2af80 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
2af90 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68  ithOrderBy(.  Wh
2afa0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
2afb0 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65  pBuilder,.  Inde
2afc0 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74  x *pIndex,.  int
2afd0 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78   iCursor.){.  Ex
2afe0 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69  prList *pOB;.  i
2aff0 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66  nt ii, jj;..  if
2b000 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  ( pIndex->bUnord
2b010 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  ered ) return 0;
2b020 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42  .  if( (pOB = pB
2b030 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
2b040 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72  pOrderBy)==0 ) r
2b050 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
2b060 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78  i=0; ii<pOB->nEx
2b070 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45  pr; ii++){.    E
2b080 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c  xpr *pExpr = sql
2b090 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2b0a0 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70  ate(pOB->a[ii].p
2b0b0 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
2b0c0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2b0d0 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
2b0e0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2b0f0 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29  Table==iCursor )
2b100 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
2b110 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  r->iColumn<0 ) r
2b120 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66  eturn 1;.      f
2b130 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
2b140 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
2b150 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2b160 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
2b170 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
2b180 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
2b190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b1a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2b1b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2b1c0 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
2b1d0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
2b1e0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2b1f0 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
2b200 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
2b210 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
2b220 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
2b230 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
2b240 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
2b250 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
2b260 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
2b270 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
2b280 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
2b290 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
2b2a0 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
2b2b0 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
2b2c0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
2b2d0 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e  n[j];.    if( x>
2b2e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
2b2f0 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
2b300 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2b310 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
2b320 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
2b330 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
2b340 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2b350 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43  eturn m;.}../* C
2b360 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
2b370 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77   partial index w
2b380 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68  ith pPartIndexWh
2b390 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ere can be used.
2b3a0 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
2b3b0 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  t query.  Return
2b3c0 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20   true if it can 
2b3d0 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  be and false if 
2b3e0 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
2b3f0 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61  nt whereUsablePa
2b400 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69  rtialIndex(int i
2b410 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65  Tab, WhereClause
2b420 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68   *pWC, Expr *pWh
2b430 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ere){.  int i;. 
2b440 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2b450 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54  m;.  for(i=0, pT
2b460 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
2b470 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
2b480 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
2b490 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
2b4a0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
2b4b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2b4c0 69 65 73 45 78 70 72 28 70 45 78 70 72 2c 20 70  iesExpr(pExpr, p
2b4d0 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a 20 20  Where, iTab) .  
2b4e0 20 20 20 26 26 20 28 21 45 78 70 72 48 61 73 50     && (!ExprHasP
2b4f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2b500 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70  P_FromJoin) || p
2b510 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
2b520 54 61 62 6c 65 3d 3d 69 54 61 62 29 0a 20 20 20  Table==iTab).   
2b530 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b540 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
2b550 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2b560 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
2b570 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
2b580 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
2b590 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72  of the join wher
2b5a0 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69  e the table.** i
2b5b0 73 20 69 64 65 6e 66 69 65 64 20 62 79 20 70 42  s idenfied by pB
2b5c0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
2b5d0 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
2b5e0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2b5f0 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20   be.** a b-tree 
2b600 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72  table, not a vir
2b610 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
2b620 2a 20 54 68 65 20 63 6f 73 74 73 20 28 57 68 65  * The costs (Whe
2b630 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20  reLoop.rRun) of 
2b640 74 68 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73  the b-tree loops
2b650 20 61 64 64 65 64 20 62 79 20 74 68 69 73 20 66   added by this f
2b660 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63  unction.** are c
2b670 61 6c 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c  alculated as fol
2b680 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  lows:.**.** For 
2b690 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73  a full scan, ass
2b6a0 75 6d 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  uming the table 
2b6b0 28 6f 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61  (or index) conta
2b6c0 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a  ins nRow rows:.*
2b6d0 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
2b6e0 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20  nRow * 3.0      
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2b700 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
2b710 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
2b720 52 6f 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20  Row * K         
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2b740 73 63 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67  scan of covering
2b750 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f   index.**     co
2b760 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33  st = nRow * (K+3
2b770 2e 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20  .0)             
2b780 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f     // scan of no
2b790 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
2b7a0 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69  .**.** where K i
2b7b0 73 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65  s a value betwee
2b7c0 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65  n 1.1 and 3.0 se
2b7d0 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  t based on the r
2b7e0 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69  elative .** esti
2b7f0 6d 61 74 65 64 20 61 76 65 72 61 67 65 20 73 69  mated average si
2b800 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
2b810 61 6e 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64  and table record
2b820 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  s..**.** For an 
2b830 69 6e 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72  index scan, wher
2b840 65 20 6e 56 69 73 69 74 20 69 73 20 74 68 65 20  e nVisit is the 
2b850 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  number of index 
2b860 72 6f 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20  rows visited.** 
2b870 62 79 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64  by the scan, and
2b880 20 6e 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75   nSeek is the nu
2b890 6d 62 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65  mber of seek ope
2b8a0 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  rations required
2b8b0 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65   on .** the inde
2b8c0 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20  x b-tree:.**.** 
2b8d0 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b      cost = nSeek
2b8e0 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20   * (log(nRow) + 
2b8f0 4b 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20  K * nVisit)     
2b900 20 20 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67       // covering
2b910 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f   index.**     co
2b920 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
2b930 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30  g(nRow) + (K+3.0
2b940 29 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f  ) * nVisit)    /
2b950 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  / non-covering i
2b960 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  ndex.**.** Norma
2b970 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e  lly, nSeek is 1.
2b980 20 6e 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72   nSeek values gr
2b990 65 61 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d  eater than 1 com
2b9a0 65 20 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a  e about if the .
2b9b0 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2b9c0 69 6e 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28  includes "x IN (
2b9d0 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65  ....)" terms use
2b9e0 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78  d in place of "x
2b9f0 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a  =?". Or when .**
2ba00 20 69 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20   implicit "x IN 
2ba10 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
2ba20 62 6c 29 22 20 74 65 72 6d 73 20 61 72 65 20 61  bl)" terms are a
2ba30 64 64 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63  dded for skip-sc
2ba40 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ans..**.** The e
2ba50 73 74 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20  stimated values 
2ba60 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e  (nRow, nVisit, n
2ba70 53 65 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74  Seek) often cont
2ba80 61 69 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75  ain a large amou
2ba90 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61  nt.** of uncerta
2baa0 69 6e 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20  inty.  For this 
2bab0 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20  reason, scoring 
2bac0 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70  is designed to p
2bad0 69 63 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a  ick plans that.*
2bae0 2a 20 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20  * "do the least 
2baf0 68 61 72 6d 22 20 69 66 20 74 68 65 20 65 73 74  harm" if the est
2bb00 69 6d 61 74 65 73 20 61 72 65 20 69 6e 61 63 63  imates are inacc
2bb10 75 72 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d  urate.  For exam
2bb20 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52  ple, a.** log(nR
2bb30 6f 77 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d  ow) factor is om
2bb40 69 74 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e  itted from a non
2bb50 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
2bb60 73 63 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  scan in order to
2bb70 0a 2a 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f  .** bias the sco
2bb80 72 69 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66  ring in favor of
2bb90 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c   using an index,
2bba0 20 73 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74   since the worst
2bbb0 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d  -case.** perform
2bbc0 61 6e 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e  ance of using an
2bbd0 20 69 6e 64 65 78 20 69 73 20 66 61 72 20 62 65   index is far be
2bbe0 74 74 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f  tter than the wo
2bbf0 72 73 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d  rst-case perform
2bc00 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c  ance.** of a ful
2bc10 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f  l table scan..*/
2bc20 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2bc30 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20  eLoopAddBtree(. 
2bc40 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
2bc50 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20  r *pBuilder, /* 
2bc60 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
2bc70 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
2bc80 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20  tmask mExtra    
2bc90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
2bca0 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73  ra prerequesites
2bcb0 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20   for using this 
2bcc0 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
2bcd0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
2bce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
2bcf0 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
2bd00 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
2bd10 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
2bd20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
2bd30 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
2bd40 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50  ng */.  Index sP
2bd50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2bd60 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e      /* A fake in
2bd70 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  dex object for t
2bd80 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
2bd90 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77  /.  LogEst aiRow
2bda0 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20  EstPk[2];       
2bdb0 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45  /* The aiRowLogE
2bdc0 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
2bdd0 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
2bde0 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b    i16 aiColumnPk
2bdf0 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
2be00 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
2be10 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
2be20 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c   index */.  SrcL
2be30 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
2be40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
2be50 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
2be60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2be70 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54  tem *pSrc;  /* T
2be80 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62  he FROM clause b
2be90 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64  tree term to add
2bea0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2beb0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
2bec0 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
2bed0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
2bee0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2bef0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2bf00 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2bf10 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78  /.  int iSortIdx
2bf20 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2bf30 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
2bf40 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20  */.  int b;     
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf60 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61   /* A boolean va
2bf70 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  lue */.  LogEst 
2bf80 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
2bf90 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f       /* number o
2bfa0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
2bfb0 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
2bfc0 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
2bfd0 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
2bfe0 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
2bff0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
2c000 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  able */.  WhereC
2c010 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
2c020 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2c030 73 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  sed WHERE clause
2c040 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2c050 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2c060 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2c070 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20   queried */.  . 
2c080 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
2c090 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f  ->pNew;.  pWInfo
2c0a0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2c0b0 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  nfo;.  pTabList 
2c0c0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2c0d0 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61  st;.  pSrc = pTa
2c0e0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
2c0f0 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20  >iTab;.  pTab = 
2c100 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
2c110 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
2c120 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49 73  C;.  assert( !Is
2c130 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54  Virtual(pSrc->pT
2c140 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ab) );..  if( pS
2c150 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20  rc->pIndex ){.  
2c160 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20    /* An INDEXED 
2c170 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66  BY clause specif
2c180 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  ies a particular
2c190 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f   index to use */
2c1a0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53  .    pProbe = pS
2c1b0 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65  rc->pIndex;.  }e
2c1c0 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69  lse if( !HasRowi
2c1d0 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70  d(pTab) ){.    p
2c1e0 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49  Probe = pTab->pI
2c1f0 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
2c200 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
2c210 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
2c220 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
2c230 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
2c240 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a   in local.    **
2c250 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f   variable sPk to
2c260 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
2c270 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
2c280 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68   index.  Make th
2c290 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69  is.    ** fake i
2c2a0 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69  ndex the first i
2c2b0 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64  n a chain of Ind
2c2c0 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20  ex objects with 
2c2d0 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a  all of the real.
2c2e0 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74      ** indices t
2c2f0 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
2c300 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
2c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c320 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c  /* First of real
2c330 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
2c340 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
2c350 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
2c360 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
2c370 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31   sPk.nKeyCol = 1
2c380 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d  ;.    sPk.nColum
2c390 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61  n = 1;.    sPk.a
2c3a0 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c  iColumn = &aiCol
2c3b0 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61  umnPk;.    sPk.a
2c3c0 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52  iRowLogEst = aiR
2c3d0 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b  owEstPk;.    sPk
2c3e0 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
2c3f0 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
2c400 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
2c410 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d    sPk.szIdxRow =
2c420 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b   pTab->szTabRow;
2c430 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
2c440 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0] = pTab->nRowL
2c450 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  ogEst;.    aiRow
2c460 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20  EstPk[1] = 0;.  
2c470 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
2c480 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
2c490 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74     if( pSrc->not
2c4a0 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
2c4b0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
2c4c0 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
2c4d0 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
2c4e0 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
2c4f0 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
2c500 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
2c510 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
2c520 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2c530 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
2c540 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
2c550 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
2c560 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65  sPk;.  }.  rSize
2c570 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
2c580 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  Est;.  rLogSize 
2c590 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
2c5a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c5b0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
2c5c0 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d  INDEX.  /* Autom
2c5d0 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a  atic indexes */.
2c5e0 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d    if( !pBuilder-
2c5f0 3e 70 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70  >pOrSet.   && (p
2c600 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2c610 73 20 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54  s & WHERE_NO_AUT
2c620 4f 49 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26 26  OINDEX)==0.   &&
2c630 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65   (pWInfo->pParse
2c640 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
2c650 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21  LITE_AutoIndex)!
2c660 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70  =0.   && pSrc->p
2c670 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21  Index==0.   && !
2c680 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69  pSrc->viaCorouti
2c690 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  ne.   && !pSrc->
2c6a0 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26  notIndexed.   &&
2c6b0 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a   HasRowid(pTab).
2c6c0 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43     && !pSrc->isC
2c6d0 6f 72 72 65 6c 61 74 65 64 0a 20 20 20 26 26 20  orrelated.   && 
2c6e0 21 70 53 72 63 2d 3e 69 73 52 65 63 75 72 73 69  !pSrc->isRecursi
2c6f0 76 65 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47  ve.  ){.    /* G
2c700 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64  enerate auto-ind
2c710 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f  ex WhereLoops */
2c720 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
2c730 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65  pTerm;.    Where
2c740 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70  Term *pWCEnd = p
2c750 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
2c760 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  rm;.    for(pTer
2c770 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51  m=pWC->a; rc==SQ
2c780 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
2c790 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
2c7a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
2c7b0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
2c7c0 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
2c7d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c7e0 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
2c7f0 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
2c800 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20  pSrc, 0) ){.    
2c810 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
2c820 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  e.nEq = 1;.     
2c830 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d     pNew->nSkip =
2c840 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
2c850 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2c860 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 0;.        pN
2c870 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  ew->nLTerm = 1;.
2c880 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
2c890 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
2c8a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
2c8b0 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73  NG: One-time cos
2c8c0 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20  t for computing 
2c8d0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
2c8e0 64 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a  dex is.        *
2c8f0 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62  * estimated to b
2c900 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68  e X*N*log2(N) wh
2c910 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
2c920 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20  ber of rows in. 
2c930 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61         ** the ta
2c940 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
2c950 64 20 61 6e 64 20 77 68 65 72 65 20 58 20 69 73  d and where X is
2c960 20 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66   7 (LogEst=28) f
2c970 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20  or normal.      
2c980 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31    ** tables or 1
2c990 2e 33 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20  .375 (LogEst=4) 
2c9a0 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75  for views and su
2c9b0 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 76  bqueries.  The v
2c9c0 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
2c9d0 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20  of X is smaller 
2c9e0 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75  for views and su
2c9f0 62 71 75 65 72 69 65 73 20 73 6f 20 74 68 61 74  bqueries so that
2ca00 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
2ca10 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  er.        ** wi
2ca20 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65  ll be more aggre
2ca30 73 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65  ssive about gene
2ca40 72 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  rating automatic
2ca50 20 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20   indexes for.   
2ca60 20 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62       ** those ob
2ca70 6a 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65  jects, since the
2ca80 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75  re is no opportu
2ca90 6e 69 74 79 20 74 6f 20 61 64 64 20 73 63 68 65  nity to add sche
2caa0 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ma.        ** in
2cab0 64 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72  dexes on subquer
2cac0 69 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a  ies and views. *
2cad0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
2cae0 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a  rSetup = rLogSiz
2caf0 65 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20  e + rSize + 4;. 
2cb00 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
2cb10 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28  >pSelect==0 && (
2cb20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2cb30 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
2cb40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
2cb50 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32  New->rSetup += 2
2cb60 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
2cb70 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75       ApplyCostMu
2cb80 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
2cb90 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73  Setup, pTab->cos
2cba0 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  tMult);.        
2cbb0 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20  /* TUNING: Each 
2cbc0 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65  index lookup yie
2cbd0 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74  lds 20 rows in t
2cbe0 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a  he table.  This.
2cbf0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f          ** is mo
2cc00 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61  re than the usua
2cc10 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f  l guess of 10 ro
2cc20 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76  ws, since we hav
2cc30 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20  e no way.       
2cc40 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68   ** of knowing h
2cc50 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65  ow selective the
2cc60 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69   index will ulti
2cc70 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77  mately be.  It w
2cc80 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
2cc90 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61  not be unreasona
2cca0 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  ble to make this
2ccb0 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67   value much larg
2ccc0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  er. */.        p
2ccd0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20  New->nOut = 43; 
2cce0 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c   assert( 43==sql
2ccf0 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29  ite3LogEst(20) )
2cd00 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2cd10 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
2cd20 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
2cd30 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20  ,pNew->nOut);.  
2cd40 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2cd50 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f  ags = WHERE_AUTO
2cd60 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20  _INDEX;.        
2cd70 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
2cd80 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70  Extra | pTerm->p
2cd90 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
2cda0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2cdb0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2cdc0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2cdd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
2cde0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2cdf0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
2ce00 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  X */..  /* Loop 
2ce10 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73  over all indices
2ce20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63  .  */.  for(; rc
2ce30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2ce40 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50  Probe; pProbe=pP
2ce50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f  robe->pNext, iSo
2ce60 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66  rtIdx++){.    if
2ce70 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  ( pProbe->pPartI
2ce80 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20  dxWhere!=0.     
2ce90 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  && !whereUsableP
2cea0 61 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63  artialIndex(pSrc
2ceb0 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20  ->iCursor, pWC, 
2cec0 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
2ced0 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
2cee0 74 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e  testcase( pNew->
2cef0 69 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72  iTab!=pSrc->iCur
2cf00 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74  sor );  /* See t
2cf10 69 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66  icket [98d973b8f
2cf20 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  5] */.      cont
2cf30 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61  inue;  /* Partia
2cf40 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70  l index inapprop
2cf50 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71  riate for this q
2cf60 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  uery */.    }.  
2cf70 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65    rSize = pProbe
2cf80 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
2cf90 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
2cfa0 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20  ree.nEq = 0;.   
2cfb0 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30   pNew->nSkip = 0
2cfc0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
2cfd0 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rm = 0;.    pNew
2cfe0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
2cff0 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
2d000 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
2d010 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b  prereq = mExtra;
2d020 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
2d030 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65  = rSize;.    pNe
2d040 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
2d050 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20  x = pProbe;.    
2d060 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65  b = indexMightHe
2d070 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70 42  lpWithOrderBy(pB
2d080 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20  uilder, pProbe, 
2d090 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  pSrc->iCursor);.
2d0a0 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41      /* The ONEPA
2d0b0 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73  SS_DESIRED flags
2d0c0 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f   never occurs to
2d0d0 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44 45  gether with ORDE
2d0e0 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65  R BY */.    asse
2d0f0 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  rt( (pWInfo->wct
2d100 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d110 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
2d120 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20  ==0 || b==0 );. 
2d130 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74     if( pProbe->t
2d140 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  num<=0 ){.      
2d150 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61  /* Integer prima
2d160 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a  ry key index */.
2d170 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2d180 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b  ags = WHERE_IPK;
2d190 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  ..      /* Full 
2d1a0 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20  table scan */.  
2d1b0 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
2d1c0 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64  dx = b ? iSortId
2d1d0 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  x : 0;.      /* 
2d1e0 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
2d1f0 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
2d200 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20  is (N*3.0). */. 
2d210 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2d220 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20  = rSize + 16;.  
2d230 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
2d240 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
2d250 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75  un, pTab->costMu
2d260 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  lt);.      where
2d270 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
2d280 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  (pWC, pNew, rSiz
2d290 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  e);.      rc = w
2d2a0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2d2b0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2d2c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2d2d0 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20   = rSize;.      
2d2e0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2d2f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d300 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20   Bitmask m;.    
2d310 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73    if( pProbe->is
2d320 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20  Covering ){.    
2d330 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2d340 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s = WHERE_IDX_ON
2d350 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58  LY | WHERE_INDEX
2d360 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20  ED;.        m = 
2d370 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2d380 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63          m = pSrc
2d390 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
2d3a0 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f  umnsInIndex(pPro
2d3b0 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  be);.        pNe
2d3c0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d  w->wsFlags = (m=
2d3d0 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58  =0) ? (WHERE_IDX
2d3e0 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45  _ONLY|WHERE_INDE
2d3f0 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44  XED) : WHERE_IND
2d400 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  EXED;.      }.. 
2d410 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61       /* Full sca
2d420 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20  n via index */. 
2d430 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20       if( b.     
2d440 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70    || !HasRowid(p
2d450 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  Tab).       || (
2d460 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26   m==0.         &
2d470 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  & pProbe->bUnord
2d480 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20  ered==0.        
2d490 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49   && (pProbe->szI
2d4a0 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
2d4b0 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26  bRow).         &
2d4c0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
2d4d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2d4e0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
2d4f0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  0.         && sq
2d500 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2d510 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20  g.bUseCis.      
2d520 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2d530 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f  onEnabled(pWInfo
2d540 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  ->pParse->db, SQ
2d550 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61  LITE_CoverIdxSca
2d560 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20  n).          ). 
2d570 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d580 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2d590 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
2d5a0 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  0;..        /* T
2d5b0 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
2d5c0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ing the index ro
2d5d0 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65  ws is N*K, where
2d5e0 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   K is.        **
2d5f0 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
2d600 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20   3.0, depending 
2d610 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
2d620 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20  sizes of the.   
2d630 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e       ** index an
2d640 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 49 66  d table rows. If
2d650 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
2d660 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
2d670 61 6e 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  an,.        ** a
2d680 6c 73 6f 20 61 64 64 20 74 68 65 20 63 6f 73 74  lso add the cost
2d690 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 61 62   of visiting tab
2d6a0 6c 65 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29 2e  le rows (N*3.0).
2d6b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
2d6c0 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
2d6d0 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65  + 1 + (15*pProbe
2d6e0 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62  ->szIdxRow)/pTab
2d6f0 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
2d700 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
2d710 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2d720 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
2d730 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
2d740 75 6e 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a 20  un, rSize+16);. 
2d750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d760 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
2d770 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
2d780 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
2d790 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
2d7a0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
2d7b0 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
2d7c0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2d7d0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2d7e0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2d7f0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2d800 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
2d810 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
2d820 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2d830 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65   }..    rc = whe
2d840 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
2d850 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
2d860 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a  rc, pProbe, 0);.
2d870 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2d880 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
2d890 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53  AT4.    sqlite3S
2d8a0 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42  tat4ProbeFree(pB
2d8b0 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20  uilder->pRec);. 
2d8c0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
2d8d0 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  cValid = 0;.    
2d8e0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
2d8f0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
2d900 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2d910 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
2d920 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
2d930 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69  that one index i
2d940 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  s.    ** conside
2d950 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
2d960 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62  pSrc->pIndex ) b
2d970 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
2d980 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
2d990 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2d9a0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
2d9b0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
2d9c0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
2d9d0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
2d9e0 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  in identified by
2d9f0 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  .** pBuilder->pN
2da00 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
2da10 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
2da20 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74  eed to be a virt
2da30 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
2da40 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
2da50 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20  opAddVirtual(.  
2da60 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2da70 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20   *pBuilder,  /* 
2da80 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
2da90 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
2daa0 74 6d 61 73 6b 20 6d 45 78 74 72 61 0a 29 7b 0a  tmask mExtra.){.
2dab0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2dac0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
2dad0 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
2dae0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
2daf0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
2db00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2db10 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
2db20 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
2db30 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
2db40 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2db50 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
2db60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2db70 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65   *pSrc;   /* The
2db80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2db90 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
2dba0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
2dbb0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
2dbc0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
2dbd0 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73  o *pIdxInfo;.  s
2dbe0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2dbf0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
2dc00 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
2dc10 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
2dc20 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
2dc30 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
2dc40 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
2dc50 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
2dc60 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a   iTerm, mxTerm;.
2dc70 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
2dc80 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20  t;.  int seenIn 
2dc90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2dca0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2dcb0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73  IN operator is s
2dcc0 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  een */.  int see
2dcd0 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nVar = 0;       
2dce0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2dcf0 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20   a non-constant 
2dd00 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65  constraint is se
2dd10 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61  en */.  int iPha
2dd20 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2dd30 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74       /* 0: const
2dd40 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73   w/o IN, 1: cons
2dd50 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a  t, 2: no IN,  2:
2dd60 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f   IN */.  WhereLo
2dd70 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  op *pNew;.  int 
2dd80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2dd90 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
2dda0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2ddb0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
2ddc0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
2ddd0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57  pParse->db;.  pW
2dde0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
2ddf0 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  C;.  pNew = pBui
2de00 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53  lder->pNew;.  pS
2de10 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  rc = &pWInfo->pT
2de20 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
2de30 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
2de40 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pSrc->pTab;.  as
2de50 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
2de60 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49  pTab) );.  pIdxI
2de70 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
2de80 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
2de90 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c  pWC, pSrc, pBuil
2dea0 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  der->pOrderBy);.
2deb0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
2dec0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2ded0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d  E_NOMEM;.  pNew-
2dee0 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70  >prereq = 0;.  p
2def0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2df00 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
2df10 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
2df20 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e  TABLE;.  pNew->n
2df30 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65  LTerm = 0;.  pNe
2df40 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2df50 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65  ee = 0;.  pUsage
2df60 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
2df70 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
2df80 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
2df90 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2dfa0 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72  aint;.  if( wher
2dfb0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
2dfc0 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  pNew, nConstrain
2dfd0 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
2dfe0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
2dff0 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  Info);.    retur
2e000 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2e010 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73    }..  for(iPhas
2e020 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20  e=0; iPhase<=3; 
2e030 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69  iPhase++){.    i
2e040 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69  f( !seenIn && (i
2e050 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20  Phase&1)!=0 ){. 
2e060 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20       iPhase++;. 
2e070 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e       if( iPhase>
2e080 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  3 ) break;.    }
2e090 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61  .    if( !seenVa
2e0a0 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20  r && iPhase>1 ) 
2e0b0 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43  break;.    pIdxC
2e0c0 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
2e0d0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2e0e0 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
2e0f0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
2e100 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2e110 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
2e120 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
2e130 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20  xCons++){.      
2e140 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
2e150 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
2e160 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
2e170 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63  [j];.      switc
2e180 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20  h( iPhase ){.   
2e190 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20       case 0:    
2e1a0 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
2e1b0 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72  hout IN operator
2e1c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
2e1d0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2e1e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2e1f0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2e200 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
2e210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2e220 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eenIn = 1;.     
2e230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e240 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
2e250 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20  eqRight!=0 ){.  
2e260 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61            seenVa
2e270 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r = 1;.         
2e280 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
2e290 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2e2a0 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_IN)==0 ){.    
2e2b0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2e2c0 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
2e2d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e2e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2e2f0 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a     case 1:    /*
2e300 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   Constants with 
2e310 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
2e320 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2e330 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  ( seenIn );.    
2e340 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2e350 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
2e360 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29  >prereqRight==0)
2e370 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2e380 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
2e390 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
2e3a0 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
2e3b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2e3c0 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
2e3d0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2e3e0 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
2e3f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2e400 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
2e410 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2e420 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
2e430 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
2e440 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
2e450 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
2e460 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
2e470 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2e480 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
2e490 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2e4a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2e4b0 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
2e4c0 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
2e4d0 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
2e4e0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
2e4f0 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
2e500 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
2e510 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
2e520 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
2e530 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
2e540 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
2e550 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
2e560 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
2e570 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2e580 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
2e590 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
2e5a0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
2e5b0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
2e5c0 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
2e5d0 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
2e5e0 6c 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e  le)2;.    pIdxIn
2e5f0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
2e600 73 20 3d 20 32 35 3b 0a 20 20 20 20 72 63 20 3d  s = 25;.    rc =
2e610 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
2e620 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
2e630 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  xInfo);.    if( 
2e640 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c  rc ) goto whereL
2e650 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
2e660 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
2e670 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
2e680 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2e690 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
2e6a0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
2e6b0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
2e6c0 45 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72  Extra;.    mxTer
2e6d0 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  m = -1;.    asse
2e6e0 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rt( pNew->nLSlot
2e6f0 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b  >=nConstraint );
2e700 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2e710 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2e720 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ) pNew->aLTerm[i
2e730 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  ] = 0;.    pNew-
2e740 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
2e750 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
2e760 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
2e770 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
2e780 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69  +){.      if( (i
2e790 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d  Term = pUsage[i]
2e7a0 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e  .argvIndex - 1)>
2e7b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  =0 ){.        j 
2e7c0 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
2e7d0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
2e7e0 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e   if( iTerm>=nCon
2e7f0 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20  straint.        
2e800 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20   || j<0.        
2e810 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72   || j>=pWC->nTer
2e820 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e  m.         || pN
2e830 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
2e840 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  ]!=0.        ){.
2e850 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2e860 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2e870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2e880 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2e890 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20  %s.xBestIndex() 
2e8a0 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54  malfunction", pT
2e8b0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
2e8c0 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
2e8d0 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
2e8e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e8f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
2e900 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm==nConstraint
2e910 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  -1 );.        te
2e920 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a  stcase( j==0 );.
2e930 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2e940 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  ( j==pWC->nTerm-
2e950 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  1 );.        pTe
2e960 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
2e970 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2e980 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e  rereq |= pTerm->
2e990 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
2e9a0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65       assert( iTe
2e9b0 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  rm<pNew->nLSlot 
2e9c0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2e9d0 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d  >aLTerm[iTerm] =
2e9e0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
2e9f0 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d  if( iTerm>mxTerm
2ea00 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72   ) mxTerm = iTer
2ea10 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  m;.        testc
2ea20 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29  ase( iTerm==15 )
2ea30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2ea40 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b  se( iTerm==16 );
2ea50 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2ea60 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b  rm<16 && pUsage[
2ea70 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e  i].omit ) pNew->
2ea80 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
2ea90 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20  |= 1<<iTerm;.   
2eaa0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2eab0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2eac0 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
2ead0 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
2eae0 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  ].omit==0 ){.   
2eaf0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2eb00 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ot attempt to us
2eb10 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  e an IN constrai
2eb20 6e 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61  nt if the virtua
2eb30 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  l table.        
2eb40 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74      ** says that
2eb50 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
2eb60 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EQ constraint ca
2eb70 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f  nnot be safely o
2eb80 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20  mitted..        
2eb90 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20      ** If we do 
2eba0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73  attempt to use s
2ebb0 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  uch a constraint
2ebc0 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68  , some rows migh
2ebd0 74 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20  t be.           
2ebe0 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20   ** repeated in 
2ebf0 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20  the output. */. 
2ec00 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2ec10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2ec20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72          /* A vir
2ec30 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
2ec40 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
2ec50 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d  y an IN clause m
2ec60 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20  ay not.         
2ec70 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20   ** consume the 
2ec80 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2ec90 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20  because (1) the 
2eca0 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d  order of IN term
2ecb0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
2ecc0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
2ecd0 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
2ece0 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
2ecf0 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
2ed00 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74       ** (2) Mult
2ed10 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f  iple outputs fro
2ed20 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61  m a single IN va
2ed30 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72  lue will not mer
2ed40 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ge.          ** 
2ed50 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20  together.  */.  
2ed60 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
2ed70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2ed80 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  d = 0;.        }
2ed90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2eda0 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74     if( i>=nConst
2edb0 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70  raint ){.      p
2edc0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78  New->nLTerm = mx
2edd0 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73  Term+1;.      as
2ede0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
2edf0 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
2ee00 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
2ee10 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20  u.vtab.idxNum = 
2ee20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
2ee30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2ee40 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2ee50 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2ee60 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20  FreeIdxStr;.    
2ee70 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
2ee80 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
2ee90 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2eea0 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
2eeb0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
2eec0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2eed0 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  ab.isOrdered = (
2eee0 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  i8)(pIdxInfo->or
2eef0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a  derByConsumed ?.
2ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
2ef30 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20  nOrderBy : 0);. 
2ef40 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
2ef50 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
2ef60 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
2ef70 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c  3LogEstFromDoubl
2ef80 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  e(pIdxInfo->esti
2ef90 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20  matedCost);.    
2efa0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
2efb0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64  qlite3LogEst(pId
2efc0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
2efd0 52 6f 77 73 29 3b 0a 20 20 20 20 20 20 77 68 65  Rows);.      whe
2efe0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2eff0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2f000 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
2f010 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
2f020 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f030 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
2f040 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
2f050 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2f060 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
2f070 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2f080 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
2f090 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
2f0a0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2f0b0 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
2f0c0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
2f0d0 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
2f0e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2f0f0 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
2f100 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2f110 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2f120 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2f130 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
2f140 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
2f150 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
2f160 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
2f170 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
2f180 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
2f190 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
2f1a0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2f1b0 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  dOr(WhereLoopBui
2f1c0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
2f1d0 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b  Bitmask mExtra){
2f1e0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2f1f0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2f200 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
2f210 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
2f220 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2f230 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2f240 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
2f250 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f260 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
2f270 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
2f280 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
2f290 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
2f2a0 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
2f2b0 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74  sSum, sCur;.  st
2f2c0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2f2d0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70  m *pItem;.  .  p
2f2e0 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
2f2f0 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70  WC;.  pWCEnd = p
2f300 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
2f310 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  rm;.  pNew = pBu
2f320 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d  ilder->pNew;.  m
2f330 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20  emset(&sSum, 0, 
2f340 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20  sizeof(sSum));. 
2f350 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
2f360 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70  >pTabList->a + p
2f370 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75  New->iTab;.  iCu
2f380 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
2f390 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d  or;..  for(pTerm
2f3a0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
2f3b0 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c  WCEnd && rc==SQL
2f3c0 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29  ITE_OK; pTerm++)
2f3d0 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
2f3e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2f3f0 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20  _OR)!=0.     && 
2f400 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  (pTerm->u.pOrInf
2f410 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70  o->indexable & p
2f420 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  New->maskSelf)!=
2f430 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
2f440 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f  WhereClause * co
2f450 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65  nst pOrWC = &pTe
2f460 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
2f470 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
2f480 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  rm * const pOrWC
2f490 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b  End = &pOrWC->a[
2f4a0 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  pOrWC->nTerm];. 
2f4b0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
2f4c0 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  pOrTerm;.      i
2f4d0 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
2f4e0 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
2f4f0 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c   .      sSubBuil
2f500 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20  d = *pBuilder;. 
2f510 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
2f520 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2f530 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
2f540 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20  Set = &sCur;..  
2f550 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
2f560 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72  x200, ("Begin pr
2f570 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75  ocessing OR-clau
2f580 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29  se %p\n", pTerm)
2f590 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  );.      for(pOr
2f5a0 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
2f5b0 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
2f5c0 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
2f5d0 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
2f5e0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2f5f0 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
2f600 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
2f610 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d  .pWC = &pOrTerm-
2f620 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  >u.pAndInfo->wc;
2f630 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2f640 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
2f650 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
2f660 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2f670 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  .pWInfo = pWC->p
2f680 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  WInfo;.         
2f690 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d   tempWC.pOuter =
2f6a0 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pWC;.          
2f6b0 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
2f6c0 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ND;.          te
2f6d0 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
2f6e0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2f6f0 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
2f700 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
2f710 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  d.pWC = &tempWC;
2f720 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2f730 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2f740 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
2f750 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30        sCur.n = 0
2f760 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
2f770 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2f780 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
2f790 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20  x200, ("OR-term 
2f7a0 25 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20  %d of %p has %d 
2f7b0 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20  subterms:\n", . 
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7d0 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d    (int)(pOrTerm-
2f7e0 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d  pOrWC->a), pTerm
2f7f0 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d  , sSubBuild.pWC-
2f800 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20  >nTerm));.      
2f810 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2f820 72 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20  reTrace & 0x400 
2f830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
2f840 28 69 3d 30 3b 20 69 3c 73 53 75 62 42 75 69 6c  (i=0; i<sSubBuil
2f850 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  d.pWC->nTerm; i+
2f860 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2f870 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26  whereTermPrint(&
2f880 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 61  sSubBuild.pWC->a
2f890 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  [i], i);.       
2f8a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
2f8b0 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
2f8c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2f8d0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69  LTABLE.        i
2f8e0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
2f8f0 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
2f900 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2f910 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2f920 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
2f930 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ra);.        }el
2f940 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
2f950 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63    {.          rc
2f960 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
2f970 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c  tree(&sSubBuild,
2f980 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   mExtra);.      
2f990 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2f9a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f9b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2f9c0 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26  whereLoopAddOr(&
2f9d0 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
2f9e0 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
2f9f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2fa00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  ==SQLITE_OK || s
2fa10 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  Cur.n==0 );.    
2fa20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d      if( sCur.n==
2fa30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
2fa40 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
2fa50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2fa60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
2fa70 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
2fa80 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75  whereOrMove(&sSu
2fa90 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20  m, &sCur);.     
2faa0 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
2fab0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fac0 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53          WhereOrS
2fad0 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20  et sPrev;.      
2fae0 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
2faf0 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a  &sPrev, &sSum);.
2fb00 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
2fb10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2fb20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76  for(i=0; i<sPrev
2fb30 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
2fb40 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2fb50 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20  <sCur.n; j++){. 
2fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2fb70 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d  reOrInsert(&sSum
2fb80 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65  , sPrev.a[i].pre
2fb90 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e  req | sCur.a[j].
2fba0 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  prereq,.        
2fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbc0 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
2fbd0 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
2fbe0 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  rRun, sCur.a[j].
2fbf0 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  rRun),.         
2fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc10 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
2fc20 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e  Add(sPrev.a[i].n
2fc30 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e  Out, sCur.a[j].n
2fc40 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Out));.         
2fc50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2fc60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fc70 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
2fc80 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
2fc90 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
2fca0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2fcb0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2fcc0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
2fcd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
2fce0 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
2fcf0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
2fd00 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
2fd10 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  pNew->u, 0, size
2fd20 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20  of(pNew->u));.  
2fd30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
2fd40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
2fd50 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  sSum.n; i++){.  
2fd60 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2fd70 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e   Currently sSum.
2fd80 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74  a[i].rRun is set
2fd90 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74   to the sum of t
2fda0 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20  he costs.       
2fdb0 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73   ** of all sub-s
2fdc0 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79  cans required by
2fdd0 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f   the OR-scan. Ho
2fde0 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f  wever, due to ro
2fdf0 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  unding.        *
2fe00 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79  * errors, it may
2fe10 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73   be that the cos
2fe20 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e  t of the OR-scan
2fe30 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73   is equal to its
2fe40 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74  .        ** most
2fe50 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73   expensive sub-s
2fe60 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61  can. Add the sma
2fe70 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70  llest possible p
2fe80 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20  enalty .        
2fe90 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74  ** (equivalent t
2fea0 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68  o multiplying th
2feb0 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20  e cost by 1.07) 
2fec0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a  to ensure that .
2fed0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2fee0 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e  does not happen.
2fef0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
2ff00 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75  WHERE clauses su
2ff10 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ch as the.      
2ff20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
2ff30 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
2ff40 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20   index on "y":. 
2ff50 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2ff60 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c    **     WHERE l
2ff70 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30  ikelihood(x=?, 0
2ff80 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20  .99) OR y=?.    
2ff90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2ffa0 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61  * the planner ma
2ffb0 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20  y elect to "OR" 
2ffc0 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d  together a full-
2ffd0 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61  table scan and a
2ffe0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  n.        ** ind
2fff0 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f  ex lookup. And o
30000 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f  ther similarly o
30010 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a  dd results.  */.
30020 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
30030 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
30040 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  Run + 1;.       
30050 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
30060 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
30070 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
30080 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
30090 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
300a0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
300b0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
300c0 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
300d0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
300e0 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65  200, ("End proce
300f0 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  ssing OR-clause 
30100 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a  %p\n", pTerm));.
30110 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
30120 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
30130 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
30140 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c  p objects for al
30150 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61  l tables .*/.sta
30160 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
30170 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f  pAddAll(WhereLoo
30180 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
30190 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
301a0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
301b0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42  der->pWInfo;.  B
301c0 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20  itmask mExtra = 
301d0 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  0;.  Bitmask mPr
301e0 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ior = 0;.  int i
301f0 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Tab;.  SrcList *
30200 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
30210 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
30220 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
30230 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
30240 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
30250 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
30260 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20   int nTabList = 
30270 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
30280 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30290 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72  E_OK;.  u8 prior
302a0 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20  JoinType = 0;.  
302b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
302c0 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
302d0 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
302e0 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65  he join, from le
302f0 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20  ft to right */. 
30300 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
30310 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c  ->pNew;.  whereL
30320 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20  oopInit(pNew);. 
30330 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74   for(iTab=0, pIt
30340 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  em=pTabList->a; 
30350 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69  iTab<nTabList; i
30360 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  Tab++, pItem++){
30370 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20  .    pNew->iTab 
30380 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77  = iTab;.    pNew
30390 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74  ->maskSelf = get
303a0 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
303b0 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69  askSet, pItem->i
303c0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
303d0 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79   ((pItem->jointy
303e0 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65  pe|priorJoinType
303f0 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ) & (JT_LEFT|JT_
30400 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20  CROSS))!=0 ){.  
30410 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72      mExtra = mPr
30420 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ior;.    }.    p
30430 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70  riorJoinType = p
30440 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
30450 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
30460 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
30470 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
30480 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
30490 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
304a0 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
304b0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
304c0 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69  oopAddBtree(pBui
304d0 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
304e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
304f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30500 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
30510 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72  opAddOr(pBuilder
30520 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
30530 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
30540 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
30550 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
30560 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
30570 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65  break;.  }.  whe
30580 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
30590 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
305a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61  rc;.}../*.** Exa
305b0 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68  mine a WherePath
305c0 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74   (with the addit
305d0 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61  ion of the extra
305e0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68   WhereLoop of th
305f0 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74  e 5th.** paramet
30600 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69  ers) to see if i
30610 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  t outputs rows i
30620 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
30630 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20  ORDER BY.** (or 
30640 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75  GROUP BY) withou
30650 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65  t requiring a se
30660 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72  parate sort oper
30670 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e  ation.  Return N
30680 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20  :.** .**   N>0: 
30690 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65    N terms of the
306a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
306b0 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
306c0 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65  *   N==0:  No te
306d0 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
306e0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73   BY clause are s
306f0 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c  atisfied.**   N<
30700 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74  0:   Unknown yet
30710 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20   how many terms 
30720 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68  of ORDER BY migh
30730 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20  t be satisfied. 
30740 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68    .**.** Note th
30750 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  at processing fo
30760 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  r WHERE_GROUPBY 
30770 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e  and WHERE_DISTIN
30780 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a  CTBY is not as.*
30790 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20  * strict.  With 
307a0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
307b0 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72  TINCT the only r
307c0 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68  equirement is th
307d0 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  at.** equivalent
307e0 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d   rows appear imm
307f0 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e  ediately adjacen
30800 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  t to one another
30810 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61  .  GROUP BY.** a
30820 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e  nd DISTINCT do n
30830 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20  ot require rows 
30840 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79  to appear in any
30850 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
30860 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20  r as long.** as 
30870 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20  equivalent rows 
30880 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65  are grouped toge
30890 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20  ther.  Thus for 
308a0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
308b0 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72  TINCT.** the pOr
308c0 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20  derBy terms can 
308d0 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e  be matched in an
308e0 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f  y order.  With O
308f0 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a  RDER BY, the .**
30900 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
30910 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20  must be matched 
30920 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74  in strict left-t
30930 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a  o-right order..*
30940 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72  /.static i8 wher
30950 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
30960 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e  derBy(.  WhereIn
30970 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f  fo *pWInfo,    /
30980 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
30990 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
309a0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
309b0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
309c0 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43  UP BY or DISTINC
309d0 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63  T clause to chec
309e0 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  k */.  WherePath
309f0 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20   *pPath,     /* 
30a00 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f  The WherePath to
30a10 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20   check */.  u16 
30a20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
30a30 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61    /* Might conta
30a40 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  in WHERE_GROUPBY
30a50 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e   or WHERE_DISTIN
30a60 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  CTBY */.  u16 nL
30a70 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
30a80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
30a90 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
30aa0 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
30ab0 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
30ac0 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
30ad0 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
30ae0 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
30af0 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
30b00 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
30b10 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
30b20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
30b30 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
30b40 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
30b50 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
30b60 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
30b70 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
30b80 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
30b90 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
30ba0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
30bb0 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
30bc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30bd0 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
30be0 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
30bf0 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
30c00 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
30c10 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
30c20 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
30c30 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
30c40 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
30c50 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
30c60 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
30c70 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
30c80 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
30c90 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
30ca0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
30cb0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
30cc0 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
30cd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30ce0 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70  key columns in p
30cf0 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
30d00 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
30d10 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
30d20 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75   of ordered colu
30d30 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
30d40 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
30d50 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
30d60 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
30d70 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
30d80 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
30d90 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
30da0 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
30db0 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
30dc0 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
30dd0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
30de0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
30df0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
30e00 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
30e10 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
30e20 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
30e30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
30e40 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
30e50 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
30e60 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
30e70 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
30e80 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
30e90 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
30ea0 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
30eb0 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
30ec0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
30ed0 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
30ee0 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
30ef0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
30f00 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
30f10 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
30f20 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
30f30 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
30f40 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
30f50 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
30f60 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
30f70 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
30f80 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
30f90 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
30fa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
30fb0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
30fc0 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
30fd0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
30fe0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
30ff0 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
31000 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
31010 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
31020 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
31030 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
31040 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
31050 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
31060 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
31070 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
31080 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
31090 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
310a0 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
310b0 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
310c0 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
310d0 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
310e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
310f0 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
31100 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
31110 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
31120 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
31130 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
31140 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
31150 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
31160 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
31170 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
31180 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
31190 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
311a0 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
311b0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
311c0 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
311d0 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
311e0 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
311f0 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
31200 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
31210 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
31220 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
31230 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
31240 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
31250 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
31260 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
31270 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
31280 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
31290 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
312a0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
312b0 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
312c0 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
312d0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
312e0 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
312f0 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
31300 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
31310 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
31320 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
31330 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
31340 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
31350 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
31360 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
31370 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
31380 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
31390 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
313a0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
313b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
313c0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
313d0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
313e0 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
313f0 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
31400 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
31410 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
31420 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
31430 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
31440 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
31450 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
31460 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
31470 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
31480 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
31490 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
314a0 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
314b0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
314c0 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
314d0 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
314e0 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
314f0 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
31500 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
31510 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
31520 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
31530 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
31540 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
31550 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
31560 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
31570 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
31580 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
31590 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
315a0 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
315b0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
315c0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f  !=0 );.  if( nLo
315d0 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
315e0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
315f0 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
31600 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
31610 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
31620 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
31630 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
31640 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
31650 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
31660 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
31670 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
31680 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
31690 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
316a0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
316b0 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
316c0 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
316d0 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
316e0 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
316f0 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f   ready = 0;.  fo
31700 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
31710 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
31720 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
31730 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
31740 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
31750 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
31760 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
31770 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  ;.    pLoop = iL
31780 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
31790 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
317a0 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28  : pLast;.    if(
317b0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
317c0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
317d0 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  ABLE ){.      if
317e0 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  ( pLoop->u.vtab.
317f0 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61  isOrdered ) obSa
31800 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20  t = obDone;.    
31810 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
31820 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
31830 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
31840 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
31850 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
31860 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
31870 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
31880 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
31890 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
318a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
318b0 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
318c0 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
318d0 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
318e0 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
318f0 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
31900 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
31910 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
31920 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
31930 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
31940 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
31950 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
31960 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
31970 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
31980 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
31990 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
319a0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
319b0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
319c0 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
319d0 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
319e0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
319f0 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
31a00 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
31a10 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
31a20 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e  ndTerm(&pWInfo->
31a30 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78  sWC, iCur, pOBEx
31a40 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
31a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a60 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45      ~ready, WO_E
31a70 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b  Q|WO_ISNULL, 0);
31a80 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
31a90 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
31aa0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
31ab0 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45  ->eOperator&WO_E
31ac0 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72  Q)!=0 && pOBExpr
31ad0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
31ae0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
31af0 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20  ar *z1, *z2;.   
31b00 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
31b10 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
31b20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
31b30 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
31b40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
31b50 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
31b60 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
31b70 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  l;.        z1 = 
31b80 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
31b90 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
31ba0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
31bb0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
31bc0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
31bd0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
31be0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
31bf0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
31c00 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e      z2 = pColl->
31c10 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
31c20 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
31c30 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63  p(z1, z2)!=0 ) c
31c40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
31c50 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20  .      obSat |= 
31c60 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
31c70 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  }..    if( (pLoo
31c80 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
31c90 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b  RE_ONEROW)==0 ){
31ca0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
31cb0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
31cc0 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20  E_IPK ){.       
31cd0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20   pIndex = 0;.   
31ce0 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30       nKeyCol = 0
31cf0 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  ;.        nColum
31d00 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 1;.      }el
31d10 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d  se if( (pIndex =
31d20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
31d30 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49  pIndex)==0 || pI
31d40 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
31d50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
31d60 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
31d70 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43  e{.        nKeyC
31d80 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  ol = pIndex->nKe
31d90 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43  yCol;.        nC
31da0 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
31db0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  nColumn;.       
31dc0 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
31dd0 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21  ==nKeyCol+1 || !
31de0 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
31df0 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20  >pTable) );.    
31e00 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
31e10 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  ex->aiColumn[nCo
31e20 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c  lumn-1]==(-1) ||
31e30 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65   !HasRowid(pInde
31e40 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20  x->pTable));.   
31e50 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
31e60 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49  inct = IsUniqueI
31e70 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
31e80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
31e90 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
31ea0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
31eb0 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77  index and deal w
31ec0 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20  ith the ones.   
31ed0 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e     ** that are n
31ee0 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  ot constrained b
31ef0 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20  y == or IN..    
31f00 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d    */.      rev =
31f10 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20   revSet = 0;.   
31f20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
31f30 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ns = 0;.      fo
31f40 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e  r(j=0; j<nColumn
31f50 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
31f60 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54  u8 bOnce;   /* T
31f70 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f  rue to run the O
31f80 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c  RDER BY search l
31f90 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  oop */..        
31fa0 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20  /* Skip over == 
31fb0 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d  and IS NULL term
31fc0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
31fd0 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
31fe0 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26  e.nEq.         &
31ff0 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d  & pLoop->nSkip==
32000 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  0.         && ((
32010 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  i = pLoop->aLTer
32020 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29  m[j]->eOperator)
32030 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
32040 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20  ULL))!=0.       
32050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
32060 28 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  ( i & WO_ISNULL 
32070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
32080 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
32090 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
320a0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
320b0 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
320c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
320d0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
320e0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
320f0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c    /* Get the col
32100 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  umn number in th
32110 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e  e table (iColumn
32120 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72  ) and sort order
32130 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76  .        ** (rev
32140 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74  Idx) for the j-t
32150 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
32160 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
32170 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
32180 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
32190 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
321a0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
321b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
321c0 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
321d0 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
321e0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
321f0 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
32200 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
32210 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
32220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32230 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
32240 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
32250 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
32260 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e          /* An un
32270 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75  constrained colu
32280 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  mn that might be
32290 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   NULL means that
322a0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
322b0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f   WhereLoop is no
322c0 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20  t well-ordered. 
322d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
322e0 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
322f0 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26  tinct.         &
32300 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  & iColumn>=0.   
32310 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f        && j>=pLoo
32320 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
32330 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65          && pInde
32340 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
32350 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
32360 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
32370 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
32380 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
32390 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
323a0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44   /* Find the ORD
323b0 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20  ER BY term that 
323c0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
323d0 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20  he j-th column. 
323e0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
323f0 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20   index and mark 
32400 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65  that ORDER BY te
32410 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20  rm off .        
32420 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65  */.        bOnce
32430 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73   = 1;.        is
32440 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
32450 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63     for(i=0; bOnc
32460 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b  e && i<nOrderBy;
32470 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
32480 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
32490 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
324a0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ue;.          pO
324b0 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
324c0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
324d0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
324e0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
324f0 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
32500 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
32510 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  UPBY );.        
32520 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
32530 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
32540 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20  ISTINCTBY );.   
32550 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72         if( (wctr
32560 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  lFlags & (WHERE_
32570 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49  GROUPBY|WHERE_DI
32580 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20  STINCTBY))==0 ) 
32590 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  bOnce = 0;.     
325a0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
325b0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
325c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
325d0 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
325e0 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
325f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
32600 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
32610 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
32620 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
32630 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
32640 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
32650 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
32660 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
32670 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
32680 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
32690 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
326a0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
326b0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
326c0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
326d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
326e0 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
326f0 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61  zName, pIndex->a
32700 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
32710 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
32720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
32730 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  sMatch = 1;.    
32740 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
32760 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 77  f( isMatch && (w
32770 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
32780 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
32790 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
327a0 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74  ke sure the sort
327b0 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74   order is compat
327c0 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52  ible in an ORDER
327d0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
327e0 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
327f0 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
32800 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
32810 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
32820 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
32830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32840 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64  if( (rev ^ revId
32850 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x)!=pOrderBy->a[
32860 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69  i].sortOrder ) i
32870 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
32880 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32890 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
328a0 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
328b0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
328c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
328d0 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
328e0 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
328f0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
32900 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20   revSet = 1;.   
32910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32920 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
32930 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
32940 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
32950 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
32960 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
32970 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
32980 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
32990 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
329a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
329b0 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
329c0 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
329d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
329e0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63        /* No matc
329f0 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  h found */.     
32a00 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c       if( j==0 ||
32a10 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20   j<nKeyCol ){.  
32a20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
32a30 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
32a40 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct!=0 );.      
32a50 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
32a60 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
32a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32a80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
32a90 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64  }.      } /* end
32aa0 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
32ab0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ndex columns */.
32ac0 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e        if( distin
32ad0 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20  ctColumns ){.   
32ae0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
32af0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d  sOrderDistinct==
32b00 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  0 );.        isO
32b10 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
32b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
32b30 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
32b40 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
32b50 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
32b60 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
32b70 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
32b80 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
32b90 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
32ba0 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
32bb0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
32bc0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
32bd0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
32be0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
32bf0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
32c00 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  *p;.        Bitm
32c10 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20  ask mTerm;.     
32c20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
32c30 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
32c40 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
32c50 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
32c60 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
32c70 6d 54 65 72 6d 20 3d 20 65 78 70 72 54 61 62 6c  mTerm = exprTabl
32c80 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e  eUsage(&pWInfo->
32c90 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20  sMaskSet,p);.   
32ca0 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d       if( mTerm==
32cb0 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
32cc0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29  rIsConstant(p) )
32cd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
32ce0 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f     if( (mTerm&~o
32cf0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
32d00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
32d10 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
32d20 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
32d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32d40 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f   } /* End the lo
32d50 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72  op over all Wher
32d60 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65  eLoops from oute
32d70 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69  r-most down to i
32d80 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69  nner-most */.  i
32d90 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65  f( obSat==obDone
32da0 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f   ) return (i8)nO
32db0 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69  rderBy;.  if( !i
32dc0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
32dd0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64  {.    for(i=nOrd
32de0 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  erBy-1; i>0; i--
32df0 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
32e00 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20   m = MASKBIT(i) 
32e10 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28  - 1;.      if( (
32e20 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65  obSat&m)==m ) re
32e30 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
32e40 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
32e50 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
32e60 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  ./*.** If the WH
32e70 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
32e80 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d   is set in the m
32e90 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71  ask passed to sq
32ea0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
32eb0 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65  ),.** the planne
32ec0 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  r assumes that t
32ed0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72  he specified pOr
32ee0 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63  derBy list is ac
32ef0 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a  tually a GROUP.*
32f00 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e  * BY clause - an
32f10 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74  d so any order t
32f20 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20  hat groups rows 
32f30 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69  as required sati
32f40 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71  sfies the.** req
32f50 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  uest..**.** Norm
32f60 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61  ally, in this ca
32f70 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
32f80 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61  sible for the ca
32f90 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e  ller to determin
32fa0 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  e.** whether or 
32fb0 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65  not the rows are
32fc0 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65   really being de
32fd0 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65  livered in sorte
32fe0 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a  d order, or.** j
32ff0 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ust in some othe
33000 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f  r order that pro
33010 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72  vides the requir
33020 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77  ed grouping. How
33030 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  ever,.** if the 
33040 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
33050 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70  P flag is also p
33060 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
33070 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68  WhereBegin(), th
33080 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
33090 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
330a0 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d on the returne
330b0 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65  d WhereInfo obje
330c0 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a  ct. It returns.*
330d0 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f  * true if the ro
330e0 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62  ws really will b
330f0 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20  e sorted in the 
33100 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c  specified order,
33110 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68   or false.** oth
33120 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erwise..**.** Fo
33130 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
33140 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
33150 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
33160 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20  t1(x, Y);.**.** 
33170 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  then.**.**   SEL
33180 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
33190 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52  OUP BY x,y ORDER
331a0 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73   BY x,y;   -- Is
331b0 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20  Sorted()==1.**  
331c0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
331d0 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f  1 GROUP BY y,x O
331e0 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d  RDER BY y,x;   -
331f0 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a  - IsSorted()==0.
33200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
33210 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72  ereIsSorted(Wher
33220 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
33230 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
33240 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
33250 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
33260 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
33270 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
33280 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
33290 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
332a0 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a  nfo->sorted;.}..
332b0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
332c0 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72  E_ENABLED./* For
332d0 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
332e0 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  nly: */.static c
332f0 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65  onst char *where
33300 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61  PathName(WherePa
33310 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e  th *pPath, int n
33320 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  Loop, WhereLoop 
33330 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69  *pLast){.  stati
33340 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d  c char zName[65]
33350 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
33360 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69  (i=0; i<nLoop; i
33370 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  ++){ zName[i] = 
33380 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d  pPath->aLoop[i]-
33390 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c  >cId; }.  if( pL
333a0 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d  ast ) zName[i++]
333b0 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20   = pLast->cId;. 
333c0 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20   zName[i] = 0;. 
333d0 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
333e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
333f0 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f  eturn the cost o
33400 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72  f sorting nRow r
33410 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ows, assuming th
33420 61 74 20 74 68 65 20 6b 65 79 73 20 68 61 76 65  at the keys have
33430 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f   .** nOrderby co
33440 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74  lumns and that t
33450 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64  he first nSorted
33460 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72   columns are alr
33470 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  eady in.** order
33480 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
33490 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43  st whereSortingC
334a0 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  ost(.  WhereInfo
334b0 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45   *pWInfo,.  LogE
334c0 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e  st nRow,.  int n
334d0 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e  OrderBy,.  int n
334e0 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54  Sorted.){.  /* T
334f0 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64  UNING: Estimated
33500 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20   cost of a full 
33510 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77  external sort, w
33520 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20  here N is .  ** 
33530 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
33540 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20  ws to sort is:. 
33550 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
33560 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
33570 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  (N))..  ** .  **
33580 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65   Or, if the orde
33590 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20  r-by clause has 
335a0 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79  X terms but only
335b0 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a   the last Y .  *
335c0 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20  * terms are out 
335d0 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62  of order, then b
335e0 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c  lock-sorting wil
335f0 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20  l reduce the .  
33600 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20  ** sorting cost 
33610 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
33620 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
33630 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58  * log(N)) * (Y/X
33640 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
33650 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d  (Y/X) term is im
33660 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
33670 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72  stack variable r
33680 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77  Scale.  ** below
33690 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  .  */.  LogEst r
336a0 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74  Scale, rSortCost
336b0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64  ;.  assert( nOrd
336c0 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71  erBy>0 && 66==sq
336d0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
336e0 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73   );.  rScale = s
336f0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f  qlite3LogEst((nO
33700 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a  rderBy-nSorted)*
33710 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20  100/nOrderBy) - 
33720 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20  66;.  rSortCost 
33730 3d 20 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67 28  = nRow + estLog(
33740 6e 52 6f 77 29 20 2b 20 72 53 63 61 6c 65 20 2b  nRow) + rScale +
33750 20 31 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e   16;..  /* TUNIN
33760 47 3a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69  G: The cost of i
33770 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54  mplementing DIST
33780 49 4e 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54  INCT using a B-T
33790 52 45 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d 69  REE is.  ** simi
337a0 6c 61 72 20 62 75 74 20 77 69 74 68 20 61 20 6c  lar but with a l
337b0 61 72 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f  arger constant o
337c0 66 20 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74  f proportionalit
337d0 79 2e 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70 6c  y. .  ** Multipl
337e0 79 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  y by an addition
337f0 61 6c 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30  al factor of 3.0
33800 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  .  */.  if( pWIn
33810 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
33820 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
33830 49 4e 43 54 20 29 7b 0a 20 20 20 20 72 53 6f 72  INCT ){.    rSor
33840 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 7d  tCost += 16;.  }
33850 0a 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74  ..  return rSort
33860 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Cost;.}../*.** G
33870 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  iven the list of
33880 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
33890 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c  ts at pWInfo->pL
338a0 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69  oops, this routi
338b0 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ne.** attempts t
338c0 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  o find the lowes
338d0 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74  t cost path that
338e0 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65   visits each Whe
338f0 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20  reLoop.** once. 
33900 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68   This path is th
33910 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74  en loaded into t
33920 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70  he pWInfo->a[].p
33930 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a  WLoop fields..**
33940 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20  .** Assume that 
33950 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
33960 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
33970 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74  that will need t
33980 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77  o be sorted.** w
33990 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28  ill be nRowEst (
339a0 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72  in the 10*log2 r
339b0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20  epresentation). 
339c0 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74   Or, ignore sort
339d0 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20  ing.** costs if 
339e0 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a  nRowEst==0..**.*
339f0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
33a00 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
33a10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66   SQLITE_NOMEM of
33a20 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
33a30 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  tion.** error oc
33a40 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
33a50 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c  int wherePathSol
33a60 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ver(WhereInfo *p
33a70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52  WInfo, LogEst nR
33a80 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78  owEst){.  int mx
33a90 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20  Choice;         
33aa0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
33ab0 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61  umber of simulta
33ac0 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63  neous paths trac
33ad0 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ked */.  int nLo
33ae0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
33af0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33b00 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69  terms in the joi
33b10 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  n */.  Parse *pP
33b20 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
33b30 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
33b40 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
33b50 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
33b60 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
33b70 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
33b80 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
33b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33ba0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65  Loop counter ove
33bb0 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  r the terms of t
33bc0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74  he join */.  int
33bd0 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20   ii, jj;        
33be0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
33bf0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
33c00 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20   mxI = 0;       
33c10 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
33c20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f  of next entry to
33c30 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e   replace */.  in
33c40 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
33c50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
33c60 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c  r of ORDER BY cl
33c70 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20  ause terms */.  
33c80 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20  LogEst mxCost = 
33c90 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  0;        /* Max
33ca0 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73  imum cost of a s
33cb0 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20  et of paths */. 
33cc0 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74   LogEst mxUnsort
33cd0 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  ed = 0;    /* Ma
33ce0 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63  ximum unsorted c
33cf0 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
33d00 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  path */.  int nT
33d10 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20  o, nFrom;       
33d20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33d30 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
33d40 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f  n aTo[] and aFro
33d50 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  m[] */.  WherePa
33d60 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20  th *aFrom;      
33d70 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20     /* All nFrom 
33d80 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65  paths at the pre
33d90 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20  vious level */. 
33da0 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b   WherePath *aTo;
33db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
33dc0 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73  e nTo best paths
33dd0 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
33de0 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
33df0 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20  Path *pFrom;    
33e00 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
33e10 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68  nt of aFrom[] th
33e20 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
33e30 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50  g on */.  WhereP
33e40 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20  ath *pTo;       
33e50 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
33e60 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20  t of aTo[] that 
33e70 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
33e80 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
33e90 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20   *pWLoop;       
33ea0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
33eb0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
33ec0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
33ed0 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  **pX;           
33ee0 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20  /* Used to divy 
33ef0 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65  up the pSpace me
33f00 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  mory */.  LogEst
33f10 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b   *aSortCost = 0;
33f20 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61      /* Sorting a
33f30 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69  nd partial sorti
33f40 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68  ng costs */.  ch
33f50 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20  ar *pSpace;     
33f60 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
33f70 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64  rary memory used
33f80 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
33f90 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65   */.  int nSpace
33fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33fb0 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
33fc0 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70  e allocated at p
33fd0 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72  Space */..  pPar
33fe0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
33ff0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
34000 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
34010 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
34020 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46  ;.  /* TUNING: F
34030 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65  or simple querie
34040 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74  s, only the best
34050 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64   path is tracked
34060 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79  ..  ** For 2-way
34070 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65   joins, the 5 be
34080 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c  st paths are fol
34090 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  lowed..  ** For 
340a0 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f  joins of 3 or mo
340b0 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b  re tables, track
340c0 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74   the 10 best pat
340d0 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65  hs */.  mxChoice
340e0 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20   = (nLoop<=1) ? 
340f0 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20  1 : (nLoop==2 ? 
34100 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72  5 : 10);.  asser
34110 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f  t( nLoop<=pWInfo
34120 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
34130 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45   );.  WHERETRACE
34140 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62  (0x002, ("---- b
34150 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e  egin solver.  (n
34160 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e  RowEst=%d)\n", n
34170 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20  RowEst));..  /* 
34180 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65  If nRowEst is ze
34190 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ro and there is 
341a0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
341b0 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49  se, ignore it. I
341c0 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65  n this.  ** case
341d0 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
341e0 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  this call is to 
341f0 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
34200 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75  ber of rows retu
34210 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  rned.  ** by the
34220 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20   overall query. 
34230 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d 61  Once this estima
34240 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  te has been obta
34250 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72  ined, the caller
34260 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b  .  ** will invok
34270 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
34280 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70  a second time, p
34290 61 73 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d  assing the estim
342a0 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ate as the.  ** 
342b0 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65  nRowEst paramete
342c0 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  r.  */.  if( pWI
342d0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
342e0 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29   || nRowEst==0 )
342f0 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  {.    nOrderBy =
34300 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
34310 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e   nOrderBy = pWIn
34320 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
34330 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  xpr;.  }..  /* A
34340 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
34350 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72  ialize space for
34360 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20   aTo, aFrom and 
34370 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20  aSortCost[] */. 
34380 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f   nSpace = (sizeo
34390 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a  f(WherePath)+siz
343a0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
343b0 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a  nLoop)*mxChoice*
343c0 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73  2;.  nSpace += s
343d0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20  izeof(LogEst) * 
343e0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61  nOrderBy;.  pSpa
343f0 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ce = sqlite3DbMa
34400 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 53 70 61  llocRaw(db, nSpa
34410 63 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63  ce);.  if( pSpac
34420 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
34430 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54  LITE_NOMEM;.  aT
34440 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
34450 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
34460 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
34470 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
34480 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
34490 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
344a0 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
344b0 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
344c0 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
344d0 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
344e0 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
344f0 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
34500 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
34510 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = pX;.  }.  if( 
34520 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
34530 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
34540 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
34550 65 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  e and it is not 
34560 62 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73  being ignored, s
34570 65 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61  et up.    ** spa
34580 63 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74  ce for the aSort
34590 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61  Cost[] array. Ea
345a0 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ch element of th
345b0 65 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61  e aSortCost arra
345c0 79 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  y.    ** is eith
345d0 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e  er zero - meanin
345e0 67 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74  g it has not yet
345f0 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
34600 64 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  d - or the.    *
34610 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  * cost of sortin
34620 67 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f  g nRowEst rows o
34630 66 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65  f data where the
34640 20 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f   first X terms o
34650 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44  f.    ** the ORD
34660 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
34670 20 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65   already in orde
34680 72 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68  r, where X is th
34690 65 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20  e array .    ** 
346a0 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61  index.  */.    a
346b0 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45  SortCost = (LogE
346c0 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73  st*)pX;.    mems
346d0 65 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c  et(aSortCost, 0,
346e0 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20   sizeof(LogEst) 
346f0 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  * nOrderBy);.  }
34700 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74  .  assert( aSort
34710 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61  Cost==0 || &pSpa
34720 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61  ce[nSpace]==(cha
34730 72 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f  r*)&aSortCost[nO
34740 72 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73  rderBy] );.  ass
34750 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d  ert( aSortCost!=
34760 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
34770 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20  ace]==(char*)pX 
34780 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68  );..  /* Seed th
34790 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
347a0 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
347b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
347c0 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a   WhereLoops..  *
347d0 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44  *.  ** TUNING: D
347e0 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75  o not let the nu
347f0 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
34800 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20  ns go above 25. 
34810 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a   If the cost.  *
34820 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  * of computing a
34830 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
34840 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61  x is not paid ba
34850 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ck within the fi
34860 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73  rst 25.  ** rows
34870 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73  , then do not us
34880 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
34890 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f  index. */.  aFro
348a0 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28  m[0].nRow = MIN(
348b0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
348c0 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74  op, 46);  assert
348d0 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 46==sqlite3Log
348e0 45 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72  Est(25) );.  nFr
348f0 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  om = 1;.  assert
34900 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64  ( aFrom[0].isOrd
34910 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ered==0 );.  if(
34920 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   nOrderBy ){.   
34930 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20   /* If nLoop is 
34940 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65  zero, then there
34950 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72   are no FROM ter
34960 6d 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  ms in the query.
34970 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e   Since.    ** in
34980 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71   this case the q
34990 75 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20  uery may return 
349a0 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65  a maximum of one
349b0 20 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74   row, the result
349c0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72  s.    ** are alr
349d0 65 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75  eady in the requ
349e0 65 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74  ested order. Set
349f0 20 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f   isOrdered to nO
34a00 72 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a  rderBy to.    **
34a10 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20   indicate this. 
34a20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20  Or, if nLoop is 
34a30 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
34a40 6f 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64  o, set isOrdered
34a50 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69   to.    ** -1, i
34a60 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
34a70 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61  he result set ma
34a80 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
34a90 6f 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a  ordered, .    **
34aa0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
34ab0 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f  e loops added to
34ac0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61   the current pla
34ad0 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d  n.  */.    aFrom
34ae0 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  [0].isOrdered = 
34af0 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e  nLoop>0 ? -1 : n
34b00 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20  OrderBy;.  }..  
34b10 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65  /* Compute succe
34b20 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57  ssively longer W
34b30 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20  herePaths using 
34b40 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e  the previous gen
34b50 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20  eration.  ** of 
34b60 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68  WherePaths as th
34b70 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  e basis for the 
34b80 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63  next.  Keep trac
34b90 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  k of the mxChoic
34ba0 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68  e.  ** best path
34bb0 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61  s at each genera
34bc0 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  tion */.  for(iL
34bd0 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
34be0 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
34bf0 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66    nTo = 0;.    f
34c00 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
34c10 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  From; ii<nFrom; 
34c20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a  ii++, pFrom++){.
34c30 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70        for(pWLoop
34c40 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
34c50 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d   pWLoop; pWLoop=
34c60 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f  pWLoop->pNextLoo
34c70 70 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45  p){.        LogE
34c80 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  st nOut;        
34c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34ca0 20 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   Rows visited by
34cb0 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
34cc0 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
34cd0 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20  t rCost;        
34ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34cf0 43 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46  Cost of path (pF
34d00 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
34d10 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55         LogEst rU
34d20 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20  nsorted;        
34d30 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f           /* Unso
34d40 72 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46  rted cost of (pF
34d50 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
34d60 20 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65         i8 isOrde
34d70 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
34d80 72 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72  rdered;  /* isOr
34d90 64 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d  dered for (pFrom
34da0 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
34db0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b      Bitmask mask
34dc0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
34dd0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
34de0 20 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20   src visited by 
34df0 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  (..) */.        
34e00 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
34e10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
34e20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76    /* Mask of rev
34e30 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72  -order loops for
34e40 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20   (..) */..      
34e50 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
34e60 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
34e70 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
34e80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
34e90 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
34ea0 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
34eb0 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
34ec0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
34ed0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
34ee0 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63  t, pWLoop is a c
34ef0 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
34f00 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20  he next loop. . 
34f10 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74         ** Comput
34f20 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20  e its cost */.  
34f30 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20        rUnsorted 
34f40 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
34f50 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75  dd(pWLoop->rSetu
34f60 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b  p,pWLoop->rRun +
34f70 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20   pFrom->nRow);. 
34f80 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64         rUnsorted
34f90 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
34fa0 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70  Add(rUnsorted, p
34fb0 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29  From->rUnsorted)
34fc0 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d  ;.        nOut =
34fd0 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70   pFrom->nRow + p
34fe0 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20  WLoop->nOut;.   
34ff0 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70       maskNew = p
35000 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
35010 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
35020 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  f;.        if( i
35030 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20  sOrdered<0 ){.  
35040 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
35050 64 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  d = wherePathSat
35060 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
35070 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
35080 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
35090 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  nfo->pOrderBy, p
350a0 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63  From, pWInfo->wc
350b0 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  trlFlags,.      
350c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350d0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20   iLoop, pWLoop, 
350e0 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20  &revMask);.     
350f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35100 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
35110 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
35120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35130 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30  if( isOrdered>=0
35140 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f   && isOrdered<nO
35150 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
35160 20 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73      if( aSortCos
35170 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20  t[isOrdered]==0 
35180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
35190 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
351a0 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69  ed] = whereSorti
351b0 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20  ngCost(.        
351c0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20          pWInfo, 
351d0 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42  nRowEst, nOrderB
351e0 79 2c 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20  y, isOrdered.   
351f0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
35200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35210 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65    rCost = sqlite
35220 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
35230 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b  rted, aSortCost[
35240 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20  isOrdered]);..  
35250 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
35260 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20  CE(0x002,.      
35270 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73          ("---- s
35280 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25  ort cost=%-3d (%
35290 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73 20  d/%d) increases 
352a0 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64  cost %3d to %-3d
352b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
352c0 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
352d0 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65  Ordered], (nOrde
352e0 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20  rBy-isOrdered), 
352f0 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  nOrderBy, .     
35300 20 20 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72            rUnsor
35310 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20  ted, rCost));.  
35320 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35330 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72         rCost = r
35340 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
35350 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
35360 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
35370 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65  pWLoop should be
35380 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65   added to the se
35390 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  t of.        ** 
353a0 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f  mxChoice best-so
353b0 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20  -far paths..    
353c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
353d0 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72  * First look for
353e0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74   an existing pat
353f0 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d  h among best-so-
35400 66 61 72 20 70 61 74 68 73 0a 20 20 20 20 20 20  far paths.      
35410 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73    ** that covers
35420 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
35430 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74   loops and has t
35440 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65  he same isOrdere
35450 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  d.        ** set
35460 74 69 6e 67 20 61 73 20 74 68 65 20 63 75 72 72  ting as the curr
35470 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69 64 61  ent path candida
35480 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  te..        **. 
35490 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65         ** The te
354a0 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64  rm "((pTo->isOrd
354b0 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26  ered^isOrdered)&
354c0 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75  0x80)==0" is equ
354d0 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20  ivalent.        
354e0 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72  ** to (pTo->isOr
354f0 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69  dered==(-1))==(i
35500 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22  sOrdered==(-1))"
35510 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20   for the range. 
35520 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67         ** of leg
35530 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73  al values for is
35540 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e  Ordered, -1..64.
35550 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
35560 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54      for(jj=0, pT
35570 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a  o=aTo; jj<nTo; j
35580 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
35590 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
355a0 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65  maskLoop==maskNe
355b0 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
355c0 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
355d0 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
355e0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29  )==0.          )
355f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
35600 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d  stcase( jj==nTo-
35610 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
35620 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
35630 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
35640 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54        if( jj>=nT
35650 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  o ){.          /
35660 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78  * None of the ex
35670 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66  isting best-so-f
35680 61 72 20 70 61 74 68 73 20 6d 61 74 63 68 20 74  ar paths match t
35690 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f  he candidate. */
356a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
356b0 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20  To>=mxChoice.   
356c0 20 20 20 20 20 20 20 20 26 26 20 28 72 43 6f 73          && (rCos
356d0 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f  t>mxCost || (rCo
356e0 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55  st==mxCost && rU
356f0 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72  nsorted>=mxUnsor
35700 74 65 64 29 29 0a 20 20 20 20 20 20 20 20 20 20  ted)).          
35710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
35720 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 63 61  * The current ca
35730 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65  ndidate is no be
35740 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66  tter than any of
35750 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20   the mxChoice.  
35760 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74            ** pat
35770 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  hs currently in 
35780 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  the best-so-far 
35790 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63  buffer.  So disc
357a0 61 72 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ard.            
357b0 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64 61 74  ** this candidat
357c0 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e  e as not viable.
357d0 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
357e0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
357f0 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
35800 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
35810 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
35820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
35830 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
35840 66 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73  f("Skip   %s cos
35850 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
35860 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
35870 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
35880 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
35890 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
358a0 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
358b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
358c0 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
358d0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
358e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
358f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
35900 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
35910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35920 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
35930 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69  ch this points i
35940 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
35950 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65 20 70   new candidate p
35960 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ath.          **
35970 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 64   needs to be add
35980 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
35990 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
359a0 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  hs. */.         
359b0 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63   if( nTo<mxChoic
359c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
359d0 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
359e0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f   size of the aTo
359f0 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20   set by one */. 
35a00 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
35a10 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  nTo++;.         
35a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35a30 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20      /* New path 
35a40 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69  replaces the pri
35a50 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70  or worst to keep
35a60 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43   count below mxC
35a70 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  hoice */.       
35a80 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20       jj = mxI;. 
35a90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35aa0 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
35ab0 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
35ac0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
35ad0 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
35ae0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
35af0 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
35b00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
35b10 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
35b20 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25  New    %s cost=%
35b30 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
35b40 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
35b50 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
35b60 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
35b70 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
35b80 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
35b90 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
35ba0 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
35bb0 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
35bc0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
35bd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
35be0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72          /* Contr
35bf0 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20  ol reaches here 
35c00 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  if best-so-far p
35c10 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20  ath pTo=aTo[jj] 
35c20 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20 20 20  covers the.     
35c30 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74       ** same set
35c40 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
35c50 73 20 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65  s the sam isOrde
35c60 72 65 64 20 73 65 74 74 69 6e 67 20 61 73 20 74  red setting as t
35c70 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
35c80 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20  candidate path. 
35c90 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
35ca0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73   the candidate s
35cb0 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20  hould replace.  
35cc0 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f          ** pTo o
35cd0 72 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  r if the candida
35ce0 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69  te should be ski
35cf0 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  pped */.        
35d00 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
35d10 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e  <rCost || (pTo->
35d20 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20  rCost==rCost && 
35d30 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29  pTo->nRow<=nOut)
35d40 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45   ){.#ifdef WHERE
35d50 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
35d60 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
35d70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
35d80 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
35d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
35da0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
35db0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
35dc0 20 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20       "Skip   %s 
35dd0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
35de0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
35df0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
35e00 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
35e10 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
35e20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
35e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
35e40 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
35e50 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
35e60 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
35e70 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
35e80 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63  intf("   vs %s c
35e90 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65  ost=%-3d,%d orde
35ea0 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
35eb0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
35ec0 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
35ed0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
35ee0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
35ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35f00 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
35f10 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
35f20 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
35f30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
35f40 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
35f50 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
35f60 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  he candidate pat
35f70 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63  h from further c
35f80 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
35f90 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
35fa0 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
35fb0 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20  ==rCost );.     
35fc0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
35fd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35fe0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35ff0 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
36000 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  st+1 );.        
36010 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
36020 63 68 65 73 20 68 65 72 65 20 69 66 20 74 68 65  ches here if the
36030 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
36040 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  is better than t
36050 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
36060 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61  pTo path.  Repla
36070 63 65 20 70 54 6f 20 77 69 74 68 20 74 68 65 20  ce pTo with the 
36080 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69  candidate. */.#i
36090 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
360a0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
360b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
360c0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
360d0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
360e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
360f0 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
36100 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65           "Update
36110 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
36120 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
36130 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
36140 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
36150 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
36160 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
36170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
36180 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
36190 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
361a0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
361b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
361c0 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73  tf("  was %s cos
361d0 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
361e0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
361f0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
36200 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
36210 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
36220 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
36230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
36240 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
36250 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
36260 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
36270 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
36280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36290 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20     /* pWLoop is 
362a0 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69  a winner.  Add i
362b0 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  t to the set of 
362c0 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
362d0 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b         pTo->mask
362e0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  Loop = pFrom->ma
362f0 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
36300 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
36310 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20     pTo->revLoop 
36320 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
36330 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e     pTo->nRow = n
36340 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  Out;.        pTo
36350 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
36360 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55  .        pTo->rU
36370 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72  nsorted = rUnsor
36380 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ted;.        pTo
36390 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73  ->isOrdered = is
363a0 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
363b0 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f   memcpy(pTo->aLo
363c0 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  op, pFrom->aLoop
363d0 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
363e0 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20  op*)*iLoop);.   
363f0 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b       pTo->aLoop[
36400 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b  iLoop] = pWLoop;
36410 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f  .        if( nTo
36420 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  >=mxChoice ){.  
36430 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b          mxI = 0;
36440 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73  .          mxCos
36450 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74  t = aTo[0].rCost
36460 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e  ;.          mxUn
36470 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e  sorted = aTo[0].
36480 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
36490 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
364a0 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
364b0 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
364c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
364d0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
364e0 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ost .           
364f0 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74    || (pTo->rCost
36500 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d  ==mxCost && pTo-
36510 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73  >rUnsorted>mxUns
36520 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20 20 20  orted) .        
36530 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
36540 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54       mxCost = pT
36550 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  o->rCost;.      
36560 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
36570 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  ed = pTo->rUnsor
36580 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ted;.           
36590 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20     mxI = jj;.   
365a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
365b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
365c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
365d0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
365e0 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d  E_ENABLED  /* >=
365f0 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  2 */.    if( sql
36600 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
36610 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73   0x02 ){.      s
36620 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
36630 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f  f("---- after ro
36640 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20  und %d ----\n", 
36650 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f  iLoop);.      fo
36660 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(ii=0, pTo=aTo;
36670 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70   ii<nTo; ii++, p
36680 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  To++){.        s
36690 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
366a0 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  f(" %s cost=%-3d
366b0 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72   nrow=%-3d order
366c0 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
366d0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
366e0 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
366f0 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
36700 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
36710 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
36720 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  d>=0 ? (pTo->isO
36730 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f  rdered+'0') : '?
36740 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
36750 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30  pTo->isOrdered>0
36760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
36770 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
36780 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  (" rev=0x%llx\n"
36790 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b  , pTo->revLoop);
367a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
367b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
367c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
367d0 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
367e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
367f0 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20  if..    /* Swap 
36800 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72  the roles of aFr
36810 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74  om and aTo for t
36820 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69  he next generati
36830 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20  on */.    pFrom 
36840 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d  = aTo;.    aTo =
36850 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f   aFrom;.    aFro
36860 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e  m = pFrom;.    n
36870 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a  From = nTo;.  }.
36880 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20  .  if( nFrom==0 
36890 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
368a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
368b0 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f  no query solutio
368c0 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
368d0 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
368e0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
368f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
36900 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  .  .  /* Find th
36910 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
36920 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20  th.  pFrom will 
36930 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  be left pointing
36940 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f   to that path */
36950 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d  .  pFrom = aFrom
36960 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  ;.  for(ii=1; ii
36970 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20  <nFrom; ii++){. 
36980 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43     if( pFrom->rC
36990 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43  ost>aFrom[ii].rC
369a0 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61  ost ) pFrom = &a
369b0 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20  From[ii];.  }.  
369c0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
369d0 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b  nLevel==nLoop );
369e0 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c  .  /* Load the l
369f0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
36a00 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20  into pWInfo */. 
36a10 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
36a20 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
36a30 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65  ++){.    WhereLe
36a40 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57  vel *pLevel = pW
36a50 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b  Info->a + iLoop;
36a60 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  .    pLevel->pWL
36a70 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70  oop = pWLoop = p
36a80 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  From->aLoop[iLoo
36a90 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  p];.    pLevel->
36aa0 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e  iFrom = pWLoop->
36ab0 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iTab;.    pLevel
36ac0 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e  ->iTabCur = pWIn
36ad0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
36ae0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69  pLevel->iFrom].i
36af0 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  Cursor;.  }.  if
36b00 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
36b10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
36b20 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a  NT_DISTINCT)!=0.
36b30 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
36b40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
36b50 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30  E_DISTINCTBY)==0
36b60 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  .   && pWInfo->e
36b70 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
36b80 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20  DISTINCT_NOOP.  
36b90 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b   && nRowEst.  ){
36ba0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  .    Bitmask not
36bb0 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  Used;.    int rc
36bc0 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
36bd0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
36be0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65  nfo, pWInfo->pRe
36bf0 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a  sultSet, pFrom,.
36c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c10 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
36c20 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f  Y, nLoop-1, pFro
36c30 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
36c40 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  ], &notUsed);.  
36c50 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f    if( rc==pWInfo
36c60 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45  ->pResultSet->nE
36c70 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49  xpr ){.      pWI
36c80 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
36c90 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
36ca0 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20  ORDERED;.    }. 
36cb0 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
36cc0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
36cd0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
36ce0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
36cf0 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20  DISTINCTBY ){.  
36d00 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69      if( pFrom->i
36d10 73 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f  sOrdered==pWInfo
36d20 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
36d30 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49  r ){.        pWI
36d40 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
36d50 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
36d60 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d  ORDERED;.      }
36d70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36d80 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
36d90 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
36da0 72 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  red;.      if( p
36db0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20  WInfo->nOBSat<0 
36dc0 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ) pWInfo->nOBSat
36dd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e   = 0;.      pWIn
36de0 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46  fo->revMask = pF
36df0 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
36e00 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49    }.    if( (pWI
36e10 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
36e20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  & WHERE_SORTBYGR
36e30 4f 55 50 29 0a 20 20 20 20 20 20 20 20 26 26 20  OUP).        && 
36e40 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d  pWInfo->nOBSat==
36e50 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
36e60 2d 3e 6e 45 78 70 72 0a 20 20 20 20 29 7b 0a 20  ->nExpr.    ){. 
36e70 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
36e80 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
36e90 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65  int nOrder = whe
36ea0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
36eb0 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
36ec0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
36ed0 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
36ee0 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  m, 0, nLoop-1, p
36ef0 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
36f00 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20  p-1], &revMask. 
36f10 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
36f20 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f  sert( pWInfo->so
36f30 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rted==0 );.     
36f40 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49   if( nOrder==pWI
36f50 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
36f60 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
36f70 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d  pWInfo->sorted =
36f80 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   1;.        pWIn
36f90 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65  fo->revMask = re
36fa0 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  vMask;.      }. 
36fb0 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49     }.  }...  pWI
36fc0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70  nfo->nRowOut = p
36fd0 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f  From->nRow;..  /
36fe0 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79  * Free temporary
36ff0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75   memory and retu
37000 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  rn success */.  
37010 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
37020 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74  , pSpace);.  ret
37030 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
37040 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65  ../*.** Most que
37050 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20  ries use only a 
37060 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68  single table (th
37070 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73  ey are not joins
37080 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69  ) and have.** si
37090 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  mple == constrai
370a0 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65  nts against inde
370b0 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69  xed fields.  Thi
370c0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
370d0 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68  ts.** to plan th
370e0 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73  ose simple cases
370f0 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73   using much less
37100 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74   ceremony than t
37110 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  he.** general-pu
37120 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
37130 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79  ner, and thereby
37140 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71   yield faster sq
37150 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
37160 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  ** times for the
37170 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a   common case..**
37180 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
37190 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
371a0 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61  if this query ca
371b0 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  n be handled by 
371c0 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c  this.** no-frill
371d0 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  s query planner.
371e0 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
371f0 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64   this query need
37200 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61  s the .** genera
37210 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
37220 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74  planner..*/.stat
37230 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72  ic int whereShor
37240 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  tCut(WhereLoopBu
37250 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
37260 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
37270 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  WInfo;.  struct 
37280 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
37290 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  tem;.  WhereClau
372a0 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
372b0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57  Term *pTerm;.  W
372c0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
372d0 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
372e0 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt j;.  Table *p
372f0 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
37300 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20  dx;.  .  pWInfo 
37310 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
37320 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
37330 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
37340 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
37350 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
37360 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
37370 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
37380 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
37390 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
373a0 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
373b0 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
373c0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
373d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
373e0 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29   pItem->zIndex )
373f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75   return 0;.  iCu
37400 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
37410 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  or;.  pWC = &pWI
37420 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f  nfo->sWC;.  pLoo
37430 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
37440 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ew;.  pLoop->wsF
37450 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f  lags = 0;.  pLoo
37460 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  p->nSkip = 0;.  
37470 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
37480 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
37490 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20  0, WO_EQ, 0);.  
374a0 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
374b0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
374c0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
374d0 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52  Q|WHERE_IPK|WHER
374e0 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c  E_ONEROW;.    pL
374f0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  oop->aLTerm[0] =
37500 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f   pTerm;.    pLoo
37510 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  p->nLTerm = 1;. 
37520 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
37530 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f  e.nEq = 1;.    /
37540 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
37550 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70  f a rowid lookup
37560 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c   is 10 */.    pL
37570 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20  oop->rRun = 33; 
37580 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c   /* 33==sqlite3L
37590 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d  ogEst(10) */.  }
375a0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
375b0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
375c0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
375d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
375e0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
375f0 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f  LTermSpace==pLoo
37600 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20  p->aLTerm );.   
37610 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65     if( !IsUnique
37620 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20  Index(pIdx).    
37630 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72     || pIdx->pPar
37640 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20  tIdxWhere!=0 .  
37650 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b       || pIdx->nK
37660 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28  eyCol>ArraySize(
37670 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
37680 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e  ce) .      ) con
37690 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
376a0 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
376b0 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
376c0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
376d0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
376e0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
376f0 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49  j], 0, WO_EQ, pI
37700 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
37710 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
37720 6b 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  k;.        pLoop
37730 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54  ->aLTerm[j] = pT
37740 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
37750 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e     if( j!=pIdx->
37760 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e  nKeyCol ) contin
37770 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ue;.      pLoop-
37780 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
37790 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
377a0 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e  _ONEROW|WHERE_IN
377b0 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28  DEXED;.      if(
377c0 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e   pIdx->isCoverin
377d0 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c  g || (pItem->col
377e0 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
377f0 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30  nIndex(pIdx))==0
37800 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   ){.        pLoo
37810 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
37820 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
37830 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f      }.      pLoo
37840 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20  p->nLTerm = j;. 
37850 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
37860 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20  ree.nEq = j;.   
37870 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
37880 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
37890 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
378a0 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71  : Cost of a uniq
378b0 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ue index lookup 
378c0 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70  is 15 */.      p
378d0 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b  Loop->rRun = 39;
378e0 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33    /* 39==sqlite3
378f0 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20  LogEst(15) */.  
37900 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
37910 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
37920 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20  ->wsFlags ){.   
37930 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
37940 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57  LogEst)1;.    pW
37950 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
37960 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70  p = pLoop;.    p
37970 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  Loop->maskSelf =
37980 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
37990 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
379a0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
379b0 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
379c0 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
379d0 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
379e0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
379f0 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
37a00 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f  nOBSat =  pWInfo
37a10 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
37a20 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
37a30 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
37a40 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
37a50 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
37a60 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
37a70 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
37a80 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69  UNIQUE;.    }.#i
37a90 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
37aa0 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64  G.    pLoop->cId
37ab0 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20   = '0';.#endif. 
37ac0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
37ad0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
37ae0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
37af0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
37b00 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
37b10 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
37b20 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
37b30 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
37b40 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
37b50 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
37b60 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
37b70 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
37b80 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
37b90 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
37ba0 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
37bb0 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
37bc0 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
37bd0 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
37be0 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
37bf0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
37c00 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
37c10 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
37c20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
37c30 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
37c40 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
37c50 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
37c60 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
37c70 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
37c80 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
37c90 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
37ca0 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
37cb0 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
37cc0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
37cd0 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
37ce0 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
37cf0 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
37d00 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
37d10 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
37d20 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
37d30 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
37d40 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
37d50 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
37d60 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
37d70 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
37d80 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
37d90 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
37da0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
37db0 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
37dc0 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
37dd0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
37de0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
37df0 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
37e00 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
37e10 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
37e20 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
37e30 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
37e40 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
37e50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
37e60 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
37e70 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
37e80 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
37e90 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
37ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
37eb0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
37ec0 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
37ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ee0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
37ef0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
37f00 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
37f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
37f30 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
37f40 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
37f50 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
37f60 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
37f70 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
37f80 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
37f90 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
37fa0 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
37fb0 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
37fc0 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
37fd0 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
37fe0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
37ff0 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
38000 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
38010 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
38020 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
38030 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
38040 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
38050 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
38060 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
38070 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
38080 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
38090 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
380a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
380b0 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
380c0 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
380d0 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
380e0 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
380f0 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
38100 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
38110 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
38120 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
38130 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
38140 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
38150 73 65