/ Hex Artifact Content
Login

Artifact a2dba34bd878afd6266f21c72858cede8fd015b3:


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 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
2c90: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
2ca0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
2cb0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
2cc0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
2cd0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
2ce0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
2cf0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2d00: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
2d10: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
2d20: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
2d30: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
2d40: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
2d50: 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65 6e  t/right preceden
2d60: 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e  ce rules come in
2d70: 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74  to play when det
2d80: 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ermining the.** 
2d90: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2da0: 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45  ce, then COLLATE
2db0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 61   operators are a
2dc0: 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72  djusted to ensur
2dd0: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  e.** that the co
2de0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2df0: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
2e00: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2e10: 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "Y collate NO
2e20: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
2e30: 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63 61  es "X op Y" beca
2e40: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
2e50: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
2e60: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
2e70: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
2e80: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
2e90: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2ea0: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
2eb0: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
2ec0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
2ed0: 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  son the EP_Colla
2ee0: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
2ef0: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
2f00: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
2f10: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
2f20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2f30: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
2f40: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
2f50: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2f60: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
2f70: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
2f80: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
2f90: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
2fa0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
2fb0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
2fc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
2fd0: 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67   );.  if( expRig
2fe0: 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20  ht==expLeft ){. 
2ff0: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61     /* Either X a
3000: 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43  nd Y both have C
3010: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3020: 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f  or neither do */
3030: 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68  .    if( expRigh
3040: 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f  t ){.      /* Bo
3050: 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20  th X and Y have 
3060: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
3070: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20  s.  Make sure X 
3080: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  is always.      
3090: 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72  ** used by clear
30a0: 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  ing the EP_Colla
30b0: 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20  te flag from Y. 
30c0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
30d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d  pRight->flags &=
30e0: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
30f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
3100: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
3110: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
3120: 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
3130: 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f   /* Neither X no
3140: 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  r Y have COLLATE
3150: 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20   operators, but 
3160: 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  X has a non-defa
3170: 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ult.      ** col
3180: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
3190: 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f    So add the EP_
31a0: 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f  Collate marker o
31b0: 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20  n X to cause.   
31c0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73     ** it to be s
31d0: 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a  earched first. *
31e0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
31f0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
3200: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3210: 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72  .  }.  SWAP(Expr
3220: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
3230: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3240: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
3250: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
3260: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
3270: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
3280: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
3290: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
32a0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
32b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32c0: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
32d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
32e0: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
32f0: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
3300: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
3310: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
3320: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
3340: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
3350: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
3360: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
3370: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
3380: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
3390: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
33a0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
33b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
33c0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
33d0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
33e0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
33f0: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
3400: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3410: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
3420: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
3430: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
3440: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
3450: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
3460: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
3470: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
3480: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
3490: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
34a0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
34b0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
34c0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
34d0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34e0: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
34f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3500: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
3510: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
3520: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
3530: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
3540: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
3550: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
3560: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
3570: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
3580: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
3590: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
35a0: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
35b0: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
35c0: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
35d0: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
35e0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
35f0: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
3600: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3610: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3620: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
3630: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Terms..*/.static
3640: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
3650: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
3660: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
3670: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
3680: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
3690: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
36a0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
36b0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
36c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
36d0: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
36e0: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
36f0: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
3700: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
3710: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
3720: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
3730: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3740: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
3750: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
3760: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
3770: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
3780: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
3790: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b  ested */.  int k
37a0: 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20   = pScan->k;    
37b0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72  /* Where to star
37c0: 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20  t scanning */.. 
37d0: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
37e0: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
37f0: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
3800: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3810: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
3820: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
3830: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3840: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
3850: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
3860: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
3870: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
3880: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b  Term=pWC->a+k; k
3890: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b  <pWC->nTerm; k++
38a0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
38b0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
38c0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
38d0: 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65 72           && pTer
38e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
38f0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3900: 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71    && (pScan->iEq
3910: 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48  uiv<=2 || !ExprH
3920: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
3930: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
3940: 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29  Join)).        )
3950: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3960: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
3970: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
3990: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
39a0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
39b0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
39c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
39d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
39e0: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
39f0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
3a00: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3a10: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3a20: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
3a30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
3a40: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3a50: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
3a60: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
3a70: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3a80: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
3a90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
3aa0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3ab0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
3ac0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
3b20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
3b30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
3b40: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
3b50: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
3b60: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3b70: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
3b80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
3b90: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
3ba0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
3bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3bd0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3be0: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
3bf0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
3c00: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
3c10: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
3c20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3c30: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
3c40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3c50: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
3c60: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c70: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
3c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3c90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3ca0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3cb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3cc0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
3cd0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
3ce0: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
3cf0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3d00: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3d10: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3d20: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
3d30: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
3d40: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3d70: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
3d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3d90: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3da0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
3db0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(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 20 20 20 20 20 70                 p
3df0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
3e00: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3e10: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
3e20: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
3e30: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
3e40: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
3e50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3e60: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
3e70: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
3e80: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
3e90: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
3ed0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3ee0: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
3ef0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f10: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3f20: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3f30: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3f40: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3f50: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3f60: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3f70: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
3f80: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
3f90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3fc0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
3fd0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
3fe0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
3ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4000: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4010: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
4020: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
4030: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
4040: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4050: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
4060: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
4070: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
4080: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
4090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
40a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
40b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
40c0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
40d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
40e0: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
40f0: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
4100: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
4110: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
4120: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
4130: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
4140: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4150: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
4160: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
4170: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4180: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
4190: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
41a0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
41b0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
41c0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
41d0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
41e0: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
41f0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
4200: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
4210: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
4220: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4230: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
4240: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
4250: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
4260: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
4270: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
4280: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
4290: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
42a0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
42b0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
42c0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
42d0: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
42e0: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
42f0: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
4300: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
4310: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
4320: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4330: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
4340: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4350: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
4360: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4370: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
4380: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
4390: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
43a0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
43b0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
43c0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
43d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
43e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
43f0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4400: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
4410: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
4430: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
4440: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4460: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
4470: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
4490: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
44a0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
44b0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
44c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
44d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
44e0: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
44f0: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d  int j;..  /* mem
4500: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
4510: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a  zeof(*pScan)); *
4520: 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  /.  pScan->pOrig
4530: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61  WC = pWC;.  pSca
4540: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
4550: 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c  if( pIdx && iCol
4560: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53  umn>=0 ){.    pS
4570: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49  can->idxaff = pI
4580: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
4590: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
45a0: 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ty;.    for(j=0;
45b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45c0: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
45d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56  ){.      if( NEV
45e0: 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  ER(j>=pIdx->nKey
45f0: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Col) ) return 0;
4600: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e  .    }.    pScan
4610: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
4620: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
4630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61   }else{.    pSca
4640: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
4650: 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e     pScan->zCollN
4660: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ame = 0;.  }.  p
4670: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f  Scan->opMask = o
4680: 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e  pMask;.  pScan->
4690: 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  k = 0;.  pScan->
46a0: 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72  aEquiv[0] = iCur
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  ;.  pScan->aEqui
46c0: 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  v[1] = iColumn;.
46d0: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20    pScan->nEquiv 
46e0: 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45  = 2;.  pScan->iE
46f0: 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75  quiv = 2;.  retu
4700: 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74  rn whereScanNext
4710: 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pScan);.}../*.*
4720: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
4730: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
4740: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
4750: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
4760: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
4770: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
4780: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
4790: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
47a0: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
47b0: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
47c0: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
47d0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
47e0: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
47f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
4800: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
4810: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
4820: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
4830: 54 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65  The term returne
4840: 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78  d might by Y=<ex
4850: 70 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20  pr> if there is 
4860: 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69  another constrai
4870: 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  nt in.** the WHE
4880: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73  RE clause that s
4890: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d  pecifies that X=
48a0: 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e  Y.  Any such con
48b0: 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65  straints will be
48c0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62  .** identified b
48d0: 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62  y the WO_EQUIV b
48e0: 69 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d  it in the pTerm-
48f0: 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64  >eOperator field
4900: 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76  .  The.** aEquiv
4910: 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58  [] array holds X
4920: 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75   and all its equ
4930: 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65  ivalents, with e
4940: 61 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ach SQL variable
4950: 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77  .** taking up tw
4960: 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  o slots in aEqui
4970: 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20  v[].  The first 
4980: 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20  slot is for the 
4990: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a  cursor number.**
49a0: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
49b0: 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  is for the colum
49c0: 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65  n number.  There
49d0: 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e   are 22 slots in
49e0: 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20   aEquiv[].** so 
49f0: 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61  that means we ca
4a00: 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75  n look for X plu
4a10: 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72  s up to 10 other
4a20: 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75   equivalent valu
4a30: 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73  es..** Hence a s
4a40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
4a50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
4a60: 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32  f X=A1 and A1=A2
4a70: 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e   and A2=A3.** an
4a80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
4a90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
4aa0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
4ab0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
4ac0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
4ad0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
4ae0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
4af0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
4b00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
4b10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
4b20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
4b30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
4b40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
4b50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
4b60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
4b70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
4b80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
4b90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
4ba0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
4bb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
4bc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
4bd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
4be0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
4bf0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
4c00: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
4c10: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
4c20: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
4c30: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
4c40: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
4c50: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74   WO_EQUIV..*/.st
4c60: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
4c70: 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  findTerm(.  Wher
4c80: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4c90: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
4ca0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
4cb0: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
4cc0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
4cd0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
4ce0: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
4cf0: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
4d00: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
4d10: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
4d20: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
4d30: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
4d40: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
4d50: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
4d60: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
4d70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
4d80: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
4d90: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
4da0: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
4db0: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
4dc0: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
4dd0: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
4de0: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
4df0: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
4e00: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
4e10: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
4e20: 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  ;.  WhereScan sc
4e30: 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65  an;..  p = where
4e40: 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
4e50: 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75  pWC, iCur, iColu
4e60: 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20  mn, op, pIdx);. 
4e70: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
4e80: 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52   if( (p->prereqR
4e90: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
4ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
4eb0: 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d   p->prereqRight=
4ec0: 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61  =0 && (p->eOpera
4ed0: 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b  tor&WO_EQ)!=0 ){
4ee0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4ef0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
4f00: 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20   if( pResult==0 
4f10: 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20  ) pResult = p;. 
4f20: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65     }.    p = whe
4f30: 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
4f40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4f50: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46  pResult;.}../* F
4f60: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
4f70: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
4f80: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
4f90: 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73  ist*, WhereClaus
4fa0: 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  e*, int);../*.**
4fb0: 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a   Call exprAnalyz
4fc0: 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69  e on all terms i
4fd0: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
4fe0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .  .*/.static vo
4ff0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
5000: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
5010: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
5020: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
5030: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
5040: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
5050: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
5060: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
5070: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
5080: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
5090: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
50a0: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
50b0: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
50c0: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
50d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
50e0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
50f0: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
5100: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
5110: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
5120: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
5130: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
5140: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
5150: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
5160: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
5170: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5180: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
5190: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
51a0: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
51b0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
51c0: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
51d0: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
51e0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
51f0: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
5200: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
5210: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
5220: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
5230: 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20  OrGlob(.  Parse 
5240: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
5250: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5260: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5270: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
5280: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
5290: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
52a0: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
52b0: 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e  Prefix,  /* Poin
52c0: 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47  ter to TK_STRING
52d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
52e0: 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20   pattern prefix 
52f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d  */.  int *pisCom
5300: 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69  plete, /* True i
5310: 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63  f the only wildc
5320: 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20  ard is % in the 
5330: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a  last character *
5340: 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65  /.  int *pnoCase
5350: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5360: 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71   uppercase is eq
5370: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65  uivalent to lowe
5380: 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  rcase */.){.  co
5390: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
53a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
53b0: 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b  ng on RHS of LIK
53c0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
53d0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
53e0: 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69  Left;      /* Ri
53f0: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a  ght and left siz
5400: 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  e of LIKE operat
5410: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  or */.  ExprList
5420: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
5430: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70     /* List of op
5440: 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49  erands to the LI
5450: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
5460: 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20   int c;         
5470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5480: 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ne character in 
5490: 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  z[] */.  int cnt
54a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
54b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
54c0: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72   non-wildcard pr
54d0: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20  efix characters 
54e0: 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b  */.  char wc[3];
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72  /* Wildcard char
5510: 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  acters */.  sqli
5520: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5530: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
5540: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
5550: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5560: 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pVal = 0;.  in
5570: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
5580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
5590: 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a  de of pRight */.
55a0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
55b0: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
55c0: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65  , pExpr, pnoCase
55d0: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
55e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  urn 0;.  }.#ifde
55f0: 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a  f SQLITE_EBCDIC.
5600: 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29    if( *pnoCase )
5610: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
5620: 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  f.  pList = pExp
5630: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c  r->x.pList;.  pL
5640: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
5650: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
5660: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
5670: 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  UMN .   || sqlit
5680: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
5690: 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46  Left)!=SQLITE_AF
56a0: 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73  F_TEXT .   || Is
56b0: 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70  Virtual(pLeft->p
56c0: 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  Tab).  ){.    /*
56d0: 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39   IMP: R-02065-49
56e0: 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  465 The left-han
56f0: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49  d side of the LI
5700: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
5710: 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  tor must.    ** 
5720: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
5730: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
5740: 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e   with TEXT affin
5750: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ity. */.    retu
5760: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
5770: 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  rt( pLeft->iColu
5780: 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42  mn!=(-1) ); /* B
5790: 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72  ecause IPK never
57a0: 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f   has AFF_TEXT */
57b0: 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c  ..  pRight = sql
57c0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
57d0: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ate(pList->a[0].
57e0: 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70  pExpr);.  op = p
57f0: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
5800: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
5810: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52   ){.    Vdbe *pR
5820: 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73  eprepare = pPars
5830: 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20  e->pReprepare;. 
5840: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52     int iCol = pR
5850: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  ight->iColumn;. 
5860: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
5870: 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
5880: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
5890: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
58a0: 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70  NONE);.    if( p
58b0: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
58c0: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
58d0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
58e0: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20        z = (char 
58f0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5900: 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  text(pVal);.    
5910: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
5920: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
5930: 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29  se->pVdbe, iCol)
5940: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
5950: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
5960: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
5970: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
5980: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5990: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
59a0: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
59b0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
59c0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
59d0: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
59e0: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
59f0: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
5a00: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
5a10: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
5a20: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
5a30: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
5a40: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
5a50: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
5a60: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
5a70: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
5a80: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
5a90: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
5aa0: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
5ab0: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
5ac0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
5ad0: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
5ae0: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
5af0: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
5b00: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
5b10: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
5b20: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
5b30: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
5b40: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
5b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5b60: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
5b70: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ght->iColumn);. 
5b80: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
5b90: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
5ba0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
5bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
5bc0: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
5bd0: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
5be0: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
5bf0: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
5c00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
5c10: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
5c20: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
5c30: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
5c40: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
5c50: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
5c60: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
5c70: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
5c80: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
5c90: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
5ca0: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
5cb0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
5cc0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
5cd0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
5ce0: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
5cf0: 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68  To workaround th
5d00: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
5d10: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
5d20: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
5d30: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
5d40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5d50: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5d60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5d70: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
5d80: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
5d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
5da0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
5db0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
5dc0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
5dd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
5de0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5df0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5e00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5e10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5e20: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
5e30: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
5e40: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
5e50: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
5e60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5e70: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5e80: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
5e90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5ea0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5eb0: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
5ec0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5ed0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5ee0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
5ef0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
5f00: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
5f10: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
5f20: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
5f30: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
5f40: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
5f50: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
5f60: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
5f70: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
5f80: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
5f90: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
5fa0: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
5fb0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
5fc0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
5fd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
5fe0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5ff0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
6000: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
6010: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6020: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
6030: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
6040: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
6050: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6060: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
6070: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
6080: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
60a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
60b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
60c0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
60d0: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
60e0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
60f0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
6100: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
6110: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
6120: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
6130: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
6140: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
6150: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
6160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6170: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
6180: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
6190: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
61a0: 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76 65  ){.  if( pDerive
61b0: 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65  d ){.    pDerive
61c0: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
61d0: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
61e0: 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72  omJoin;.    pDer
61f0: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6200: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6210: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6220: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
6230: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6240: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
6250: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6260: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6270: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
6280: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
6290: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
62a0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
62b0: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
62c0: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
62d0: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
62e0: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
62f0: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
6300: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
6330: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
6340: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
6350: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
6360: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
6370: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
6380: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
6390: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
63a0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
63b0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
63c0: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
63d0: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
63e0: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
63f0: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
6400: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
6410: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
6420: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
6430: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
6440: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6450: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
6460: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
6470: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
6480: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
6490: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
64a0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
64b0: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
64c0: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
64d0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
64e0: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
64f0: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
6500: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
6510: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
6520: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
6530: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
6540: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
6550: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
6560: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
6570: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
6580: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
6590: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
65a0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
65b0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
65c0: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
65d0: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
65e0: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
65f0: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
6600: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
6610: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
6620: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
6630: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
6640: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
6650: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
6660: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
6670: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6680: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
6690: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
66a0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
66b0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
66c0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
66d0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
66e0: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
66f0: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
6700: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
6710: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
6720: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
6730: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
6740: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
6750: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
6760: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
6770: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
6780: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
6790: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
67a0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
67b0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
67c0: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
67d0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
67e0: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
67f0: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
6800: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6810: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
6820: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
6830: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
6840: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
6850: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
6860: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
6870: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
6880: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6890: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
68a0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
68b0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
68c0: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
68d0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
68e0: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
68f0: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
6900: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
6910: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
6920: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
6930: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
6940: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
6950: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
6960: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
6970: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
6980: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
6990: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
69a0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
69b0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
69c0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
69d0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
69e0: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
69f0: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
6a00: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
6a10: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
6a20: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
6a30: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
6a40: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
6a50: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6a60: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
6a70: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
6a80: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
6a90: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
6aa0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
6ab0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
6ac0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
6ad0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
6ae0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
6af0: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
6b00: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
6b10: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
6b20: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
6b30: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
6b40: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
6b50: 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72  decided elsewher
6b60: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
6b70: 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20  s only looks at 
6b80: 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73  whether subterms
6b90: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
6ba0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
6bb0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
6bc0: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
6bd0: 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79   E above satisfy
6be0: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
6bf0: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
6c00: 73 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20  statisfies case 
6c10: 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65  1 (such as B) we
6c20: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
6c30: 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a  ptimizer will.**
6c40: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63   always prefer c
6c50: 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61  ase 1, so in tha
6c60: 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e  t case we preten
6c70: 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73  d that case 2 is
6c80: 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65   not.** satisfie
6c90: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68  d..**.** It migh
6ca0: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
6cb0: 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  at multiple tabl
6cc0: 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  es are indexable
6cd0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  .  For example,.
6ce0: 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20  ** (E) above is 
6cf0: 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62  indexable on tab
6d00: 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e  les P, Q, and R.
6d10: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61  .**.** Terms tha
6d20: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
6d30: 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
6d40: 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73  for lookup by us
6d50: 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ing.** separate 
6d60: 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20  indices to find 
6d70: 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20  rowids for each 
6d80: 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70  subterm and comp
6d90: 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69  osing.** the uni
6da0: 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73  on of all rowids
6db0: 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20   using a RowSet 
6dc0: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73  object.  This is
6dd0: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22   similar.** to "
6de0: 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20  bitmap indices" 
6df0: 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  in other databas
6e00: 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a  e engines..**.**
6e10: 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a   OTHERWISE:.**.*
6e20: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73  * If neither cas
6e30: 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61  e 1 nor case 2 a
6e40: 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65  pply, then leave
6e50: 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73   the eOperator s
6e60: 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20  et to.** zero.  
6e70: 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  This term is not
6e80: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72   useful for sear
6e90: 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ch..*/.static vo
6ea0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  id exprAnalyzeOr
6eb0: 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20  Term(.  SrcList 
6ec0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
6ed0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
6ee0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
6ef0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
6f00: 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c      /* the compl
6f10: 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ete WHERE clause
6f20: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
6f30: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
6f40: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
6f50: 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  OR-term to be an
6f60: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
6f70: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
6f80: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
6f90: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
6fa0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
6fb0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  g context */.  P
6fc0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
6fd0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
6fe0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
6ff0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
7000: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7010: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
7020: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7030: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
7040: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
7050: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7060: 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65  Term];    /* The
7070: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
7080: 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  yzed */.  Expr *
7090: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
70a0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
70b0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
70c0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ion of the term 
70d0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7100: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
7110: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7120: 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20  pOrWc;       /* 
7130: 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d  Breakup of pTerm
7140: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
7150: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
7160: 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a  OrTerm;       /*
7170: 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68   A Sub-term with
7180: 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a  in the pOrWc */.
7190: 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70    WhereOrInfo *p
71a0: 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41  OrInfo;     /* A
71b0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
71c0: 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ation associated
71d0: 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20   with pTerm */. 
71e0: 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49   Bitmask chngToI
71f0: 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  N;         /* Ta
7200: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
7210: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a  satisfy case 1 *
7220: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
7230: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  xable;        /*
7240: 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   Tables that are
7250: 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69   indexable, sati
7260: 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f  sfying case 2 */
7270: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61  ..  /*.  ** Brea
7280: 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  k the OR clause 
7290: 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74  into its separat
72a0: 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65  e subterms.  The
72b0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20   subterms are.  
72c0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57  ** stored in a W
72d0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
72e0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
72f0: 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65  within the Where
7300: 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65  OrInfo.  ** obje
7310: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
7320: 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69  hed to the origi
7330: 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65  nal OR clause te
7340: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rm..  */.  asser
7350: 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
7360: 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d  gs & (TERM_DYNAM
7370: 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54  IC|TERM_ORINFO|T
7380: 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30  ERM_ANDINFO))==0
7390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
73a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
73b0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  ;.  pTerm->u.pOr
73c0: 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d  Info = pOrInfo =
73d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
73e0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
73f0: 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66  *pOrInfo));.  if
7400: 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72  ( pOrInfo==0 ) r
7410: 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e  eturn;.  pTerm->
7420: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7430: 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20  ORINFO;.  pOrWc 
7440: 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  = &pOrInfo->wc;.
7450: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
7460: 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29  t(pOrWc, pWInfo)
7470: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
7480: 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f  OrWc, pExpr, TK_
7490: 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79  OR);.  exprAnaly
74a0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57  zeAll(pSrc, pOrW
74b0: 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
74c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
74d0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
74e0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29  OrWc->nTerm>=2 )
74f0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d  ;..  /*.  ** Com
7500: 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20  pute the set of 
7510: 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  tables that migh
7520: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20  t satisfy cases 
7530: 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69  1 or 2..  */.  i
7540: 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74  ndexable = ~(Bit
7550: 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f  mask)0;.  chngTo
7560: 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  IN = ~(Bitmask)0
7570: 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d  ;.  for(i=pOrWc-
7580: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
7590: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
75a0: 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69   && indexable; i
75b0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
75c0: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
75d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
75e0: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20  _SINGLE)==0 ){. 
75f0: 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66       WhereAndInf
7600: 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20  o *pAndInfo;.   
7610: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54     assert( (pOrT
7620: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
7630: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52  TERM_ANDINFO|TER
7640: 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  M_ORINFO))==0 );
7650: 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20  .      chngToIN 
7660: 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49  = 0;.      pAndI
7670: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
7680: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
7690: 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b  eof(*pAndInfo));
76a0: 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49  .      if( pAndI
76b0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57  nfo ){.        W
76c0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
76d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  WC;.        Wher
76e0: 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b  eTerm *pAndTerm;
76f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7700: 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
7710: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
7720: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
7730: 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20  fo = pAndInfo;. 
7740: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
7750: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7760: 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20  ANDINFO;.       
7770: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
7780: 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20  tor = WO_AND;.  
7790: 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26        pAndWC = &
77a0: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
77b0: 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73        whereClaus
77c0: 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57  eInit(pAndWC, pW
77d0: 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  C->pWInfo);.    
77e0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
77f0: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
7800: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
7810: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
7820: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
7830: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
7840: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
7850: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
7860: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
7870: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
7880: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
7890: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
78a0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
78b0: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
78c0: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
78d0: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
78e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
78f0: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
7900: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
7910: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
7920: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
7930: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
7940: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
7950: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7960: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  ->sMaskSet, pAnd
7970: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
7990: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
79a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
79b0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
79c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
79d0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
79e0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
79f0: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
7a00: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
7a10: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
7a20: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
7a30: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
7a40: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
7a50: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
7a60: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
7a70: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
7a80: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
7a90: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
7aa0: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
7ab0: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
7ac0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
7ad0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
7ae0: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
7af0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
7b00: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
7b10: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
7b20: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
7b30: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7b40: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68  ->sMaskSet, pOth
7b50: 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  er->leftCursor);
7b60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7b70: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
7b80: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
7b90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7ba0: 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_EQ)==0 ){.    
7bb0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
7bc0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7bd0: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
7be0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
7bf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
7c00: 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65  ** Record the se
7c10: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7c20: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
7c30: 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20    The set might 
7c40: 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20  be.  ** empty.. 
7c50: 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69   */.  pOrInfo->i
7c60: 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78  ndexable = index
7c70: 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  able;.  pTerm->e
7c80: 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78  Operator = index
7c90: 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f  able==0 ? 0 : WO
7ca0: 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _OR;..  /*.  ** 
7cb0: 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61  chngToIN holds a
7cc0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
7cd0: 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69  hat *might* sati
7ce0: 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74  sfy case 1.  But
7cf0: 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
7d00: 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f   do some additio
7d10: 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  nal checking to 
7d20: 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65  see if case 1 re
7d30: 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74  ally.  ** is sat
7d40: 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  isfied..  **.  *
7d50: 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20  * chngToIN will 
7d60: 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31  hold either 0, 1
7d70: 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68  , or 2 bits.  Th
7d80: 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61  e 0-bit case mea
7d90: 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ns.  ** that the
7da0: 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69  re is no possibi
7db0: 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72  lity of transfor
7dc0: 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75  ming the OR clau
7dd0: 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20  se into an.  ** 
7de0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61  IN operator beca
7df0: 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  use one or more 
7e00: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20  terms in the OR 
7e10: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20  clause contain. 
7e20: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   ** something ot
7e30: 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61  her than == on a
7e40: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73   column in the s
7e50: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
7e60: 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73  e 1-bit.  ** cas
7e70: 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65  e means that eve
7e80: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
7e90: 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  R clause is of t
7ea0: 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61  he form.  ** "ta
7eb0: 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22  ble.column=expr"
7ec0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
7ed0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65   table.  The one
7ee0: 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74   bit that is set
7ef0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65  .  ** will corre
7f00: 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d  spond to the com
7f10: 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73  mon table.  We s
7f20: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65  till need to che
7f30: 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ck to make.  ** 
7f40: 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f  sure the same co
7f50: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20  lumn is used on 
7f60: 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20  all terms.  The 
7f70: 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68  2-bit case is wh
7f80: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20  en.  ** the all 
7f90: 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65  terms are of the
7fa0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f   form "table1.co
7fb0: 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75  lumn=table2.colu
7fc0: 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69  mn".  It.  ** mi
7fd0: 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  ght be possible 
7fe0: 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70  to form an IN op
7ff0: 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68  erator with eith
8000: 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  er table1.column
8010: 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e  .  ** or table2.
8020: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48  column as the LH
8030: 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63  S if either is c
8040: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
8050: 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  erm of.  ** the 
8060: 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OR clause..  **.
8070: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
8080: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
8090: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d   "table.column1=
80a0: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28  table.column2" (
80b0: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61  the.  ** same ta
80c0: 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65  ble on both size
80d0: 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e  s of the ==) can
80e0: 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
80f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e  ..  */.  if( chn
8100: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74  gToIN ){.    int
8110: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8120: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
8130: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
8140: 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20   to IN is valid 
8150: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
8160: 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  mn = -1;        
8170: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78   /* Column index
8180: 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70   on lhs of IN op
8190: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e  erator */.    in
81a0: 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20  t iCursor = -1; 
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
81c0: 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74   cursor common t
81d0: 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20  o all terms */. 
81e0: 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20     int j = 0;   
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8200: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8210: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
8220: 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63  or a table and c
8230: 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61  olumn that appea
8240: 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f  rs on one side o
8250: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  r the.    ** oth
8260: 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65  er of the == ope
8270: 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73  rator in every s
8280: 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61  ubterm.  That ta
8290: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20  ble and column. 
82a0: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
82b0: 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f  corded in iCurso
82c0: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20  r and iColumn.  
82d0: 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20  There might not 
82e0: 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  be any.    ** su
82f0: 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ch table and col
8300: 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68  umn.  Set okToCh
8310: 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70  ngToIN if an app
8320: 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20  ropriate table. 
8330: 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e     ** and column
8340: 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65   is found but le
8350: 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  ave okToChngToIN
8360: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f   false if not fo
8370: 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  und..    */.    
8380: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20  for(j=0; j<2 && 
8390: 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a  !okToChngToIN; j
83a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65  ++){.      pOrTe
83b0: 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20  rm = pOrWc->a;. 
83c0: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
83d0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
83e0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
83f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8400: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8410: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
8420: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8430: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
8440: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
8450: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8460: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
8470: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
8480: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
8490: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
84a0: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
84b0: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
84c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
84d0: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
84e0: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
84f0: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
8500: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
8510: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8520: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
8530: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8540: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8550: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
8560: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
8570: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
8580: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d  ->leftCursor))==
8590: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
85a0: 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74  * This term must
85b0: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
85c0: 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65  t1.a==t2.b where
85d0: 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20   t2 is in the.  
85e0: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54          ** chngT
85f0: 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69  oIN set but t1 i
8600: 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72  s not.  This ter
8610: 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  m will be either
8620: 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20   preceeded.     
8630: 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77       ** or follw
8640: 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65  ed by an inverte
8650: 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31  d copy (t2.b==t1
8660: 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20  .a).  Skip this 
8670: 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20  term .          
8680: 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69  ** and use its i
8690: 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  nversion. */.   
86a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
86b0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
86c0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
86d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
86e0: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
86f0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
8700: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
8710: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
8720: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
8730: 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d  TERM_COPIED|TERM
8740: 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20  _VIRTUAL) );.   
8750: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8760: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8770: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72     iColumn = pOr
8780: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
8790: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72  mn;.        iCur
87a0: 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c  sor = pOrTerm->l
87b0: 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  eftCursor;.     
87c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
87d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20  }.      if( i<0 
87e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
87f0: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
8800: 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e  +column was foun
8810: 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  d.  This can onl
8820: 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20  y occur.        
8830: 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** on the second
8840: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
8850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
8860: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
8870: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
8880: 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a  wo(chngToIN) );.
8890: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
88a0: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
88b0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
88c0: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
88d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
88e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
88f0: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
8900: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
8910: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
8920: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
8930: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
8940: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
8950: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
8960: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
8970: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
8980: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
8990: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
89a0: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
89b0: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
89c0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
89d0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
89e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
89f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8a00: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
8a10: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
8a20: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
8a30: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
8a40: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8a50: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
8a60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
8a70: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  if( pOrTerm->u.l
8a80: 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  eftColumn!=iColu
8a90: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
8aa0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8ab0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
8ad0: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
8ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;.          /* I
8af0: 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  f the right-hand
8b00: 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20   side is also a 
8b10: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
8b20: 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20   affinities.    
8b30: 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68        ** of both
8b40: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
8b50: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
8b60: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
8b70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
8b80: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
8b90: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
8ba0: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
8bb0: 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  49).          */
8bc0: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69  .          affRi
8bd0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
8be0: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
8bf0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
8c00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  );.          aff
8c10: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
8c20: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
8c30: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
8c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8c50: 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20   affRight!=0 && 
8c60: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
8c70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
8c80: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8c90: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
8ca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8cb0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8cc0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
8cd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8cf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
8d00: 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43  his point, okToC
8d10: 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20  hngToIN is true 
8d20: 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72  if original pTer
8d30: 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20  m satisfies.    
8d40: 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74  ** case 1.  In t
8d50: 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72  hat case, constr
8d60: 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61  uct a new virtua
8d70: 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a  l term that is .
8d80: 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e      ** pTerm con
8d90: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49  verted into an I
8da0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
8db0: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43  */.    if( okToC
8dc0: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20  hngToIN ){.     
8dd0: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
8de0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61          /* A tra
8df0: 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65  nsient duplicate
8e00: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
8e10: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8e20: 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54  List = 0;   /* T
8e30: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
8e40: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8e50: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
8e60: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
8e70: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
8e80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
8e90: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
8ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8eb0: 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61  omplete IN opera
8ec0: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  tor */..      fo
8ed0: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
8ee0: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
8ef0: 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  c->a; i>=0; i--,
8f00: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
8f10: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
8f20: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8f30: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
8f40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8f50: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8f60: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8f70: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
8f80: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
8f90: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
8fa0: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
8fb0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
8fc0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
8fd0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
8fe0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
8ff0: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
9000: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9010: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
9020: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9030: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e  rListAppend(pWIn
9040: 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  fo->pParse, pLis
9050: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
9060: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
9070: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
9080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
9090: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
90a0: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
90b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
90c0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
90d0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
90e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
90f0: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
9100: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
9110: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
9120: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
9130: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
9140: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
9150: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
9160: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9170: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
9180: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
9190: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
91a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
91b0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
91c0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
91d0: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
91e0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
91f0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
9200: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
9210: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
9220: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
9230: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
9240: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
9250: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9260: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
9270: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
9280: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
9290: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
92a0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
92b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
92c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
92d0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
92e0: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
92f0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
9300: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
9310: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
9320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
9330: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
9340: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
9350: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
9360: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
9370: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
9380: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
9390: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
93a0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
93b0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
93c0: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
93d0: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
93e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
93f0: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
9400: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
9410: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
9420: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
9430: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
9440: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
9450: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9460: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
9470: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
9480: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
9490: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
94a0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
94b0: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
94c0: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
94d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
94e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
94f0: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
9500: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
9510: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
9520: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
9530: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
9540: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
9550: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
9560: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
9570: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
9580: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
9590: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
95a0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
95b0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
95c0: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
95d0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
95e0: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
95f0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
9600: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
9610: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
9620: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
9630: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
9640: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
9650: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
9660: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
9670: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
9680: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
9690: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
96a0: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
96b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
96c0: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
96d0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
96e0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
96f0: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
9700: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
9710: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
9720: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
9730: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9740: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
9750: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
9760: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
9770: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
9780: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
9790: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
97a0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
97b0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
97c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
97d0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
97e0: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
97f0: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
9800: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
9810: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
9820: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9830: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
9840: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
9850: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
9860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
9870: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
9880: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
9890: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
98b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
98c0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
98d0: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
98e0: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
98f0: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
9900: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
9910: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
9920: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9940: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
9950: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
9960: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
9970: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
9980: 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63   Extra dependenc
9990: 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e  ies on LEFT JOIN
99a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72   */.  Expr *pStr
99b0: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
99c0: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
99d0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
99e0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  tor */.  int isC
99f0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  omplete = 0;    
9a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
9a10: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e   of LIKE/GLOB en
9a20: 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64  ds with wildcard
9a30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65   */.  int noCase
9a40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9a50: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47         /* LIKE/G
9a60: 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65  LOB distinguishe
9a70: 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  s case */.  int 
9a80: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9aa0: 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74  Top-level operat
9ab0: 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a  or.  pExpr->op *
9ac0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
9ad0: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
9ae0: 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  se;  /* Parsing 
9af0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
9b00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9b10: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a  e->db;        /*
9b20: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9b30: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64  tion */..  if( d
9b40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9b50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9b60: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
9b70: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9b80: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
9b90: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
9ba0: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
9bb0: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
9bc0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
9bd0: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
9be0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
9bf0: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
9c00: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
9c10: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
9c20: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
9c30: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
9c40: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
9c50: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
9c60: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
9c70: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9c80: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
9c90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
9ca0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9cb0: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
9cc0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9cd0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
9ce0: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
9cf0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9d00: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9d10: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
9d20: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9d30: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
9d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
9d50: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
9d60: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9d70: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
9d80: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
9d90: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
9da0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9db0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
9dc0: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
9dd0: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
9de0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9df0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
9e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
9e10: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
9e20: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
9e30: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
9e40: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
9e50: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
9e60: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
9e70: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
9e80: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
9e90: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
9ea0: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
9eb0: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
9ee0: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
9ef0: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
9f00: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
9f10: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
9f20: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
9f30: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
9f40: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
9f50: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
9f60: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
9f70: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
9f80: 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70  p(op) ){.    Exp
9f90: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
9fa0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
9fb0: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
9fc0: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
9fd0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
9fe0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
9ff0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75  ->pRight);.    u
a000: 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65  16 opMask = (pTe
a010: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
a020: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
a030: 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45   ? WO_ALL : WO_E
a040: 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c  QUIV;.    if( pL
a050: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
a060: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
a070: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
a080: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
a090: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
a0a0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a0b0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a0c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
a0d0: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
a0e0: 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  (op) & opMask;. 
a0f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
a100: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
a110: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
a120: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
a130: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
a140: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75  r *pDup;.      u
a150: 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b  16 eExtraOp = 0;
a160: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
a170: 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e   bits for pNew->
a180: 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
a190: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
a1a0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
a1b0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
a1c0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
a1d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a1e0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
a1f0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
a200: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a210: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a220: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a230: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
a240: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a250: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
a260: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
a270: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
a280: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
a290: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
a2a0: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
a2b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a2c0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
a2d0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
a2e0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
a2f0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
a300: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
a310: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
a320: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
a330: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
a340: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
a350: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
a360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
a370: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20  xpr->op==TK_EQ. 
a380: 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
a390: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
a3a0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
a3b0: 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
a3c0: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
a3d0: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  db, SQLITE_Trans
a3e0: 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29  itive).        )
a3f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  {.          pTer
a400: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20  m->eOperator |= 
a410: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
a420: 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57      eExtraOp = W
a430: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
a440: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
a450: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
a460: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
a470: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
a480: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
a490: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
a4a0: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
a4b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
a4c0: 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e  ipCollate(pDup->
a4d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
a4e0: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
a4f0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
a500: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
a510: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a520: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a530: 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72   testcase( (prer
a540: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
a550: 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65  ght) != prereqLe
a560: 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ft );.      pNew
a570: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
a580: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
a590: 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70  raRight;.      p
a5a0: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
a5b0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
a5c0: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
a5d0: 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73  r = (operatorMas
a5e0: 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45  k(pDup->op) + eE
a5f0: 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b  xtraOp) & opMask
a600: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
a610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a620: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
a630: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
a640: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
a650: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
a660: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
a670: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
a680: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
a690: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
a6a0: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
a6b0: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
a6c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
a6d0: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
a6e0: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
a6f0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
a700: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
a710: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
a720: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
a730: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
a740: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
a750: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
a760: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
a770: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
a780: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
a790: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
a7a0: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
a7b0: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
a7c0: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
a7d0: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
a7e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
a7f0: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
a800: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
a810: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
a820: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
a830: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
a840: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
a850: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
a860: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
a870: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
a880: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
a890: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
a8a0: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
a8b0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
a8c0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
a8d0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
a8e0: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
a8f0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
a900: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
a910: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
a920: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
a930: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a940: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
a950: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
a960: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
a970: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
a980: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
a990: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
a9a0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
a9b0: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
a9c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a9f0: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
aa00: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
aa30: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
aa40: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
aa50: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
aa60: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
aa70: 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  xpr, pExpr);.   
aa80: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
aa90: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
aaa0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
aab0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
aac0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
aad0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
aae0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
aaf0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
ab00: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
ab10: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
ab20: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
ab30: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
ab40: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
ab50: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
ab60: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
ab70: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
ab80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
ab90: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
aba0: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
abb0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
abc0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
abd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
abe0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
abf0: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
ac00: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
ac10: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
ac20: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
ac30: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
ac40: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
ac50: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
ac60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
ac70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ac80: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
ac90: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
aca0: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
acb0: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
acc0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
acd0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
ace0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
acf0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
ad00: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
ad10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
ad20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
ad30: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
ad40: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
ad50: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
ad60: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
ad70: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
ad80: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
ad90: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
ada0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
adb0: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
adc0: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
add0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
ade0: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
adf0: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
ae00: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
ae10: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
ae20: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
ae30: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
ae40: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
ae50: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
ae60: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
ae70: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
ae80: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
ae90: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
aea0: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
aeb0: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
aec0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
aed0: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
aee0: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
aef0: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
af00: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
af10: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
af20: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
af30: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
af40: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
af50: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
af60: 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
af70: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
af80: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
af90: 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
afa0: 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43  w2;.    Token sC
afb0: 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20  ollSeqName;  /* 
afc0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
afd0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
afe0: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
aff0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b000: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
b010: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b020: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
b030: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
b040: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b050: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
b060: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
b070: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b080: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
b090: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
b0a0: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
b0b0: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
b0c0: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
b0d0: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
b0e0: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
b0f0: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
b100: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
b110: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
b120: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
b130: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
b140: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
b150: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
b160: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
b170: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
b180: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
b190: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
b1a0: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
b1b0: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
b1c0: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
b1d0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
b1e0: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
b1f0: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
b200: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
b210: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
b220: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
b230: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
b240: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
b250: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
b260: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
b270: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
b280: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
b290: 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  lete = 0;.      
b2a0: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70    c = sqlite3Upp
b2b0: 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20  erToLower[c];.  
b2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20      }.      *pC 
b2d0: 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  = c + 1;.    }. 
b2e0: 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
b2f0: 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  z = noCase ? "NO
b300: 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
b310: 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  ;.    sCollSeqNa
b320: 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e  me.n = 6;.    pN
b330: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b340: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
b350: 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
b360: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
b370: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b380: 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  GE, .           
b390: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b3a0: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b3b0: 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f  e,pNewExpr1,&sCo
b3c0: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b3d0: 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
b3e0: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b3f0: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b400: 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr1, pExpr);.  
b410: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
b420: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b430: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45  C, pNewExpr1, TE
b440: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b450: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b460: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d  stcase( idxNew1=
b470: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b480: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b490: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
b4a0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
b4b0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b4c0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
b4d0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
b4e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b4f0: 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _LT,.           
b500: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b510: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b520: 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f  e,pNewExpr2,&sCo
b530: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b540: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
b550: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b560: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b570: 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr2, pExpr);.  
b580: 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72    idxNew2 = wher
b590: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b5a0: 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45  C, pNewExpr2, TE
b5b0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b5c0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b5d0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d  stcase( idxNew2=
b5e0: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b5f0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b600: 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70   idxNew2);.    p
b610: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b620: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28  dxTerm];.    if(
b630: 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20   isComplete ){. 
b640: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
b650: 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew1].iParent = i
b660: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57  dxTerm;.      pW
b670: 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50  C->a[idxNew2].iP
b680: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
b690: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
b6a0: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  hild = 2;.    }.
b6b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
b6c0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
b6d0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
b6e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b6f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
b700: 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d  .  /* Add a WO_M
b710: 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74  ATCH auxiliary t
b720: 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74  erm to the const
b730: 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65  raint set if the
b740: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78  .  ** current ex
b750: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
b760: 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e  he form:  column
b770: 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a   MATCH expr..  *
b780: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
b790: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
b7a0: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
b7b0: 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72  hods of.  ** vir
b7c0: 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68  tual tables.  Th
b7d0: 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f  e native query o
b7e0: 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f  ptimizer does no
b7f0: 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74  t attempt.  ** t
b800: 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69  o do anything wi
b810: 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f  th MATCH functio
b820: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ns..  */.  if( i
b830: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70  sMatchOfColumn(p
b840: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
b850: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70   idxNew;.    Exp
b860: 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
b870: 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  t;.    WhereTerm
b880: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20   *pNewTerm;.    
b890: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f  Bitmask prereqCo
b8a0: 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72  lumn, prereqExpr
b8b0: 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ;..    pRight = 
b8c0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b8d0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
b8e0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
b8f0: 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
b900: 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78  pr;.    prereqEx
b910: 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  pr = exprTableUs
b920: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
b930: 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65  ight);.    prere
b940: 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61  qColumn = exprTa
b950: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
b960: 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  t, pLeft);.    i
b970: 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26  f( (prereqExpr &
b980: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d   prereqColumn)==
b990: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
b9a0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
b9b0: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
b9c0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b9d0: 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20   TK_MATCH, .    
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c            0, sql
ba00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ba10: 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a  pRight, 0), 0);.
ba20: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
ba30: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
ba40: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
ba50: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
ba60: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
ba70: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
ba80: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew==0 );.      p
ba90: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
baa0: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
bab0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
bac0: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45  qRight = prereqE
bad0: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  xpr;.      pNewT
bae0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
baf0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
bb00: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
bb10: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
bb20: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
bb30: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bb40: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d  eOperator = WO_M
bb50: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77  ATCH;.      pNew
bb60: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
bb70: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
bb80: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
bb90: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
bba0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
bbb0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
bbc0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
bbd0: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
bbe0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
bbf0: 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
bc00: 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
bc10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
bc20: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
bc30: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
bc40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
bc50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57  _OR_STAT4.  /* W
bc60: 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33  hen sqlite_stat3
bc70: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
bc80: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20  is available an 
bc90: 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a  operator of the.
bca0: 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20    ** form "x IS 
bcb0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f  NOT NULL" can so
bcc0: 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75  metimes be evalu
bcd0: 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69  ated more effici
bce0: 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78  ently.  ** as "x
bcf0: 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e  >NULL" if x is n
bd00: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
bd10: 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63  IMARY KEY.  So c
bd20: 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20  onstruct a.  ** 
bd30: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20  virtual term of 
bd40: 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a  that form..  **.
bd50: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
bd60: 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  he virtual term 
bd70: 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77  must be tagged w
bd80: 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20  ith TERM_VNULL. 
bd90: 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f   This.  ** TERM_
bda0: 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73  VNULL tag will s
bdb0: 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d  uppress the not-
bdc0: 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68  null check at th
bdd0: 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
bde0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57   of the loop.  W
bdf0: 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f  ithout the TERM_
be00: 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20  VNULL flag, the 
be10: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
be20: 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  t.  ** the start
be30: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
be40: 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65  l prevent any re
be50: 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  sults from being
be60: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
be70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
be80: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
be90: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
bea0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
beb0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
bec0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  ->iColumn>=0.   
bed0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
bee0: 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
bef0: 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20  E_Stat3).  ){.  
bf00: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
bf10: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  ;.    Expr *pLef
bf20: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
bf30: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
bf40: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
bf50: 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20  *pNewTerm;..    
bf60: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
bf70: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bf80: 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_GT,.         
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
bfb0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c  p(db, pLeft, 0),
bfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
bfe0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bff0: 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
c000: 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64   0), 0);..    id
c010: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
c020: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
c030: 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  ewExpr,.        
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55        TERM_VIRTU
c060: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  AL|TERM_DYNAMIC|
c070: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20  TERM_VNULL);.   
c080: 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20   if( idxNew ){. 
c090: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20       pNewTerm = 
c0a0: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
c0b0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c0c0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
c0d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c0e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
c0f0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
c100: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
c110: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
c120: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
c130: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
c140: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a  erator = WO_GT;.
c150: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c160: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
c170: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
c180: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
c190: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
c1a0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
c1b0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
c1c0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
c1d0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c1e0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
c1f0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
c200: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
c210: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
c220: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
c230: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
c240: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
c250: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
c260: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
c270: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
c280: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
c290: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
c2a0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
c2b0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
c2c0: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
c2d0: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ht;.}../*.** Thi
c2e0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
c2f0: 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 20  hes pList for a 
c300: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
c310: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
c320: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
c330: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
c340: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
c350: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
c360: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
c370: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
c380: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
c390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
c3a0: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
c3b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c3c0: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
c3d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3f0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
c400: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c410: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
c420: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
c430: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
c440: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
c450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c460: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
c470: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
c480: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
c490: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
c4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c4b0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
c4c0: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
c4d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
c500: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
c510: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
c520: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c530: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
c540: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
c550: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
c560: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c570: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
c580: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
c590: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
c5a0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
c5b0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
c5c0: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
c5d0: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
c5e0: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
c5f0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
c600: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
c610: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
c620: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
c630: 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
c640: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
c650: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
c660: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
c670: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
c680: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
c690: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c6a0: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
c6b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c6c0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
c6d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
c6e0: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
c6f0: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
c700: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
c710: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
c720: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
c730: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
c740: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68   redundant if th
c750: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
c760: 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20  ins some subset 
c770: 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  of.** columns th
c780: 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e  at are unique an
c790: 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73  d non-null..*/.s
c7a0: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
c7b0: 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
c7c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
c7e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c7f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
c800: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
c810: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
c820: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
c830: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
c840: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
c850: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
c860: 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20   *pDistinct     
c870: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
c880: 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  set that needs t
c890: 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  o be DISTINCT */
c8a0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
c8b0: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
c8c0: 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
c8f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
c900: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
c910: 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
c920: 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
c930: 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
c940: 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
c950: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
c960: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
c970: 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
c980: 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
c990: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
c9a0: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
c9b0: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
c9c0: 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
c9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
c9e0: 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
c9f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
ca00: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
ca10: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
ca20: 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
ca30: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
ca40: 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
ca50: 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
ca60: 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
ca70: 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
ca80: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
ca90: 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
caa0: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
cab0: 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
cac0: 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
cad0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
cae0: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
caf0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
cb00: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
cb10: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
cb20: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
cb30: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
cb40: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
cb50: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
cb60: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
cb70: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
cb80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
cb90: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
cba0: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
cbb0: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
cbc0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
cbd0: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
cbe0: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
cbf0: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
cc00: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
cc10: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
cc20: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
cc30: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
cc40: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
cc50: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
cc60: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
cc70: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
cc80: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
cc90: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
cca0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
ccb0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
ccc0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
ccd0: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
cce0: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
ccf0: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
cd00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
cd10: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
cd20: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
cd30: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
cd40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
cd50: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
cd60: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
cd70: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
cd80: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
cd90: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
cda0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
cdb0: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
cdc0: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
cdd0: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
cde0: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
cdf0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
ce00: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
ce10: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ce20: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ce30: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
ce40: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
ce50: 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
ce60: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
ce70: 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  i<pIdx->nKeyCol;
ce80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36   i++){.      i16
ce90: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
cea0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
ceb0: 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d   if( 0==findTerm
cec0: 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f  (pWC, iBase, iCo
ced0: 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  l, ~(Bitmask)0, 
cee0: 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a  WO_EQ, pIdx) ){.
cef0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
cf00: 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43  Col = findIndexC
cf10: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
cf20: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
cf30: 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  x, i);.        i
cf40: 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20  f( iIdxCol<0 || 
cf50: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cf60: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
cf70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
cf80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cf90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
cfa0: 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  i==pIdx->nKeyCol
cfb0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
cfc0: 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20  s index implies 
cfd0: 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
cfe0: 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72  T qualifier is r
cff0: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20  edundant. */.   
d000: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d010: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d020: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73   0;.}.../*.** Es
d030: 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
d040: 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
d050: 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
d060: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  2..*/.static Log
d070: 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73  Est estLog(LogEs
d080: 74 20 4e 29 7b 0a 20 20 4c 6f 67 45 73 74 20 78  t N){.  LogEst x
d090: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
d0a0: 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e  (N);.  return x>
d0b0: 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b  33 ? x - 33 : 0;
d0c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
d0d0: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
d0e0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
d0f0: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
d100: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
d110: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
d120: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
d130: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
d140: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
d150: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
d160: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
d170: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
d180: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
d190: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
d1a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d1b0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d1c0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45  ) && defined(WHE
d1d0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
d1e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
d1f0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
d200: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d210: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d220: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
d230: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
d240: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d250: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
d260: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
d270: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
d280: 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
d290: 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
d2a0: 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
d2b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
d2c0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d2d0: 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
d2e0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d2f0: 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
d300: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
d310: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d320: 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
d330: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
d340: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
d350: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
d360: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
d370: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d380: 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
d390: 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
d3a0: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
d3b0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
d3c0: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
d3d0: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
d3e0: 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
d3f0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
d400: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
d410: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d420: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d430: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
d440: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
d450: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d460: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
d470: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
d480: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
d490: 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
d4a0: 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
d4b0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
d4c0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
d4d0: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
d4e0: 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
d4f0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
d500: 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
d510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d520: 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
d530: 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
d540: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d550: 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
d560: 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
d570: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
d580: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
d590: 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
d5a0: 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
d5b0: 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
d5c0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
d5d0: 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
d5e0: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
d5f0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
d600: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
d610: 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c  imatedRows=%lld\
d620: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
d630: 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Rows);.}.#else.#
d640: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
d650: 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
d660: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
d670: 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
d680: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d690: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
d6a0: 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
d6b0: 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
d6c0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
d6d0: 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
d6e0: 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
d6f0: 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
d700: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
d710: 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
d720: 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
d730: 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
d740: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d750: 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
d760: 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
d770: 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
d780: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
d790: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
d7a0: 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
d7b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
d7c0: 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
d7d0: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
d7e0: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
d7f0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d810: 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
d820: 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
d830: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
d840: 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
d850: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
d860: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
d870: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
d880: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
d890: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74   WO_EQ)==0 ) ret
d8a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
d8b0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
d8c0: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
d8d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d8e0: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
d8f0: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
d900: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
d910: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
d920: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
d930: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
d940: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
d950: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
d960: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
d970: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
d980: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 1;.}.#endif...
d990: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d9a0: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
d9b0: 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  DEX./*.** Genera
d9c0: 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74  te code to const
d9d0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
d9e0: 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74  bject for an aut
d9f0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20  omatic index.** 
da00: 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68  and to set up th
da10: 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a  e WhereLevel obj
da20: 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68  ect pLevel so th
da30: 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  at the code gene
da40: 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75  rator.** makes u
da50: 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61  se of the automa
da60: 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  tic index..*/.st
da70: 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72  atic void constr
da80: 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
da90: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
daa0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
dab0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
dac0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
dad0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
dae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
daf0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
db00: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
db10: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
db20: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
db30: 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65   term to get the
db40: 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20   next index */. 
db50: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
db60: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
db70: 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
db80: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
db90: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72  ilable */.  Wher
dba0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
dbb0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
dbc0: 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20   new index here 
dbd0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79  */.){.  int nKey
dbe0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
dbf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
dc00: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
dc10: 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65  constructed inde
dc20: 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
dc30: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
dc40: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
dc50: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
dc60: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
dc70: 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20  reTerm *pWCEnd; 
dc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
dc90: 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
dca0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcc0: 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e  Object describin
dcd0: 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  g the transient 
dce0: 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
dcf0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
dd00: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72         /* Prepar
dd10: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
dd20: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
dd30: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69  */.  int addrIni
dd40: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
dd50: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
dd60: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
dd70: 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f  n bypass jump */
dd80: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
dd90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
dda0: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
ddb0: 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  g indexed */.  i
ddc0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
ddd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
dde0: 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66  p of the index f
ddf0: 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ill loop */.  in
de00: 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
de10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
de20: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e  ister holding an
de30: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
de40: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de60: 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72  * Column counter
de70: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
dea0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74  r */.  int mxBit
deb0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
dec0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
ded0: 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f  lumn in pSrc->co
dee0: 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lUsed */.  CollS
def0: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
df00: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
df10: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
df20: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  on a column */. 
df30: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
df40: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
df50: 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  The Loop object 
df60: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55  */.  char *zNotU
df70: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  sed;            
df80: 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
df90: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49  on the end of pI
dfa0: 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  dx */.  Bitmask 
dfb0: 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
dfc0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
dfd0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
dfe0: 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
dff0: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
e000: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
e010: 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
e020: 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nal columns */. 
e030: 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20   u8 sentWarning 
e040: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
e050: 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69  True if a warnni
e060: 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75  ng has been issu
e070: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
e080: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
e090: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
e0a0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
e0b0: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
e0c0: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
e0d0: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
e0e0: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
e0f0: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
e100: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
e110: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
e120: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
e130: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
e140: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
e150: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
e160: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e170: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
e180: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
e190: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
e1a0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
e1b0: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
e1c0: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
e1d0: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
e1e0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
e1f0: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
e200: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
e210: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
e220: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
e230: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
e240: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
e250: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
e260: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
e270: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
e280: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
e290: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
e2a0: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
e2b0: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
e2c0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
e2d0: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
e2e0: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
e2f0: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
e300: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
e310: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
e320: 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
e330: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
e340: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
e350: 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67  if( !sentWarning
e360: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e370: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
e380: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
e390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ,.            "a
e3a0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f  utomatic index o
e3b0: 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c  n %s(%s)", pTabl
e3c0: 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  e->zName,.      
e3d0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
e3e0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b  ol[iCol].zName);
e3f0: 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72  .        sentWar
e400: 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  ning = 1;.      
e410: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  }.      if( (idx
e420: 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
e430: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e440: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
e450: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f  pParse->db, pLoo
e460: 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 20  p, nKeyCol+1) ) 
e470: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
e480: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b  pLoop->aLTerm[nK
e490: 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d  eyCol++] = pTerm
e4a0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
e4b0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
e4c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e4d0: 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e  assert( nKeyCol>
e4e0: 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0 );.  pLoop->u.
e4f0: 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f  btree.nEq = pLoo
e500: 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79  p->nLTerm = nKey
e510: 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  Col;.  pLoop->ws
e520: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
e530: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
e540: 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
e550: 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20  _INDEXED.       
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
e570: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
e580: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e590: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69  e number of addi
e5a0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
e5b0: 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20  eeded to create 
e5c0: 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20  a.  ** covering 
e5d0: 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72  index.  A "cover
e5e0: 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e  ing index" is an
e5f0: 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
e600: 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f  ains all.  ** co
e610: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
e620: 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65  eeded by the que
e630: 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65  ry.  With a cove
e640: 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a  ring index, the.
e650: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
e660: 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ble never needs 
e670: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20  to be accessed. 
e680: 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   Automatic indic
e690: 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
e6a0: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
e6b0: 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64   because the ind
e6c0: 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  ex will not be u
e6d0: 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20  pdated if the.  
e6e0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
e6f0: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68  e changes and th
e700: 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
e710: 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  e cannot both be
e720: 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68   used.  ** if th
e730: 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e  ey go out of syn
e740: 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43  c..  */.  extraC
e750: 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  ols = pSrc->colU
e760: 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20  sed & (~idxCols 
e770: 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  | MASKBIT(BMS-1)
e780: 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
e790: 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d  (pTable->nCol >=
e7a0: 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20   BMS-1) ? BMS-1 
e7b0: 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a  : pTable->nCol;.
e7c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
e7d0: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
e7e0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
e7f0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
e800: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
e810: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
e820: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
e830: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
e840: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
e850: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
e860: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
e870: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
e880: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
e890: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
e8a0: 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77  ;.  }.  pLoop->w
e8b0: 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
e8c0: 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
e8d0: 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f  E_IDX_ONLY;..  /
e8e0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
e8f0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
e900: 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e  describe this in
e910: 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20  dex */.  pIdx = 
e920: 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
e930: 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73  ndexObject(pPars
e940: 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31  e->db, nKeyCol+1
e950: 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b  , 0, &zNotUsed);
e960: 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
e970: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70   return;.  pLoop
e980: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
e990: 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d   = pIdx;.  pIdx-
e9a0: 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69  >zName = "auto-i
e9b0: 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70  ndex";.  pIdx->p
e9c0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
e9d0: 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f    n = 0;.  idxCo
e9e0: 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
e9f0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
ea00: 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
ea10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
ea20: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
ea30: 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
ea40: 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
ea50: 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
ea60: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
ea70: 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
ea80: 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
ea90: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a  MASKBIT(BMS-1) :
eaa0: 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a   MASKBIT(iCol);.
eab0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
eac0: 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
ead0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
eae0: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
eaf0: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
eb00: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
eb10: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
eb20: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
eb30: 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c         idxCols |
eb40: 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = cMask;.       
eb50: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
eb60: 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  n] = pTerm->u.le
eb70: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
eb80: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
eb90: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
eba0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
ebb0: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
ebc0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49  ght);.        pI
ebd0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
ebe0: 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20  ALWAYS(pColl) ? 
ebf0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22  pColl->zName : "
ec00: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
ec10: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
ec20: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
ec30: 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d  ( (u32)n==pLoop-
ec40: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a  >u.btree.nEq );.
ec50: 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
ec60: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
ec70: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
ec80: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
ec90: 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
eca0: 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
ecb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
ecc0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
ecd0: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
ece0: 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20  ASKBIT(i) ){.   
ecf0: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
ed00: 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
ed10: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
ed20: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
ed30: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
ed40: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
ed50: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
ed60: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
ed70: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
ed80: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
ed90: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
eda0: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
edb0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
edc0: 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
edd0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
ede0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
edf0: 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49  =nKeyCol );.  pI
ee00: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
ee10: 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  = -1;.  pIdx->az
ee20: 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
ee30: 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  Y";..  /* Create
ee40: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
ee50: 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
ee60: 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
ee70: 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c  r>=0 );.  pLevel
ee80: 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
ee90: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
eea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
eeb0: 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e  v, OP_OpenAutoin
eec0: 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  dex, pLevel->iId
eed0: 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  xCur, nKeyCol+1)
eee0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
eef0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
ef00: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62  se, pIdx);.  Vdb
ef10: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
ef20: 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
ef30: 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
ef40: 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
ef50: 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
ef60: 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
ef70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ef80: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
ef90: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
efa0: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
efb0: 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  e(v);.  regRecor
efc0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
efd0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
efe0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
eff0: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
f000: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
f010: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
f020: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, 0, 0, 0, 0);.
f030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f040: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
f050: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
f060: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
f070: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
f080: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
f090: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
f0a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f0b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
f0c0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
f0d0: 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56  r, addrTop+1); V
f0e0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f100: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
f110: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
f120: 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
f130: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f140: 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
f150: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f160: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
f170: 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
f180: 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
f190: 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
f1a0: 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
f1b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f1c0: 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
f1d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
f1e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
f1f0: 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
f200: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f210: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
f220: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
f230: 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
f240: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
f250: 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
f260: 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
f270: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
f280: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
f290: 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
f2a0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
f2b0: 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
f2c0: 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
f2d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
f2e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
f2f0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
f300: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
f310: 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
f320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f330: 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
f340: 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
f350: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
f360: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
f370: 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
f380: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
f390: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
f3a0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
f3b0: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
f3c0: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
f3d0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
f3e0: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
f3f0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f400: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
f410: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
f420: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
f430: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
f440: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
f450: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
f460: 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
f470: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
f480: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
f490: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
f4a0: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
f4b0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
f4c0: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
f4d0: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
f4e0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
f4f0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
f500: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
f510: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
f520: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
f530: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
f540: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
f550: 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
f560: 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
f570: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
f580: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
f590: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
f5a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
f5b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f5c0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
f5d0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f5e0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f5f0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
f600: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f610: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
f620: 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63  O_EQUIV))==0 ) c
f630: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
f640: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
f650: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
f660: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65  ontinue;.    nTe
f670: 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
f680: 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
f690: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
f6a0: 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
f6b0: 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a  the current .  *
f6c0: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
f6d0: 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70  then allocate sp
f6e0: 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64  ace for the aOrd
f6f0: 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a  erBy part of.  *
f700: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
f710: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
f720: 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65  re..  */.  nOrde
f730: 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rBy = 0;.  if( p
f740: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
f750: 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d  nt n = pOrderBy-
f760: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
f770: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
f780: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
f790: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
f7a0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
f7b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
f7c0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
f7d0: 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
f7e0: 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
f7f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f800: 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72  i==n){.      nOr
f810: 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d  derBy = n;.    }
f820: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
f830: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
f840: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f850: 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ture.  */.  pIdx
f860: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
f870: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
f880: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
f890: 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
f8c0: 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
f8d0: 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
f8e0: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
f900: 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72  izeof(*pIdxOrder
f910: 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a  By)*nOrderBy );.
f920: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
f930: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
f940: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f950: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
f960: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
f970: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
f980: 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74  alize the struct
f990: 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ure.  The sqlite
f9a0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
f9b0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
f9c0: 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73    ** many fields
f9d0: 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72   that are declar
f9e0: 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72  ed "const" to pr
f9f0: 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78  event xBestIndex
fa00: 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67   from.  ** chang
fa10: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
fa20: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
fa30: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
fa40: 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69  rder to.  ** ini
fa50: 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
fa60: 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  elds..  */.  pId
fa70: 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20  xCons = (struct 
fa80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fa90: 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49  nstraint*)&pIdxI
faa0: 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  nfo[1];.  pIdxOr
fab0: 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
fac0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
fad0: 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
fae0: 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
faf0: 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
fb00: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
fb10: 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
fb20: 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
fb30: 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
fb40: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
fb50: 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
fb60: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
fb70: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
fb80: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
fb90: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fba0: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
fbb0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
fbc0: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
fbd0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
fbe0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
fbf0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
fc00: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
fc10: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
fc20: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fc30: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
fc40: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
fc50: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72    pUsage;..  for
fcb0: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
fcc0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
fcd0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
fce0: 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20  ){.    u8 op;.  
fcf0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
fd00: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
fd10: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
fd20: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
fd30: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
fd40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fd50: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
fd60: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
fd70: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fd80: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
fd90: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
fda0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
fdb0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
fdc0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
fdd0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29  rator & WO_ALL )
fde0: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
fdf0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28  ->eOperator & ~(
fe00: 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55  WO_ISNULL|WO_EQU
fe10: 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IV))==0 ) contin
fe20: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
fe30: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
fe40: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
fe50: 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ue;.    pIdxCons
fe60: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
fe70: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
fe80: 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
fe90: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
fea0: 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38   i;.    op = (u8
feb0: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
fec0: 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20  r & WO_ALL;.    
fed0: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20  if( op==WO_IN ) 
fee0: 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20  op = WO_EQ;.    
fef0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
ff00: 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20   op;.    /* The 
ff10: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
ff20: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
ff30: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
ff40: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
ff50: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
ff60: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
ff70: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
ff80: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
ff90: 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
ffa0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
ffb0: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
ffc0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ffd0: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
ffe0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
fff0: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
10000 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
10010 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10020 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
10030 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
10040 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10050 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
10060 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
10070 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10080 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
10090 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
100a0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
100b0 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
100c0 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
100d0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
100e0 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
100f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
10100 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
10110 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c  WO_IN|WO_EQ|WO_L
10120 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
10130 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b  _GE|WO_MATCH) );
10140 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
10150 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
10160 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
10170 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
10180 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
10190 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
101a0 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
101b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
101c0 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
101d0 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
101e0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
101f0 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
10200 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
10210 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
10220 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
10230 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
10240 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
10250 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
10260 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
10270 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
10280 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10290 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
102a0 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
102b0 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
102c0 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
102d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
102e0 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
102f0 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
10300 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
10310 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
10320 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10330 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
10340 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
10350 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
10360 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
10370 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
10380 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
10390 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
103a0 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
103b0 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
103c0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
103d0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
103e0 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
103f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
10400 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
10410 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
10420 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
10430 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
10440 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
10450 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
10460 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
10470 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
10480 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
10490 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
104a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
104b0 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
104c0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
104d0 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
104e0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
104f0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
10500 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
10510 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
10520 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
10530 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
10540 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44   rc;..  TRACE_ID
10550 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
10560 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
10570 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
10580 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
10590 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
105a0 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
105b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
105c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
105d0 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
105e0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
105f0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
10600 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
10610 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
10620 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10630 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
10640 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
10650 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10660 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10670 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
10680 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
10690 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
106a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
106b0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
106c0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
106d0 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
106e0 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
106f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
10700 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
10710 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
10720 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10730 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
10740 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10750 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10760 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
10770 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
10780 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
10790 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
107a0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
107b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
107c0 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
107d0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
107e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
107f0 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a  TUALTABLE) */...
10800 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10810 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
10820 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
10830 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
10840 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
10850 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
10860 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
10870 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
10880 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
10890 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
108a0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
108b0 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
108c0 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
108d0 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
108e0 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
108f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
10900 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
10910 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10920 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  K on success..*/
10930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10940 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
10950 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
10970 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10980 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
10990 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
109a0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
109b0 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
109c0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
109d0 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
109e0 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
109f0 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
10a00 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
10a10 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
10a20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
10a30 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
10a40 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
10a50 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
10a80 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
10a90 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
10aa0 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
10ab0 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
10ac0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
10ad0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10ae0 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
10af0 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
10b00 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30  /.  int iMin = 0
10b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
10b30 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65  le not yet teste
10b40 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  d */.  int i = p
10b50 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20  Idx->nSample;   
10b60 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
10b70 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61  ample larger tha
10b80 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
10b90 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73  ec */.  int iTes
10ba0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10bb0 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70      /* Next samp
10bc0 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  le to test */.  
10bd0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
10be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10bf0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
10c00 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
10c10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10c20 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
10c30 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73  PARAMETER( pPars
10c40 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  e );.#endif.  as
10c50 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b  sert( pRec!=0 );
10c60 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e  .  iCol = pRec->
10c70 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73  nField - 1;.  as
10c80 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
10c90 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
10ca0 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e  t( pRec->nField>
10cb0 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
10cc0 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20  nSampleCol );.  
10cd0 64 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20  do{.    iTest = 
10ce0 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20  (iMin+i)/2;.    
10cf0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
10d00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
10d10 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c  Sample[iTest].n,
10d20 20 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e   aSample[iTest].
10d30 70 2c 20 70 52 65 63 2c 20 30 29 3b 0a 20 20 20  p, pRec, 0);.   
10d40 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
10d50 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74      iMin = iTest
10d60 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
10d70 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b 0a       i = iTest;.
10d80 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
10d90 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29 3b  res && iMin<i );
10da0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10db0 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
10dc0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
10dd0 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
10de0 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
10df0 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
10e00 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
10e10 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
10e20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
10e30 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
10e40 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
10e50 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
10e60 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  ts.  */.  if( re
10e70 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  s==0 ){.    /* I
10e80 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
10e90 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65 20  ue, then sample 
10ea0 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c  $i must be equal
10eb0 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20 20   to pRec */.    
10ec0 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e  assert( i<pIdx->
10ed0 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61  nSample );.    a
10ee0 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
10ef0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
10f00 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
10f10 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
10f20 52 65 63 2c 20 30 29 0a 20 20 20 20 20 20 20 20  Rec, 0).        
10f30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
10f40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
10f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
10f60 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20  Otherwise, pRec 
10f70 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
10f80 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61  than sample $i a
10f90 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  nd larger than. 
10fa0 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69     ** sample ($i
10fb0 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  -1).  */.    ass
10fc0 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
10fd0 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
10fe0 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
10ff0 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
11000 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
11010 65 5b 69 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29  e[i].p, pRec, 0)
11020 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  >0.         || p
11030 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
11040 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61  cFailed );.    a
11050 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20  ssert( i==0.    
11060 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
11070 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
11080 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c  (aSample[i-1].n,
11090 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c   aSample[i-1].p,
110a0 20 70 52 65 63 2c 20 30 29 3c 30 0a 20 20 20 20   pRec, 0)<0.    
110b0 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
110c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
110d0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   );.  }.#endif /
110e0 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
110f0 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74  EBUG */..  /* At
11100 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61   this point, aSa
11110 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
11120 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  irst sample that
11130 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
11140 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74  .  ** or equal t
11150 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69  o pVal.  Or if i
11160 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c  ==pIdx->nSample,
11170 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   then all sample
11180 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20  s are less.  ** 
11190 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61  than pVal.  If a
111a0 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c  Sample[i]==pVal,
111b0 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20 20   then res==0..  
111c0 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  */.  if( res==0 
111d0 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  ){.    aStat[0] 
111e0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
111f0 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74  t[iCol];.    aSt
11200 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[1] = aSample[
11210 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20  i].anEq[iCol];. 
11220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77   }else{.    tRow
11230 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  cnt iLower, iUpp
11240 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
11250 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
11260 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
11270 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
11280 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[0].anLt[iCol]
11290 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
112a0 20 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73     i64 nRow0 = s
112b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
112c0 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  t(pIdx->aiRowLog
112d0 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  Est[0]);.      i
112e0 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d  Upper = i>=pIdx-
112f0 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 52 6f 77 30  >nSample ? nRow0
11300 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   : aSample[i].an
11310 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  Lt[iCol];.      
11320 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65  iLower = aSample
11330 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d  [i-1].anEq[iCol]
11340 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   + aSample[i-1].
11350 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
11360 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  }.    aStat[1] =
11370 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e   (pIdx->nKeyCol>
11380 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41 76  iCol ? pIdx->aAv
11390 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b 0a  gEq[iCol] : 1);.
113a0 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
113b0 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
113c0 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
113d0 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
113e0 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
113f0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
11400 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
11410 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
11420 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
11430 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
11440 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
11450 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
11460 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a 23   + iGap;.  }.}.#
11470 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11480 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
11490 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
114a0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
114b0 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65  L, pTerm is a te
114c0 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  rm that provides
114d0 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77   an upper or low
114e0 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61  er.** bound on a
114f0 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74   range scan. Wit
11500 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  hout considering
11510 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73   pTerm, it is es
11520 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74  timated .** that
11530 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
11540 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20  isit nNew rows. 
11550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
11560 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
11570 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f  .** estimated to
11580 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65   be visited afte
11590 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69  r taking pTerm i
115a0 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a  nto account..**.
115b0 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65  ** If the user e
115c0 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
115d0 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  ied a likelihood
115e0 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  () value for thi
115f0 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20  s term,.** then 
11600 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
11610 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   is the likeliho
11620 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  od multiplied by
11630 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
11640 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74  * input rows. Ot
11650 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75  herwise, this fu
11660 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
11670 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e  hat an "IS NOT N
11680 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73  ULL" term.** has
11690 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
116a0 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f   0.50, and any o
116b0 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65  ther term a like
116c0 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a  lihood of 0.25..
116d0 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
116e0 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
116f0 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
11700 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29  rm, LogEst nNew)
11710 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20  {.  LogEst nRet 
11720 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54  = nNew;.  if( pT
11730 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  erm ){.    if( p
11740 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
11750 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
11760 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
11770 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Prob;.    }else 
11780 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
11790 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
117a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  )==0 ){.      nR
117b0 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20  et -= 20;       
117c0 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
117d0 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
117e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
117f0 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn nRet;.}../*.
11800 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11810 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
11820 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
11830 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
11840 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
11850 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
11860 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
11870 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
11880 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
11890 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
118a0 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
118b0 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
118c0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
118d0 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
118e0 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
118f0 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
11900 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
11910 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
11920 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
11930 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
11940 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
11950 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
11960 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
11970 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
11980 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
119b0 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
119d0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
11a00 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
11a10 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
11a20 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
11a30 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
11a40 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
11a50 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
11a60 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
11a70 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
11a80 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
11a90 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
11aa0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
11ab0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
11ac0 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d  e index.** colum
11ad0 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
11ae0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
11af0 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e  t. Or, equivalen
11b00 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  tly, the number 
11b10 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63  of.** equality c
11b20 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d  onstraints optim
11b30 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70  ized by the prop
11b40 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e  osed index scan.
11b50 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
11b60 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
11b70 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29  p is on t1(a, b)
11b80 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75  , and the SQL qu
11b90 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
11ba0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
11bb0 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20  E a = ? AND b > 
11bc0 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a  ? AND b < ? ....
11bd0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
11be0 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74  s set to 1 (as t
11bf0 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
11c00 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69  ted column, b, i
11c10 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
11c20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
11c30 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e  n of the index).
11c40 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72   Or, if the quer
11c50 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
11c60 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
11c70 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
11c80 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
11c90 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  Eq is set to 0..
11ca0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
11cb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11cc0 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65  ed, *pnOut is se
11cd0 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  t to the sqlite3
11ce0 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a  LogEst() of the.
11cf0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
11d00 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
11d10 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65   scan is expecte
11d20 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f  d to visit witho
11d30 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69  ut .** consideri
11d40 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  ng the range con
11d50 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71  straints. If nEq
11d60 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 74   is 0, this is t
11d70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
11d80 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
11d90 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
11da0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
11db0 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
11dc0 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
11dd0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
11de0 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74   range contraint
11df0 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  s pLower and pUp
11e00 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74  per..** .** In t
11e10 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
11e20 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59  lite_stat4 ANALY
11e30 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73  ZE data, or if s
11e40 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20  uch data cannot 
11e50 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68  be.** used, each
11e60 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
11e70 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
11e80 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
11e90 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a  factor of 4. .**
11ea0 20 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66   Hence a pair of
11eb0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
11ec0 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
11ed0 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
11ee0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77  number of.** row
11ef0 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66  s visited by a f
11f00 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a  actor of 16..*/.
11f10 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
11f20 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
11f30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11f40 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11f50 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
11f60 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
11f70 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
11f80 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65  *pBuilder,.  Whe
11f90 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
11fa0 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
11fb0 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
11fc0 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
11fd0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
11fe0 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
11ff0 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
12000 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
12010 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
12020 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
12030 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
12040 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68      /* Modify th
12050 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62  e .nOut and mayb
12060 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a  e .rRun fields *
12070 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
12090 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e   nOut = pLoop->n
120a0 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e  Out;.  LogEst nN
120b0 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
120c0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
120d0 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78  OR_STAT4.  Index
120e0 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
120f0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
12100 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
12110 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20  u.btree.nEq;..  
12120 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  if( p->nSample>0
12130 0a 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69  .   && nEq==pBui
12140 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a  lder->nRecValid.
12150 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61     && nEq<p->nSa
12160 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70  mpleCol.   && Op
12170 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
12180 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
12190 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29  LITE_Stat3) .  )
121a0 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65  {.    UnpackedRe
121b0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
121c0 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
121d0 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
121e0 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20     u8 aff;..    
121f0 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
12200 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
12210 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
12220 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
12230 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20  rows in .    ** 
12240 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
12250 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
12260 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
12270 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
12280 20 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65   The.    ** lowe
12290 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
122a0 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
122b0 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
122c0 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
122d0 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20    ** key-prefix 
122e0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45  formed by the nE
122f0 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64  q values matched
12300 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71   against the nEq
12310 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a   left-most.    *
12320 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
12330 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
12340 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
12350 4c 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  Lower..    **.  
12360 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
12370 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
12380 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
12390 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
123a0 63 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20  cause it.    ** 
123b0 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  is not a simple 
123c0 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65  variable or lite
123d0 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20  ral value), the 
123e0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
123f0 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
12400 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
12410 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
12420 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
12430 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
12440 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
12450 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
12460 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
12470 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
12480 61 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a  and .    ** ($P:
12490 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
124a0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
124b0 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73  turned values us
124c0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
124d0 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
124e0 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
124f0 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
12500 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
12510 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65  f rows.    ** le
12520 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
12530 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
12540 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
12550 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
12560 64 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  d.    ** is eith
12570 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
12580 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
12590 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
125a0 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
125b0 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72      ** of iUpper
125c0 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f   are requested o
125d0 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  f whereKeyStats(
125e0 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65  ) and the smalle
125f0 72 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  r used..    */. 
12600 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
12610 72 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  r;.    tRowcnt i
12620 55 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Upper;..    if( 
12630 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20  nEq==p->nKeyCol 
12640 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
12650 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
12660 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
12670 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61      aff = p->pTa
12680 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
12690 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69  olumn[nEq]].affi
126a0 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nity;.    }.    
126b0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
126c0 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
126d0 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
126e0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  */.    if( nEq==
126f0 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
12700 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
12710 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  per = sqlite3Log
12720 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f  EstToInt(p->aiRo
12730 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20  wLogEst[0]);.   
12740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
12750 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
12760 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
12770 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
12780 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
12790 20 6d 75 73 74 20 0a 20 20 20 20 20 20 2a 2a 20   must .      ** 
127a0 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
127b0 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67  ted when testing
127c0 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65   key $P in where
127d0 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20  EqualScanEst(). 
127e0 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 4b   */.      whereK
127f0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
12800 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
12810 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
12820 5b 30 5d 3b 0a 20 20 20 20 20 20 69 55 70 70 65  [0];.      iUppe
12830 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b  r = a[0] + a[1];
12840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12850 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
12860 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
12870 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
12880 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
12890 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
128a0 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128c0 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
128d0 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
128e0 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
128f0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
12900 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
12910 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
12920 73 65 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65  sert( (pLower->e
12930 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
12940 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
12950 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12960 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
12970 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
12980 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
12990 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
129a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
129b0 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
129c0 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
129d0 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77   iNew;.        w
129e0 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
129f0 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
12a00 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65   a);.        iNe
12a10 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f  w = a[0] + ((pLo
12a20 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
12a30 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a   WO_GT) ? a[1] :
12a40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
12a50 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69   iNew>iLower ) i
12a60 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Lower = iNew;.  
12a70 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
12a80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12a90 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
12aa0 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
12ab0 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20  iUpper estimate 
12ac0 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a  using ($P:$U). *
12ad0 2f 0a 20 20 20 20 69 66 28 20 70 55 70 70 65 72  /.    if( pUpper
12ae0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   ){.      int bO
12af0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
12b00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
12b10 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
12b20 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
12b30 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  /.      Expr *pE
12b40 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
12b50 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
12b60 20 20 20 61 73 73 65 72 74 28 20 28 70 55 70 70     assert( (pUpp
12b70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
12b80 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
12b90 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
12ba0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
12bb0 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
12bc0 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
12bd0 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
12be0 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
12bf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
12c00 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52  Ok ){.        tR
12c10 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
12c20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
12c30 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
12c40 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
12c50 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
12c60 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
12c70 74 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61  tor & WO_LE) ? a
12c80 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
12c90 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65    if( iNew<iUppe
12ca0 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65  r ) iUpper = iNe
12cb0 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  w;.        nOut-
12cc0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
12cd0 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ..    pBuilder->
12ce0 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
12cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
12d10 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b  iUpper>iLower ){
12d20 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  .        nNew = 
12d30 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55  sqlite3LogEst(iU
12d40 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a  pper - iLower);.
12d50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12d60 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
12d70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
12d80 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
12d90 28 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (2) );.      }. 
12da0 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f       if( nNew<nO
12db0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  ut ){.        nO
12dc0 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ut = nNew;.     
12dd0 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e   }.      pLoop->
12de0 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
12df0 4f 75 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45  Out;.      WHERE
12e00 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61  TRACE(0x10, ("ra
12e10 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  nge scan regions
12e20 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64  : %u..%u  est=%d
12e30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
12e50 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
12e60 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
12e70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12e80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
12e90 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
12ea0 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
12eb0 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
12ec0 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29  AMETER(pBuilder)
12ed0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
12ee0 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
12ef0 70 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  per );.  assert(
12f00 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70   pUpper==0 || (p
12f10 55 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26  Upper->wtFlags &
12f20 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
12f30 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
12f40 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f  eRangeAdjust(pLo
12f50 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e  wer, nOut);.  nN
12f60 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41  ew = whereRangeA
12f70 64 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e  djust(pUpper, nN
12f80 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e  ew);..  /* TUNIN
12f90 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  G: If there is b
12fa0 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64  oth an upper and
12fb0 20 6c 6f 77 65 72 20 6c 69 6d 69 74 2c 20 61 73   lower limit, as
12fc0 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69  sume the range i
12fd0 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62  s.  ** reduced b
12fe0 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  y an additional 
12ff0 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  75%. This means 
13000 74 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74  that, by default
13010 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a  , an open-ended.
13020 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79    ** range query
13030 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20   (e.g. col > ?) 
13040 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61  is assumed to ma
13050 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72  tch 1/4 of the r
13060 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ows in the.  ** 
13070 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63  index. While a c
13080 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67  losed range (e.g
13090 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20  . col BETWEEN ? 
130a0 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61  AND ?) is estima
130b0 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63  ted to.  ** matc
130c0 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e  h 1/64 of the in
130d0 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70  dex. */ .  if( p
130e0 4c 6f 77 65 72 20 26 26 20 70 55 70 70 65 72 20  Lower && pUpper 
130f0 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 0a 20  ) nNew -= 20;.. 
13100 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72   nOut -= (pLower
13110 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d  !=0) + (pUpper!=
13120 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31  0);.  if( nNew<1
13130 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20  0 ) nNew = 10;. 
13140 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
13150 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nOut = nNew;.  
13160 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
13170 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65  ogEst)nOut;.  re
13180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
13190 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
131a0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
131b0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
131c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
131d0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
131e0 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
131f0 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
13200 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
13210 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
13220 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
13230 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
13240 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
13250 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
13260 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
13270 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
13280 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
13290 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
132a0 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
132b0 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
132c0 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
132d0 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
132e0 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
132f0 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
13300 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
13310 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
13320 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
13330 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
13340 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
13350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13360 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
13370 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
13380 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
13390 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
133a0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
133b0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
133c0 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
133d0 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
133e0 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
133f0 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
13400 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
13410 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
13420 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
13430 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
13440 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
13450 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
13460 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
13470 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
13480 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
13490 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
134a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134b0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
134c0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
134d0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
134e0 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
134f0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
13500 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
13510 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
13520 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
13530 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
13540 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
13550 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
13560 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
13570 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
13580 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
13590 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
135a0 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
135b0 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
135c0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
135d0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
135e0 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
135f0 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
13600 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
13610 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
13620 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
13630 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20   u8 aff;        
13640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13650 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  lumn affinity */
13660 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13680 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
13690 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
136a0 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20  wcnt a[2];      
136b0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
136c0 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  tics */.  int bO
136d0 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45  k;..  assert( nE
136e0 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q>=1 );.  assert
136f0 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43  ( nEq<=(p->nKeyC
13700 6f 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ol+1) );.  asser
13710 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
13720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
13730 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
13740 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
13750 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
13760 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
13770 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
13780 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
13790 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
137a0 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
137b0 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
137c0 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
137d0 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
137e0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
137f0 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
13800 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
13810 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
13820 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
13830 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
13840 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
13850 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
13860 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
13870 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
13880 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
13890 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
138a0 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
138b0 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65    if( nEq>p->nKe
138c0 79 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 52  yCol ){.    *pnR
138d0 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
138e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
138f0 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  }..  aff = p->pT
13900 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
13910 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61  Column[nEq-1]].a
13920 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20  ffinity;.  rc = 
13930 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
13940 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
13950 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
13960 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26  r, aff, nEq-1, &
13970 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
13980 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
13990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
139a0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
139b0 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
139c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
139d0 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
139e0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
139f0 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
13a00 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
13a10 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
13a20 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
13a30 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
13a40 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
13a50 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70  int)a[1]));.  *p
13a60 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a  nRow = a[1];.  .
13a70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
13a80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13a90 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
13aa0 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66  STAT4 */..#ifdef
13ab0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
13ac0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
13ad0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
13ae0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
13af0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
13b00 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
13b10 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
13b20 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
13b30 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
13b40 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
13b50 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
13b60 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
13b70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
13b80 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
13b90 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
13ba0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
13bb0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
13bc0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
13bd0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
13be0 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
13bf0 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
13c00 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
13c10 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
13c20 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
13c30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
13c40 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
13c50 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
13c60 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
13c70 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
13c80 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
13c90 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
13ca0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
13cb0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
13cc0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
13cd0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
13ce0 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
13cf0 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
13d00 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
13d10 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
13d20 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
13d30 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
13d40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
13d50 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
13d60 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
13d70 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
13d80 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
13d90 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  der,.  ExprList 
13da0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
13db0 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
13dc0 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
13dd0 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
13de0 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
13df0 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
13e00 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
13e10 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
13e20 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
13e30 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
13e40 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
13e50 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77  ndex;.  i64 nRow
13e60 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 = sqlite3LogEs
13e70 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c  tToInt(p->aiRowL
13e80 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74  ogEst[0]);.  int
13e90 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
13ea0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13eb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13ec0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53  ITE_OK;     /* S
13ed0 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
13ee0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
13ef0 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20  cnt nEst;       
13f00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13f10 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67   rows for a sing
13f20 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f  le term */.  tRo
13f30 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30  wcnt nRowEst = 0
13f40 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69  ;    /* New esti
13f50 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
13f60 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  er of rows */.  
13f70 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
13f80 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
13f90 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
13fa0 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
13fb0 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
13fc0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
13fd0 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
13fe0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73  r; i++){.    nEs
13ff0 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72  t = nRow0;.    r
14000 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
14010 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
14020 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61  uilder, pList->a
14030 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74  [i].pExpr, &nEst
14040 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b  );.    nRowEst +
14050 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69  = nEst;.    pBui
14060 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
14070 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d  = nRecValid;.  }
14080 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
140a0 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30   nRowEst > nRow0
140b0 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f   ) nRowEst = nRo
140c0 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  w0;.    *pnRow =
140d0 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
140e0 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
140f0 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a  IN row estimate:
14100 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77   est=%g\n", nRow
14110 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Est));.  }.  ass
14120 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
14130 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61  RecValid==nRecVa
14140 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  lid );.  return 
14150 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
14160 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14170 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
14180 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
14190 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
141a0 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
141b0 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
141c0 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
141d0 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
141e0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
141f0 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
14200 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
14210 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
14220 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
14230 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
14240 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
14250 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
14260 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
14270 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
14280 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
14290 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
142a0 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
142b0 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
142c0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
142d0 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
142e0 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
142f0 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
14300 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
14310 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
14320 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
14330 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
14340 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
14350 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
14360 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
14370 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
14380 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
14390 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
143a0 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
143b0 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
143c0 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
143d0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
143e0 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
143f0 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
14400 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
14410 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
14420 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
14430 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
14440 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
14450 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
14460 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
14470 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
14480 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
14490 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
144a0 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
144b0 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
144c0 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
144d0 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
144e0 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
144f0 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
14500 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
14510 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
14520 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
14530 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
14540 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
14550 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
14560 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
14570 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
14580 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
14590 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
145a0 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
145b0 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
145c0 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
145d0 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
145e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
145f0 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
14600 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
14610 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
14620 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
14630 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77      && (pTerm->w
14640 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
14650 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  DED)==0.      &&
14660 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
14670 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
14680 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
14690 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
146a0 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28  oin)).      && (
146b0 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
146c0 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   & pTerm->prereq
146d0 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  All)==0.  ){.   
146e0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
146f0 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
14700 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
14710 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20  arent>=0 ){.    
14720 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
14730 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57  her = &pTerm->pW
14740 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72  C->a[pTerm->iPar
14750 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ent];.      if( 
14760 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c  (--pOther->nChil
14770 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
14780 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
14790 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20  vel, pOther);.  
147a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
147b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
147c0 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
147d0 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65  ode to apply the
147e0 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
147f0 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20   string zAff.** 
14800 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65  to the n registe
14810 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  rs starting at b
14820 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61  ase. .**.** As a
14830 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
14840 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
14850 65 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61  entries (which a
14860 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68  re no-ops) at th
14870 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61  e.** beginning a
14880 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61  nd end of zAff a
14890 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  re ignored.  If 
148a0 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a  all entries in z
148b0 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54  Aff are.** SQLIT
148c0 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e  E_AFF_NONE, then
148d0 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65   no code gets ge
148e0 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nerated..**.** T
148f0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
14900 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  s its own copy o
14910 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74  f zAff so that t
14920 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65  he caller is fre
14930 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a  e.** to modify z
14940 41 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72  Aff after this r
14950 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
14960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
14970 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
14980 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14990 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c  int base, int n,
149a0 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20   char *zAff){.  
149b0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
149c0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a  ->pVdbe;.  if( z
149d0 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Aff==0 ){.    as
149e0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
149f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14a00 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
14a10 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  }.  assert( v!=0
14a20 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74   );..  /* Adjust
14a30 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73   base and n to s
14a40 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f  kip over SQLITE_
14a50 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73  AFF_NONE entries
14a60 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
14a70 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f  g.  ** and end o
14a80 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  f the affinity s
14a90 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68  tring..  */.  wh
14aa0 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66  ile( n>0 && zAff
14ab0 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  [0]==SQLITE_AFF_
14ac0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
14ad0 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20  .    base++;.   
14ae0 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77   zAff++;.  }.  w
14af0 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66  hile( n>1 && zAf
14b00 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41  f[n-1]==SQLITE_A
14b10 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
14b20 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  --;.  }..  /* Co
14b30 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  de the OP_Affini
14b40 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65  ty opcode if the
14b50 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c  re is anything l
14b60 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20  eft to do. */.  
14b70 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73  if( n>0 ){.    s
14b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14b90 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
14ba0 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73   base, n);.    s
14bb0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14bc0 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20  P4(v, -1, zAff, 
14bd0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  n);.    sqlite3E
14be0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
14bf0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62  Change(pParse, b
14c00 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  ase, n);.  }.}..
14c10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14c20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
14c30 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
14c40 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
14c50 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74  use.  An equalit
14c60 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65  y.** term can be
14c70 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f   either X=expr o
14c80 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20  r X IN (...).   
14c90 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72  pTerm is the ter
14ca0 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65  m to be .** code
14cb0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  d..**.** The cur
14cc0 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rent value for t
14cd0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
14ce0 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
14cf0 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f  r iReg..**.** Fo
14d00 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  r a constraint o
14d10 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70  f the form X=exp
14d20 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  r, the expressio
14d30 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
14d40 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74  nd its.** result
14d50 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
14d60 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73  stack.  For cons
14d70 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66  traints of the f
14d80 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a  orm X IN (...).*
14d90 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
14da0 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68  ets up a loop th
14db0 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20  at will iterate 
14dc0 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
14dd0 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of X..*/.static 
14de0 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79  int codeEquality
14df0 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
14e00 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
14e10 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
14e20 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
14e30 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54  m *pTerm,   /* T
14e40 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  he term of the W
14e50 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
14e60 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
14e70 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
14e80 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66   /* The level of
14e90 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
14ea0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
14eb0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c  on */.  int iEq,
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14ed0 6e 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61  ndex of the equa
14ee0 6c 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e  lity term within
14ef0 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
14f00 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20   int bRev,      
14f10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
14f20 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 49   reverse-order I
14f30 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a  N operations */.
14f40 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20    int iTarget   
14f50 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
14f60 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74   to leave result
14f70 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  s in this regist
14f80 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  er */.){.  Expr 
14f90 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
14fa0 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  pr;.  Vdbe *v = 
14fb0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14fc0 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20   int iReg;      
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14fe0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
14ff0 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73  results */..  as
15000 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20  sert( iTarget>0 
15010 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d  );.  if( pX->op=
15020 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52  =TK_EQ ){.    iR
15030 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
15040 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
15050 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69  e, pX->pRight, i
15060 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  Target);.  }else
15070 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
15080 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52  ISNULL ){.    iR
15090 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
150a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
150b0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
150c0 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65  0, iReg);.#ifnde
150d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
150e0 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
150f0 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20      int eType;. 
15100 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
15110 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
15120 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  pIn;.    WhereLo
15130 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  op *pLoop = pLev
15140 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
15150 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
15160 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
15170 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20  TUALTABLE)==0.  
15180 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e      && pLoop->u.
15190 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a  btree.pIndex!=0.
151a0 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
151b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
151c0 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a  aSortOrder[iEq].
151d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
151e0 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b  tcase( iEq==0 );
151f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15200 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62   bRev );.      b
15210 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20  Rev = !bRev;.   
15220 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
15230 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
15240 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
15250 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  et;.    eType = 
15260 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
15270 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30  ex(pParse, pX, 0
15280 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  );.    if( eType
15290 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
152a0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74  _DESC ){.      t
152b0 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
152c0 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
152d0 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Rev;.    }.    i
152e0 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
152f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15300 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
15310 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
15320 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
15330 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
15340 65 49 66 28 76 2c 20 62 52 65 76 29 3b 0a 20 20  eIf(v, bRev);.  
15350 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
15360 28 76 2c 20 21 62 52 65 76 29 3b 0a 20 20 20 20  (v, !bRev);.    
15370 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
15380 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15390 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a  MULTI_OR)==0 );.
153a0 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
153b0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41  gs |= WHERE_IN_A
153c0 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  BLE;.    if( pLe
153d0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30  vel->u.in.nIn==0
153e0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
153f0 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
15400 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
15410 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (v);.    }.    p
15420 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b  Level->u.in.nIn+
15430 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  +;.    pLevel->u
15440 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20  .in.aInLoop =.  
15450 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
15460 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
15470 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  se->db, pLevel->
15480 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  u.in.aInLoop,.  
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
154b0 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  of(pLevel->u.in.
154c0 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
154d0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20  el->u.in.nIn);. 
154e0 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
154f0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20  >u.in.aInLoop;. 
15500 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20     if( pIn ){.  
15510 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65      pIn += pLeve
15520 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b  l->u.in.nIn - 1;
15530 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72  .      pIn->iCur
15540 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69   = iTab;.      i
15550 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
15560 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
15570 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
15580 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
15590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
155a0 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
155b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
155c0 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
155d0 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
155e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
155f0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20  olumn, iTab, 0, 
15600 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iReg);.      }. 
15610 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f       pIn->eEndLo
15620 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  opOp = bRev ? OP
15630 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50  _PrevIfOpen : OP
15640 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20  _NextIfOpen;.   
15650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15660 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
15670 6c 2c 20 69 52 65 67 29 3b 20 56 64 62 65 43 6f  l, iReg); VdbeCo
15680 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
15690 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
156a0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
156b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
156c0 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
156d0 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
156e0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
156f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15700 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
15710 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
15720 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
15730 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
15740 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20  dex scan..**.** 
15750 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
15760 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
15770 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
15780 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
15790 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
157a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
157b0 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
157c0 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
157d0 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
157e0 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
157f0 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
15800 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15810 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
15820 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
15830 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
15840 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
15850 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
15860 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
15870 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
15880 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
15890 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
158a0 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
158b0 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
158c0 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
158d0 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
158e0 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  d b will be stor
158f0 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75  ed.** in consecu
15900 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
15910 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  nd the index of 
15920 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
15930 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
15940 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
15950 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
15960 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
15970 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
15980 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
15990 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
159a0 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
159b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
159c0 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
159d0 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
159e0 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
159f0 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
15a00 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
15a10 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65  l and.** compute
15a20 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
15a30 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ring..**.** The 
15a40 6e 45 78 74 72 61 52 65 67 20 70 61 72 61 6d 65  nExtraReg parame
15a50 74 65 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20  ter is 0 or 1.  
15a60 49 74 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57  It is 0 if all W
15a70 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
15a80 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d  traints.** are =
15a90 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20  = or IN and are 
15aa0 63 6f 76 65 72 65 64 20 62 79 20 74 68 65 20 6e  covered by the n
15ab0 45 71 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69  Eq.  nExtraReg i
15ac0 73 20 31 20 69 66 20 74 68 65 72 65 20 69 73 0a  s 1 if there is.
15ad0 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ** an inequality
15ae0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63   constraint (suc
15af0 68 20 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41  h as the "c>=5 A
15b00 4e 44 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20  ND c<10" in the 
15b10 65 78 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a  example) that.**
15b20 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68   occurs after th
15b30 65 20 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f  e nEq quality co
15b40 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a  nstraints..**.**
15b50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
15b60 6c 6f 63 61 74 65 73 20 61 20 72 61 6e 67 65 20  locates a range 
15b70 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67  of nEq+nExtraReg
15b80 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
15b90 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
15ba0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
15bb0 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  rst memory cell 
15bc0 69 6e 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54  in that range. T
15bd0 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  he code that.** 
15be0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
15bf0 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74  ne will use that
15c00 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f   memory range to
15c10 20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a   store keys for.
15c20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 74 65 72  ** start and ter
15c30 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69  mination conditi
15c40 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
15c50 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66  .** key value of
15c60 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f   the loop.  If o
15c70 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70  ne or more IN op
15c80 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20  erators appear, 
15c90 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
15ca0 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
15cb0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71  n additional nEq
15cc0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
15cd0 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
15ce0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
15cf0 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66  returning, *pzAf
15d00 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  f is set to poin
15d10 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
15d20 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f  ntaining a.** co
15d30 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
15d40 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
15d50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c   of the index al
15d60 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
15d70 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
15d80 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72  (). Except, entr
15d90 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20  ies in the copy 
15da0 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  of the string as
15db0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
15dc0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15dd0 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e  aints that use N
15de0 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65  ONE affinity are
15df0 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54   set to.** SQLIT
15e00 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73  E_AFF_NONE. This
15e10 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68   is to deal with
15e20 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65   SQL such as the
15e30 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
15e40 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
15e50 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41   t1(a TEXT PRIMA
15e60 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20  RY KEY, b);.**  
15e70 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
15e80 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48   t1 AS t2, t1 WH
15e90 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b  ERE t1.a = t2.b;
15ea0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
15eb0 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
15ec0 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20   index on t1(a) 
15ed0 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74  has TEXT affinit
15ee0 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20  y. But since.** 
15ef0 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73  the right hand s
15f00 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c  ide of the equal
15f10 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
15f20 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61  t2.b) has NONE a
15f30 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63  ffinity,.** no c
15f40 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64  onversion should
15f50 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65   be attempted be
15f60 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e  fore using a t2.
15f70 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20  b value as part 
15f80 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73  of.** a key to s
15f90 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e  earch the index.
15fa0 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74   Hence the first
15fb0 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74   byte in the ret
15fc0 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a  urned affinity.*
15fd0 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73  * string in this
15fe0 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62   example would b
15ff0 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
16000 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  AFF_NONE..*/.sta
16010 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
16020 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
16030 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16040 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16050 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
16060 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
16070 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
16080 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
16090 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
160a0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ng */.  int bRev
160b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
160c0 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64   Reverse the ord
160d0 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  er of IN operato
160e0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  rs */.  int nExt
160f0 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
16100 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
16110 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
16120 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
16130 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
16140 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
16150 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
16160 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
16170 20 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20    u16 nEq;      
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
161a0 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
161b0 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
161c0 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20  .  u16 nSkip;   
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
161f0 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ft-most columns 
16200 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62  to skip */.  Vdb
16210 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
16220 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
16230 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
16240 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
16250 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
16260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16270 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
16280 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
16290 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
162a0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
162b0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
162c0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
162d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
162e0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
162f0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
16300 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
16310 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16330 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
16340 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
16370 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
163a0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
163b0 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
163c0 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
163d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
163e0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
163f0 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
16400 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
16410 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
16420 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
16430 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
16440 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
16450 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73  l->pWLoop;.  ass
16460 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
16470 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
16480 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
16490 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  .  nEq = pLoop->
164a0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e  u.btree.nEq;.  n
164b0 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  Skip = pLoop->u.
164c0 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 70  btree.nSkip;.  p
164d0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
164e0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61  tree.pIndex;.  a
164f0 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
16500 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
16510 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
16520 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
16530 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
16540 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
16550 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
16560 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
16570 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Reg = pLoop->u.b
16580 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72  tree.nEq + nExtr
16590 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
165a0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
165b0 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
165c0 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
165d0 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
165e0 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
165f0 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
16600 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
16610 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16620 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69  ed = 1;.  }..  i
16630 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( nSkip ){.    
16640 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c  int iIdxCur = pL
16650 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
16660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16670 64 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50  dOp1(v, (bRev?OP
16680 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29  _Last:OP_Rewind)
16690 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  , iIdxCur);.    
166a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
166b0 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
166c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
166d0 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
166e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
166f0 22 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e  "begin skip-scan
16700 20 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a   on %s", pIdx->z
16710 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20  Name));.    j = 
16720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16730 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
16740 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53     pLevel->addrS
16750 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
16760 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62  eAddOp4Int(v, (b
16770 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50  Rev?OP_SeekLT:OP
16780 5f 53 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20  _SeekGT),.      
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 20 20 69 49 64 78 43 75 72 2c 20 30        iIdxCur, 0
167b0 2c 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70  , regBase, nSkip
167c0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
167d0 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
167e0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
167f0 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30  ageIf(v, bRev!=0
16800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16810 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29  beJumpHere(v, j)
16820 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
16830 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20  <nSkip; j++){.  
16840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16850 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
16860 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20  mn, iIdxCur, j, 
16870 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
16880 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
16890 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29  aiColumn[j]>=0 )
168a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
168b0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
168c0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
168d0 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
168e0 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  j]].zName));.   
168f0 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a   }.  }    ..  /*
16900 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71   Evaluate the eq
16910 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16920 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
16930 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e  ( zAff==0 || (in
16940 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d  t)strlen(zAff)>=
16950 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e  nEq );.  for(j=n
16960 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  Skip; j<nEq; j++
16970 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
16980 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
16990 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
169a0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
169b0 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 );.    /* The 
169c0 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61  following testca
169d0 73 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 69  se is true for i
169e0 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
169f0 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a  ndant columns. .
16a00 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54      ** Ex: CREAT
16a10 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
16a20 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20  (a,b,a); SELECT 
16a30 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
16a40 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a  a=0 AND b=0; */.
16a50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
16a60 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
16a70 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29  TERM_CODED)!=0 )
16a80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
16a90 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
16aa0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
16ab0 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
16ac0 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
16ad0 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
16ae0 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61  , j, bRev, regBa
16af0 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
16b00 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
16b10 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
16b20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
16b30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16b40 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
16b50 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
16b60 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
16b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16b90 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
16ba0 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
16bb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16bc0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
16bd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
16be0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
16bf0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
16c00 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
16c10 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
16c20 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
16c30 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
16c40 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
16c50 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
16c60 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
16c70 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ght;.      if( s
16c80 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
16c90 75 6c 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20  ull(pRight) ){. 
16ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16cb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16cc0 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a  sNull, regBase+j
16cd0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
16ce0 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  k);.        Vdbe
16cf0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16d00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
16d10 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
16d20 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
16d30 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
16d40 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49  , zAff[j])==SQLI
16d50 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
16d60 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
16d70 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
16d80 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
16d90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16da0 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
16db0 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
16dc0 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20  t, zAff[j]) ){. 
16dd0 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
16de0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
16df0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
16e00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16e10 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b    *pzAff = zAff;
16e20 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73  .  return regBas
16e30 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
16e40 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
16e50 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  N./*.** This rou
16e60 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72  tine is a helper
16e70 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65   for explainInde
16e80 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a  xRange() below.*
16e90 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20  *.** pStr holds 
16ea0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
16eb0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77  xpression that w
16ec0 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75  e are building u
16ed0 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74  p one term.** at
16ee0 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
16ef0 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65  outine adds a ne
16f00 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e  w term to the en
16f10 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  d of the express
16f20 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72  ion..** Terms ar
16f30 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41  e separated by A
16f40 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41  ND so add the "A
16f50 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63  ND" text for sec
16f60 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
16f70 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  nt.** terms only
16f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16f90 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
16fa0 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a  rm(.  StrAccum *
16fb0 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  pStr,           
16fc0 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78    /* The text ex
16fd0 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62  pression being b
16fe0 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  uilt */.  int iT
16ff0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
17000 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17010 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69  f this term.  Fi
17020 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20  rst is zero */. 
17030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
17040 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  lumn,        /* 
17050 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
17060 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
17070 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20  ar *zOp         
17080 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
17090 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29  he operator */.)
170a0 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20  {.  if( iTerm ) 
170b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
170c0 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
170d0 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74  D ", 5);.  sqlit
170e0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
170f0 41 6c 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d  All(pStr, zColum
17100 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  n);.  sqlite3Str
17110 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
17120 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c  , zOp, 1);.  sql
17130 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
17140 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29  nd(pStr, "?", 1)
17150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
17160 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72  ent pLevel descr
17170 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20  ibes a strategy 
17180 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62  for scanning tab
17190 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a  le pTab. This .*
171a0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
171b0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
171c0 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
171d0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73  containing a des
171e0 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
171f0 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62  he subset of tab
17200 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  le rows scanned 
17210 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
17220 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
17230 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  n.** SQL express
17240 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20  ion. Or, if all 
17250 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64  rows are scanned
17260 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
17270 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
17280 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
17290 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
172a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
172b0 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
172c0 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
172d0 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
172e0 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
172f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
17300 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
17310 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
17320 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
17330 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68  ND b>?".**.** Th
17340 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
17350 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d  er points to mem
17360 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
17370 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
17380 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
17390 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
173a0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
173b0 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
173c0 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  r when it is.** 
173d0 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
173e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
173f0 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78  ar *explainIndex
17400 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64  Range(sqlite3 *d
17410 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  b, WhereLoop *pL
17420 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  oop, Table *pTab
17430 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
17440 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
17450 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31  ree.pIndex;.  u1
17460 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  6 nEq = pLoop->u
17470 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31  .btree.nEq;.  u1
17480 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d  6 nSkip = pLoop-
17490 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a  >u.btree.nSkip;.
174a0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f    int i, j;.  Co
174b0 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61  lumn *aCol = pTa
174c0 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a  b->aCol;.  i16 *
174d0 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65  aiColumn = pInde
174e0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53  x->aiColumn;.  S
174f0 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20  trAccum txt;..  
17500 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70  if( nEq==0 && (p
17510 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
17520 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
17530 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
17540 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))==0 ){.    ret
17550 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
17560 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
17570 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c  (&txt, 0, 0, SQL
17580 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b  ITE_MAX_LENGTH);
17590 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a  .  txt.db = db;.
175a0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
175b0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20  mAppend(&txt, " 
175c0 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d  (", 2);.  for(i=
175d0 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a  0; i<nEq; i++){.
175e0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 69      char *z = (i
175f0 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  ==pIndex->nKeyCo
17600 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  l ) ? "rowid" : 
17610 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d  aCol[aiColumn[i]
17620 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
17630 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20 20   i>=nSkip ){.   
17640 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
17650 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
17660 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65   "=");.    }else
17670 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 20  {.      if( i ) 
17680 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
17690 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 41 4e  ppend(&txt, " AN
176a0 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 73  D ", 5);.      s
176b0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
176c0 70 65 6e 64 28 26 74 78 74 2c 20 22 41 4e 59 28  pend(&txt, "ANY(
176d0 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 4);.      sql
176e0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
176f0 6e 64 41 6c 6c 28 26 74 78 74 2c 20 7a 29 3b 0a  ndAll(&txt, z);.
17700 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
17710 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
17720 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 7d  , ")", 1);.    }
17730 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20  .  }..  j = i;. 
17740 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
17750 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
17760 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
17770 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d  *z = (j==pIndex-
17780 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f  >nKeyCol ) ? "ro
17790 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
177a0 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
177b0 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
177c0 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c  dTerm(&txt, i++,
177d0 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20   z, ">");.  }.  
177e0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
177f0 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
17800 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
17810 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e  z = (j==pIndex->
17820 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77  nKeyCol ) ? "row
17830 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
17840 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
17850 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
17860 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
17870 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   "<");.  }.  sql
17880 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
17890 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29  nd(&txt, ")", 1)
178a0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
178b0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
178c0 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&txt);.}../*.**
178d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
178e0 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
178f0 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
17900 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e  ssing an EXPLAIN
17910 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63   QUERY PLAN.** c
17920 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71  ommand. If the q
17930 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69  uery being compi
17940 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49  led is an EXPLAI
17950 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20  N QUERY PLAN, a 
17960 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64  single.** record
17970 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
17980 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72   output to descr
17990 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63  ibe the table sc
179a0 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a  an strategy in .
179b0 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ** pLevel..*/.st
179c0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
179d0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
179e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
179f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17a00 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
17a10 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
17a20 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
17a30 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
17a40 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
17a50 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
17a60 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
17a70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
17a80 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
17a90 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
17aa0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ac0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
17ad0 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
17ae0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
17af0 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
17b20 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
17b30 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
17b40 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
17b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
17b60 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
17b70 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
17b80 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
17b90 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
17ba0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
17bb0 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20  n==2 ).#endif.  
17bc0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
17bd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
17be0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
17bf0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
17c00 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
17c10 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
17c20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
17c30 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
17c40 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
17c50 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
17c60 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
17c70 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
17c80 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Msg;            
17c90 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
17ca0 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74  o add to EQP out
17cb0 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  put */.    int i
17cc0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
17cd0 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65  lectId;  /* Sele
17ce0 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74  ct id (left-most
17cf0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20   output column) 
17d00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61  */.    int isSea
17d10 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  rch;            
17d20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
17d30 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65   a SEARCH. False
17d40 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20   for SCAN. */.  
17d50 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
17d60 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
17d70 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69  /* The controlli
17d80 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ng WhereLoop obj
17d90 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66  ect */.    u32 f
17da0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
17db0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
17dc0 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
17dd0 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  this loop */..  
17de0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
17df0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c  ->pWLoop;.    fl
17e00 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46  ags = pLoop->wsF
17e10 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66  lags;.    if( (f
17e20 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
17e30 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c  _OR) || (wctrlFl
17e40 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
17e50 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72  LE_ONLY) ) retur
17e60 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68  n;..    isSearch
17e70 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52 45   = (flags&(WHERE
17e80 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
17e90 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a  _TOP_LIMIT))!=0.
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
17eb0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52  (flags&WHERE_VIR
17ec0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26  TUALTABLE)==0 &&
17ed0 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65   (pLoop->u.btree
17ee0 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20  .nEq>0)).       
17ef0 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
17f00 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52  ags&(WHERE_ORDER
17f10 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44  BY_MIN|WHERE_ORD
17f20 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20  ERBY_MAX));..   
17f30 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17f40 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
17f50 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52 43   isSearch?"SEARC
17f60 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20  H":"SCAN");.    
17f70 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
17f80 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  ct ){.      zMsg
17f90 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
17fa0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
17fb0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a   SUBQUERY %d", z
17fc0 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65  Msg,pItem->iSele
17fd0 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ctId);.    }else
17fe0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
17ff0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
18000 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42  b, zMsg, "%s TAB
18010 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  LE %s", zMsg, pI
18020 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
18030 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65   }..    if( pIte
18040 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
18050 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
18060 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
18070 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20  sg, "%s AS %s", 
18080 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
18090 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ias);.    }.    
180a0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57 48  if( (flags & (WH
180b0 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49  ERE_IPK|WHERE_VI
180c0 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a  RTUALTABLE))==0.
180d0 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70       && ALWAYS(p
180e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
180f0 6e 64 65 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ndex!=0).    ){.
18100 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
18110 20 2a 7a 46 6d 74 3b 0a 20 20 20 20 20 20 49 6e   *zFmt;.      In
18120 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 6f 6f  dex *pIdx = pLoo
18130 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
18140 78 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  x;.      char *z
18150 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49  Where = explainI
18160 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c  ndexRange(db, pL
18170 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  oop, pItem->pTab
18180 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18190 20 21 28 66 6c 61 67 73 26 57 48 45 52 45 5f 41   !(flags&WHERE_A
181a0 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28 66  UTO_INDEX) || (f
181b0 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f  lags&WHERE_IDX_O
181c0 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20 20 69 66  NLY) );.      if
181d0 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 74 65  ( !HasRowid(pIte
181e0 6d 2d 3e 70 54 61 62 29 20 26 26 20 70 49 64 78  m->pTab) && pIdx
181f0 2d 3e 61 75 74 6f 49 6e 64 65 78 3d 3d 32 20 29  ->autoIndex==2 )
18200 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d  {.        zFmt =
18210 20 7a 57 68 65 72 65 20 3f 20 22 25 73 20 55 53   zWhere ? "%s US
18220 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59 25  ING PRIMARY KEY%
18230 2e 30 73 25 73 22 20 3a 20 22 25 73 25 2e 30 73  .0s%s" : "%s%.0s
18240 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
18250 20 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45   if( flags & WHE
18260 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20 29 7b  RE_AUTO_INDEX ){
18270 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20  .        zFmt = 
18280 22 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41  "%s USING AUTOMA
18290 54 49 43 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  TIC COVERING IND
182a0 45 58 25 2e 30 73 25 73 22 3b 0a 20 20 20 20 20  EX%.0s%s";.     
182b0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
182c0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
182d0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  Y ){.        zFm
182e0 74 20 3d 20 22 25 73 20 55 53 49 4e 47 20 43 4f  t = "%s USING CO
182f0 56 45 52 49 4e 47 20 49 4e 44 45 58 20 25 73 25  VERING INDEX %s%
18300 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s";.      }else{
18310 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20  .        zFmt = 
18320 22 25 73 20 55 53 49 4e 47 20 49 4e 44 45 58 20  "%s USING INDEX 
18330 25 73 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20  %s%s";.      }. 
18340 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
18350 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
18360 7a 4d 73 67 2c 20 7a 46 6d 74 2c 20 7a 4d 73 67  zMsg, zFmt, zMsg
18370 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pIdx->zName, z
18380 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71  Where);.      sq
18390 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
183a0 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c  zWhere);.    }el
183b0 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  se if( (flags & 
183c0 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26  WHERE_IPK)!=0 &&
183d0 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
183e0 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 20 29  CONSTRAINT)!=0 )
183f0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
18400 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
18410 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49  b, zMsg, "%s USI
18420 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
18430 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a  RY KEY", zMsg);.
18440 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
18450 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  &(WHERE_COLUMN_E
18460 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  Q|WHERE_COLUMN_I
18470 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  N) ){.        zM
18480 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
18490 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
184a0 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a  %s (rowid=?)", z
184b0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
184c0 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45  e if( (flags&WHE
184d0 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d  RE_BOTH_LIMIT)==
184e0 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54  WHERE_BOTH_LIMIT
184f0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
18500 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
18510 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
18520 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f   (rowid>? AND ro
18530 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid<?)", zMsg);.
18540 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
18550 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f  flags&WHERE_BTM_
18560 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
18570 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
18580 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
18590 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22  , "%s (rowid>?)"
185a0 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
185b0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
185c0 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f  flags&WHERE_TOP_
185d0 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20  LIMIT) ){.      
185e0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
185f0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
18600 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29  g, "%s (rowid<?)
18610 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
18620 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
18630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
18640 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73  UALTABLE.    els
18650 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
18660 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
18670 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  E)!=0 ){.      z
18680 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
18690 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
186a0 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c  "%s VIRTUAL TABL
186b0 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20  E INDEX %d:%s", 
186c0 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  zMsg,.          
186d0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
186e0 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c  .vtab.idxNum, pL
186f0 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  oop->u.vtab.idxS
18700 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  tr);.    }.#endi
18710 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  f.    zMsg = sql
18720 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
18730 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d 73   zMsg, "%s", zMs
18740 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
18750 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18760 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c  Explain, iId, iL
18770 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73  evel, iFrom, zMs
18780 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
18790 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
187a0 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53  fine explainOneS
187b0 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29  can(u,v,w,x,y,z)
187c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
187d0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
187e0 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  /.../*.** Genera
187f0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
18800 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65  start of the iLe
18810 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74  vel-th loop in t
18820 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  he WHERE clause.
18830 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
18840 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  n described by p
18850 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  WInfo..*/.static
18860 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65   Bitmask codeOne
18870 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65  LoopStart(.  Whe
18880 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
18890 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e    /* Complete in
188a0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
188b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
188c0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
188d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
188e0 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49  ich level of pWI
188f0 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20  nfo->a[] should 
18900 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69  be coded */.  Bi
18910 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
18920 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c     /* Which tabl
18930 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  es are currently
18940 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b   available */.){
18950 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20  .  int j, k;    
18960 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
18970 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
18980 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
18990 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
189a0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
189b0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ble */.  int add
189c0 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rNxt;         /*
189d0 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74   Where to jump t
189e0 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
189f0 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65  the next IN case
18a00 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61   */.  int omitTa
18a10 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  ble;       /* Tr
18a20 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
18a30 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
18a40 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
18a50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
18a60 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
18a70 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
18a80 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  r */.  WhereLeve
18a90 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54  l *pLevel;  /* T
18aa0 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74  he where level t
18ab0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
18ac0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
18ad0 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72  ;    /* The Wher
18ae0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69  eLoop object bei
18af0 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  ng coded */.  Wh
18b00 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
18b10 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
18b20 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
18b30 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
18b40 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
18b50 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
18b60 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
18b70 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
18b80 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ba0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
18bb0 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
18bc0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
18bd0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
18be0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
18bf0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
18c20 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63  red stmt under c
18c30 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  onstructions */.
18c40 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
18c50 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
18c60 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
18c70 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65   term being code
18c80 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  d */.  int addrB
18c90 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
18ca0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
18cb0 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
18cc0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
18cd0 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20    int addrCont; 
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
18d00 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
18d10 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
18d20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20  int iRowidReg = 
18d30 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  0;        /* Row
18d40 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  id is stored in 
18d50 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69  this register, i
18d60 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20  f not zero */.  
18d70 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20  int iReleaseReg 
18d80 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d  = 0;      /* Tem
18d90 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
18da0 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ee before return
18db0 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ing */..  pParse
18dc0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
18dd0 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  e;.  v = pParse-
18de0 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20  >pVdbe;.  pWC = 
18df0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
18e00 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
18e10 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
18e20 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
18e30 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
18e40 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62  ->pWLoop;.  pTab
18e50 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Item = &pWInfo->
18e60 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
18e70 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43  el->iFrom];.  iC
18e80 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
18e90 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c  Cursor;.  pLevel
18ea0 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74  ->notReady = not
18eb0 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b  Ready & ~getMask
18ec0 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
18ed0 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65  et, iCur);.  bRe
18ee0 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76  v = (pWInfo->rev
18ef0 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b  Mask>>iLevel)&1;
18f00 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28  .  omitTable = (
18f10 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
18f20 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
18f30 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
18f40 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
18f50 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46  lFlags & WHERE_F
18f60 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a  ORCE_TABLE)==0;.
18f70 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
18f80 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
18f90 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22  HERE-loop%d: %s"
18fa0 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d  ,iLevel,pTabItem
18fb0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
18fc0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61  ..  /* Create la
18fd0 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
18fe0 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
18ff0 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
19000 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75  .  ** for the cu
19010 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d  rrent loop.  Jum
19020 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20  p to addrBrk to 
19030 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
19040 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74  oop..  ** Jump t
19050 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
19060 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
19070 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
19080 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e  f the.  ** loop.
19090 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
190a0 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
190b0 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
190c0 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74   have a "addrNxt
190d0 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a  " label that.  *
190e0 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69  * means to conti
190f0 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
19100 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69  t IN value combi
19110 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20  nation.  When.  
19120 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
19130 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
19140 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
19150 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c   the "addrNxt" l
19160 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65  abel.  ** is the
19170 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72   same as "addrBr
19180 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42  k"..  */.  addrB
19190 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
191a0 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
191b0 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
191c0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
191d0 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70  ;.  addrCont = p
191e0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20  Level->addrCont 
191f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19200 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
19210 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
19220 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
19230 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
19240 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
19250 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
19260 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
19270 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
19280 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
19290 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  any.  ** row of 
192a0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
192b0 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
192c0 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
192d0 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49  From>0 && (pTabI
192e0 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  tem[0].jointype 
192f0 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
19300 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  .    pLevel->iLe
19310 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73  ftJoin = ++pPars
19320 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
19330 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19340 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
19350 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
19360 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
19370 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c  ment((v, "init L
19380 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
19390 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a  h flag"));.  }..
193a0 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
193b0 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  e of a FROM clau
193c0 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c  se subquery impl
193d0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
193e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28  routine */.  if(
193f0 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f   pTabItem->viaCo
19400 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69  routine ){.    i
19410 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54  nt regYield = pT
19420 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  abItem->regRetur
19430 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
19440 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
19450 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
19460 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49  gYield, 0, pTabI
19470 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
19480 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
19490 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65  2 =  sqlite3Vdbe
194a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
194b0 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61 64  ld, regYield, ad
194c0 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62 65  drBrk);.    Vdbe
194d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
194e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
194f0 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22   "next row of \"
19500 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d  %s\"", pTabItem-
19510 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
19520 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
19530 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73   OP_Goto;.  }els
19540 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
19550 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
19560 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f  BLE.  if(  (pLoo
19570 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
19580 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
19590 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
195a0 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65  se 1:  The table
195b0 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
195c0 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
195d0 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
195e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
195f0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
19600 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
19610 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
19620 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
19630 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ilter */.    int
19640 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20   addrNotFound;. 
19650 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
19660 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  nt = pLoop->nLTe
19670 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rm;..    sqlite3
19680 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
19690 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20  arse);.    iReg 
196a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
196b0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
196c0 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
196d0 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
196e0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
196f0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
19700 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
19710 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  +){.      int iT
19720 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32  arget = iReg+j+2
19730 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
19740 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
19750 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
19760 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
19770 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
19780 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
19790 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _IN ){.        c
197a0 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
197b0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
197c0 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
197d0 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
197e0 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
197f0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
19800 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19820 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
19830 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
19840 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
19850 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19870 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
19880 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
19890 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
198a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
198b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
198c0 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  er, nConstraint,
198d0 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
198e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
198f0 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
19900 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
19910 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20  d, iReg,.       
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19930 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
19940 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
19950 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
19960 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
19970 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a  e ? P4_MPRINTF :
19980 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
19990 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
199a0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76  ;.    pLoop->u.v
199b0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
199c0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
199d0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20  <nConstraint && 
199e0 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  j<16; j++){.    
199f0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e    if( (pLoop->u.
19a00 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a  vtab.omitMask>>j
19a10 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64  )&1 ){.        d
19a20 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
19a30 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  l, pLoop->aLTerm
19a40 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [j]);.      }.  
19a50 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
19a60 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
19a70 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
19a80 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
19a90 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
19aa0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19ab0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
19ac0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
19ad0 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
19ae0 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
19af0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19b00 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  Pop(pParse);.  }
19b10 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
19b20 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
19b30 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66  ALTABLE */..  if
19b40 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
19b50 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
19b60 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  0.   && (pLoop->
19b70 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
19b80 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
19b90 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a  _COLUMN_EQ))!=0.
19ba0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65    ){.    /* Case
19bb0 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   2:  We can dire
19bc0 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
19bd0 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
19be0 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  g an.    **     
19bf0 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
19c00 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
19c10 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
19c20 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20  .  Or.    **    
19c30 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
19c40 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
19c50 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
19c60 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  IN (...)".    **
19c70 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
19c80 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
19c90 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75  assert( pLoop->u
19ca0 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b  .btree.nEq==1 );
19cb0 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
19cc0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
19cd0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
19ce0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
19cf0 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
19d00 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
19d10 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
19d20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
19d30 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
19d40 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
19d50 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67  .    iReleaseReg
19d60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
19d70 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  m;.    iRowidReg
19d80 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
19d90 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
19da0 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
19db0 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
19dc0 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  ;.    if( iRowid
19dd0 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65 67  Reg!=iReleaseReg
19de0 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
19df0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19e00 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
19e10 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
19e20 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
19e30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19e40 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
19e50 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  Int, iRowidReg, 
19e60 61 64 64 72 4e 78 74 29 3b 20 56 64 62 65 43 6f  addrNxt); VdbeCo
19e70 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
19e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19e90 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
19ea0 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  , iCur, addrNxt,
19eb0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
19ec0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
19ee0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
19ef0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f  ange(pParse, iRo
19f00 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20  widReg, 1);.    
19f10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19f20 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
19f30 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
19f40 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  g);.    VdbeComm
19f50 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
19f60 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
19f70 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73   OP_Noop;.  }els
19f80 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  e if( (pLoop->ws
19f90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
19fa0 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  K)!=0.         &
19fb0 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
19fc0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
19fd0 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a  _RANGE)!=0.  ){.
19fe0 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20      /* Case 3:  
19ff0 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
1a000 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
1a010 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
1a020 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f  ID field..    */
1a030 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20  .    int testOp 
1a040 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69  = OP_Noop;.    i
1a050 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e  nt start;.    in
1a060 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20  t memEndValue = 
1a070 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  0;.    WhereTerm
1a080 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b   *pStart, *pEnd;
1a090 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ..    assert( om
1a0a0 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
1a0b0 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74    j = 0;.    pSt
1a0c0 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a  art = pEnd = 0;.
1a0d0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1a0e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
1a0f0 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72  TM_LIMIT ) pStar
1a100 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  t = pLoop->aLTer
1a110 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20  m[j++];.    if( 
1a120 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1a130 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1a140 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d   ) pEnd = pLoop-
1a150 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1a160 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
1a170 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29  !=0 || pEnd!=0 )
1a180 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29  ;.    if( bRev )
1a190 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
1a1a0 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53  pStart;.      pS
1a1b0 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
1a1c0 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
1a1d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a1e0 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
1a1f0 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
1a200 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
1a210 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
1a220 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
1a230 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
1a240 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
1a250 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
1a260 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
1a270 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
1a280 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
1a290 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61  following consta
1a2a0 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f  nt maps TK_xx co
1a2b0 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70  des into corresp
1a2c0 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  onding .      **
1a2d0 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20   seek opcodes.  
1a2e0 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20  It depends on a 
1a2f0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
1a300 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20  ing of TK_xx.   
1a310 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
1a320 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d  t u8 aMoveOp[] =
1a330 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {.           /*
1a340 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_GT */  OP_Se
1a350 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  ekGT,.          
1a360 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50   /* TK_LE */  OP
1a370 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20  _SeekLE,.       
1a380 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20      /* TK_LT */ 
1a390 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20   OP_SeekLT,.    
1a3a0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20         /* TK_GE 
1a3b0 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20  */  OP_SeekGE.  
1a3c0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73      };.      ass
1a3d0 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47  ert( TK_LE==TK_G
1a3e0 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d  T+1 );      /* M
1a3f0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64  ake sure the ord
1a400 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20  ering.. */.     
1a410 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
1a420 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
1a430 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
1a440 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
1a450 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1a460 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29  TK_GE==TK_GT+3 )
1a470 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69  ;      /*  ... i
1a480 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a  s correcct. */..
1a490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1a4a0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1a4b0 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
1a4c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a4d0 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  e( pStart->wtFla
1a4e0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1a4f0 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d 20  L );.      pX = 
1a500 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
1a510 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1a520 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1a530 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c 65  case( pStart->le
1a540 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
1a550 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65 20  ; /* transitive 
1a560 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1a570 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1a580 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1a590 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
1a5a0 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20  , &rTemp);.     
1a5b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a5c0 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58  p3(v, aMoveOp[pX
1a5d0 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75  ->op-TK_GT], iCu
1a5e0 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b  r, addrBrk, r1);
1a5f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1a600 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
1a610 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1a620 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
1a630 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_GT);.      Vdb
1a640 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
1a650 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20  X->op==TK_LE);. 
1a660 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1a670 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
1a680 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_LT);.      Vdb
1a690 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
1a6a0 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20  X->op==TK_GE);. 
1a6b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a6c0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1a6d0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
1a6e0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1a6f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1a700 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a  pParse, rTemp);.
1a710 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
1a720 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74  m(pLevel, pStart
1a730 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1a740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a750 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20  ddOp2(v, bRev ? 
1a760 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77  OP_Last : OP_Rew
1a770 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ind, iCur, addrB
1a780 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rk);.      VdbeC
1a790 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
1a7a0 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62  v==0);.      Vdb
1a7b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1a7c0 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20  Rev!=0);.    }. 
1a7d0 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
1a7e0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
1a7f0 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
1a800 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1a810 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1a820 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 6e      assert( (pEn
1a830 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1a840 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
1a850 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1a860 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  End->leftCursor!
1a870 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e  =iCur ); /* Tran
1a880 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
1a890 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
1a8a0 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
1a8b0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1a8c0 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45  AL );.      memE
1a8d0 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
1a8e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1a8f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1a900 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1a910 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
1a920 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
1a930 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
1a940 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
1a950 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1a960 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
1a970 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
1a980 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1a990 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
1a9a0 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
1a9b0 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1a9c0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
1a9d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
1a9e0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1a9f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1aa00 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1aa10 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1aa20 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
1aa30 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1aa40 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1aa50 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73  = start;.    ass
1aa60 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
1aa70 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65  =0 );.    if( te
1aa80 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
1aa90 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1aaa0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1aab0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1aac0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1aad0 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
1aae0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1aaf0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ab00 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1ab10 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1ab20 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1ab30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
1ab40 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
1ab50 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
1ab60 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 56  widReg);.      V
1ab70 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ab80 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b   testOp==OP_Le);
1ab90 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1aba0 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
1abb0 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56  =OP_Lt);.      V
1abc0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1abd0 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b   testOp==OP_Ge);
1abe0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1abf0 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
1ac00 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 73  =OP_Gt);.      s
1ac10 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1ac20 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
1ac30 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
1ac40 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1ac50 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1ac60 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1ac70 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
1ac80 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34  ){.    /* Case 4
1ac90 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61  : A scan using a
1aca0 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
1acb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1acc0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1acd0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
1ace0 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
1acf0 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1ad00 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
1ad10 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
1ad20 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
1ad30 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20  he N.    **     
1ad40 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f      left-most co
1ad50 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
1ad60 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20  ex. It may also 
1ad70 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20  contain.    **  
1ad80 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
1ad90 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
1ada0 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
1adb0 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
1adc0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
1add0 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
1ade0 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
1adf0 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
1ae00 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  nly .    **     
1ae10 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f      the right-mo
1ae20 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
1ae30 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
1ae40 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
1ae50 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73     **         us
1ae60 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22  e the "==" and "
1ae70 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  IN" operators. F
1ae80 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1ae90 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  he .    **      
1aea0 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28     index is on (
1aeb0 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65  x,y,z), then the
1aec0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73   following claus
1aed0 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20  es are all .    
1aee0 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
1aef0 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ized:.    **.   
1af00 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1af10 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  =5.    **       
1af20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
1af30 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1af40 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
1af50 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1af60 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41     x=5 AND y>5 A
1af70 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
1af80 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1af90 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a  D y=5 AND z<=10.
1afa0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1afb0 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
1afc0 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
1afd0 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
1afe0 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  sed, only.    **
1aff0 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
1b000 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20   term:.    **.  
1b010 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1b020 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
1b030 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1b040 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f     N may be zero
1b050 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
1b060 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1b070 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ints..    **    
1b080 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72       If there ar
1b090 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20  e no inequality 
1b0a0 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1b0b0 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a  n N is at.    **
1b0c0 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f           least o
1b0d0 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
1b0e0 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
1b0f0 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
1b100 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
1b110 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
1b120 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1b130 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
1b140 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
1b150 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
1b160 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  rder.    **     
1b170 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
1b180 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
1b190 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
1b1a0 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20  RDER BY..    */ 
1b1b0 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e   .    static con
1b1c0 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d  st u8 aStartOp[]
1b1d0 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
1b1e0 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
1b1f0 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
1b200 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
1b210 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1b220 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
1b230 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
1b240 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1b250 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
1b260 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1b270 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
1b280 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1b290 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  GT,           /*
1b2a0 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
1b2b0 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1b2c0 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
1b2d0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54  .      OP_SeekLT
1b2e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
1b2f0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1b300 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1b310 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
1b320 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20       OP_SeekGE, 
1b330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
1b340 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1b350 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1b360 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1b370 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20     OP_SeekLE    
1b380 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
1b390 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1b3a0 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1b3b0 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
1b3c0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1b3d0 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d  st u8 aEndOp[] =
1b3e0 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47   {.      OP_IdxG
1b3f0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1b400 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   0: (end_constra
1b410 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26 26  ints && !bRev &&
1b420 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20   !endEq) */.    
1b430 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20 20    OP_IdxGT,     
1b440 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
1b450 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1b460 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45 71   !bRev &&  endEq
1b470 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1b480 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xLE,            
1b490 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
1b4a0 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76 20  raints &&  bRev 
1b4b0 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20  && !endEq) */.  
1b4c0 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20      OP_IdxLT,   
1b4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
1b4e0 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
1b4f0 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e 64  &&  bRev &&  end
1b500 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  Eq) */.    };.  
1b510 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f    u16 nEq = pLoo
1b520 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
1b530 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b540 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
1b550 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61  */.    int regBa
1b560 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1b570 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1b580 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ster holding con
1b590 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a  straint values *
1b5a0 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
1b5b0 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30  *pRangeStart = 0
1b5c0 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79  ;  /* Inequality
1b5d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
1b5e0 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20  ange start */.  
1b5f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
1b600 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f  ngeEnd = 0;    /
1b610 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
1b620 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
1b630 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
1b640 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
1b650 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1b660 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
1b670 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
1b680 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64  = */.    int end
1b690 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1b6a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1b6b0 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20   range end uses 
1b6c0 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
1b6d0 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f      int start_co
1b6e0 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20  nstraints;      
1b6f0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e   /* Start of ran
1b700 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  ge is constraine
1b710 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  d */.    int nCo
1b720 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20  nstraint;       
1b730 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b740 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  of constraint te
1b750 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  rms */.    Index
1b760 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1b770 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1b780 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
1b790 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
1b7a0 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
1b7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b7c0 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1b7d0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
1b7e0 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
1b7f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1b800 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
1b810 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
1b820 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
1b830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b840 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
1b850 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ction opcode */.
1b860 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74      char *zStart
1b870 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
1b880 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
1b890 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   start of range 
1b8a0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
1b8b0 20 20 63 68 61 72 20 63 45 6e 64 41 66 66 20 3d    char cEndAff =
1b8c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
1b8d0 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65  * Affinity for e
1b8e0 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  nd of range cons
1b8f0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38  traint */.    u8
1b900 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
1b910 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1b920 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74 20  ue to seek past 
1b930 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f  initial nulls */
1b940 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74 4e  .    u8 bStopAtN
1b950 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ull = 0;        
1b960 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74 69    /* Add conditi
1b970 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  on to terminate 
1b980 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20  at NULLs */..   
1b990 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
1b9a0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1b9b0 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
1b9c0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
1b9d0 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 70    assert( nEq>=p
1b9e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  Loop->u.btree.nS
1b9f0 6b 69 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  kip );..    /* I
1ba00 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69  f this loop sati
1ba10 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64  sfies a sort ord
1ba20 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65  er (pOrderBy) re
1ba30 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20  quest that .    
1ba40 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  ** was passed to
1ba50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
1ba60 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53  o implement a "S
1ba70 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e  ELECT min(x) ...
1ba80 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c  " .    ** query,
1ba90 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
1baa0 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77   will only allow
1bab0 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e   the loop to run
1bac0 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69   for.    ** a si
1bad0 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20  ngle iteration. 
1bae0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1baf0 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65  the first row re
1bb00 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68  turned.    ** sh
1bb10 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20  ould not have a 
1bb20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65  NULL value store
1bb30 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c  d in 'x'. If col
1bb40 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a  umn 'x' is.    *
1bb50 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20  * the first one 
1bb60 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71  after the nEq eq
1bb70 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1bb80 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ts in the index,
1bb90 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71  .    ** this req
1bba0 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69  uires some speci
1bbb0 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
1bbc0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1bbd0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
1bbe0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
1bbf0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
1bc00 2d 3e 6e 45 78 70 72 3d 3d 31 0a 20 20 20 20 20  ->nExpr==1.     
1bc10 20 20 20 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e      || (pWInfo->
1bc20 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
1bc30 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30  _ORDERBY_MIN)==0
1bc40 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 57 49   );.    if( (pWI
1bc50 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
1bc60 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1bc70 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70 57  N)!=0.     && pW
1bc80 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 0a 20  Info->nOBSat>0. 
1bc90 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b      && (pIdx->nK
1bca0 65 79 43 6f 6c 3e 6e 45 71 29 0a 20 20 20 20 29  eyCol>nEq).    )
1bcb0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bcc0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1bcd0 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Skip==0 );.     
1bce0 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
1bcf0 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   1;.      nExtra
1bd00 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
1bd10 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20      /* Find any 
1bd20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1bd30 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  raint terms for 
1bd40 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
1bd50 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
1bd60 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a   range. .    */.
1bd70 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20      j = nEq;.   
1bd80 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1bd90 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1bda0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1bdb0 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f  RangeStart = pLo
1bdc0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1bdd0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1bde0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1bdf0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1be00 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
1be10 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
1be20 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d  angeEnd = pLoop-
1be30 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1be40 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1be50 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 61  1;.      if( pRa
1be60 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20 20 20 20  ngeStart==0.    
1be70 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64 78 2d     && (j = pIdx-
1be80 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3e  >aiColumn[nEq])>
1be90 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 49  =0 .       && pI
1bea0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
1beb0 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  [j].notNull==0. 
1bec0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1bed0 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20  bSeekPastNull = 
1bee0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1bef0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61  .    assert( pRa
1bf00 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70 52  ngeEnd==0 || (pR
1bf10 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
1bf20 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
1bf30 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  0 );..    /* Gen
1bf40 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
1bf50 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
1bf60 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
1bf70 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a  g == or IN.    *
1bf80 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
1bf90 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
1bfa0 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61  terms in an arra
1bfb0 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  y of registers. 
1bfc0 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
1bfd0 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a  t regBase..    *
1bfe0 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  /.    regBase = 
1bff0 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
1c000 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76  erms(pParse,pLev
1c010 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65  el,bRev,nExtraRe
1c020 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  g,&zStartAff);. 
1c030 20 20 20 61 73 73 65 72 74 28 20 7a 53 74 61 72     assert( zStar
1c040 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  tAff==0 || sqlit
1c050 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 61 72  e3Strlen30(zStar
1c060 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20  tAff)>=nEq );.  
1c070 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20    if( zStartAff 
1c080 29 20 63 45 6e 64 41 66 66 20 3d 20 7a 53 74 61  ) cEndAff = zSta
1c090 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20 20  rtAff[nEq];.    
1c0a0 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
1c0b0 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
1c0c0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1c0d0 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
1c0e0 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
1c0f0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
1c100 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61  r.    ** a forwa
1c110 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  rd order scan on
1c120 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
1c130 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65  dex, interchange
1c140 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
1c150 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
1c160 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
1c170 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
1c180 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45    */.    if( (nE
1c190 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  q<pIdx->nKeyCol 
1c1a0 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e  && bRev==(pIdx->
1c1b0 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
1c1c0 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29  =SQLITE_SO_ASC))
1c1d0 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26  .     || (bRev &
1c1e0 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d  & pIdx->nKeyCol=
1c1f0 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  =nEq).    ){.   
1c200 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
1c210 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20  m *, pRangeEnd, 
1c220 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
1c230 20 20 20 20 53 57 41 50 28 75 38 2c 20 62 53 65      SWAP(u8, bSe
1c240 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74 6f  ekPastNull, bSto
1c250 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  pAtNull);.    }.
1c260 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1c270 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
1c280 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1c290 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
1c2a0 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1c2b0 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
1c2c0 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  & (pRangeStart->
1c2d0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
1c2e0 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
1c2f0 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
1c300 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
1c310 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
1c320 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
1c330 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
1c340 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
1c350 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
1c360 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61  E)!=0 );.    sta
1c370 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74  rtEq = !pRangeSt
1c380 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61  art || pRangeSta
1c390 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1c3a0 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
1c3b0 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52     endEq =   !pR
1c3c0 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67  angeEnd || pRang
1c3d0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1c3e0 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
1c3f0 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74  .    start_const
1c400 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53  raints = pRangeS
1c410 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a  tart || nEq>0;..
1c420 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
1c430 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20  index cursor to 
1c440 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1c450 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e   range. */.    n
1c460 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
1c470 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
1c480 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
1c490 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
1c4a0 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
1c4b0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1c4c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1c4d0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
1c4e0 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
1c4f0 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53      if( (pRangeS
1c500 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1c510 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20  TERM_VNULL)==0. 
1c520 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1c530 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52  ExprCanBeNull(pR
1c540 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  ight).      ){. 
1c550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c560 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1c570 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
1c580 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
1c590 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1c5a0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
1c5b0 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41       if( zStartA
1c5c0 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
1c5d0 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
1c5e0 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
1c5f0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
1c600 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
1c610 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
1c620 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
1c630 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
1c640 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
1c650 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
1c660 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
1c670 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
1c680 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
1c690 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
1c6a0 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
1c6b0 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
1c6c0 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
1c6d0 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
1c6e0 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
1c6f0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
1c700 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
1c710 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
1c720 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
1c730 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
1c740 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
1c750 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
1c760 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
1c770 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
1c780 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
1c790 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1c7a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c7b0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
1c7c0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1c7d0 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  UAL );.    }else
1c7e0 20 69 66 28 20 62 53 65 65 6b 50 61 73 74 4e 75   if( bSeekPastNu
1c7f0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
1c800 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c810 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
1c820 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
1c830 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1c840 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20        startEq = 
1c850 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63  0;.      start_c
1c860 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a  onstraints = 1;.
1c870 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70      }.    codeAp
1c880 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
1c890 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
1c8a0 6e 73 74 72 61 69 6e 74 20 2d 20 62 53 65 65 6b  nstraint - bSeek
1c8b0 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72 74  PastNull, zStart
1c8c0 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61  Aff);.    op = a
1c8d0 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63  StartOp[(start_c
1c8e0 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b  onstraints<<2) +
1c8f0 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20   (startEq<<1) + 
1c900 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72  bRev];.    asser
1c910 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20  t( op!=0 );.    
1c920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c930 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
1c940 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
1c950 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1c960 6e 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  nt);.    VdbeCov
1c970 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
1c980 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1c990 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20  op==OP_Rewind); 
1c9a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1c9b0 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20  P_Rewind );.    
1c9c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1c9d0 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20  , op==OP_Last); 
1c9e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1c9f0 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
1ca00 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ca10 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29  , op==OP_SeekGT)
1ca20 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1ca30 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20  =OP_SeekGT );.  
1ca40 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1ca50 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  (v, op==OP_SeekG
1ca60 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  E);  testcase( o
1ca70 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a  p==OP_SeekGE );.
1ca80 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ca90 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
1caa0 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65 28  kLE);  testcase(
1cab0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29   op==OP_SeekLE )
1cac0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1cad0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
1cae0 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61 73  eekLT);  testcas
1caf0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54  e( op==OP_SeekLT
1cb00 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64   );..    /* Load
1cb10 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
1cb20 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
1cb30 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20  nstraint at the 
1cb40 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
1cb50 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29  * range (if any)
1cb60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ..    */.    nCo
1cb70 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
1cb80 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
1cb90 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  d ){.      Expr 
1cba0 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
1cbb0 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
1cbc0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
1cbd0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1cbe0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
1cbf0 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  +nEq, 1);.      
1cc00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1cc10 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
1cc20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
1cc30 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45      if( (pRangeE
1cc40 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1cc50 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20  RM_VNULL)==0.   
1cc60 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
1cc70 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67  prCanBeNull(pRig
1cc80 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ht).      ){.   
1cc90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cca0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
1ccb0 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ull, regBase+nEq
1ccc0 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
1ccd0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1cce0 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
1ccf0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1cd00 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
1cd10 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 21 3d  ight, cEndAff)!=
1cd20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
1cd30 20 20 20 20 20 20 20 26 26 20 21 73 71 6c 69 74         && !sqlit
1cd40 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
1cd50 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
1cd60 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20 20 20  ht, cEndAff).   
1cd70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f     ){.        co
1cd80 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1cd90 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
1cda0 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41 66 66  nEq, 1, &cEndAff
1cdb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1cdc0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1cdd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cde0 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
1cdf0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1ce00 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  L );.    }else i
1ce10 66 28 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 29  f( bStopAtNull )
1ce20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1ce30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ce40 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65  Null, 0, regBase
1ce50 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 65 6e 64  +nEq);.      end
1ce60 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43  Eq = 0;.      nC
1ce70 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
1ce80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
1ce90 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41  Free(db, zStartA
1cea0 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70  ff);..    /* Top
1ceb0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64   of the loop bod
1cec0 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d  y */.    pLevel-
1ced0 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
1cee0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1cef0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
1cf00 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  f the index curs
1cf10 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65  or is past the e
1cf20 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  nd of the range.
1cf30 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f 6e   */.    if( nCon
1cf40 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20  straint ){.     
1cf50 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52 65   op = aEndOp[bRe
1cf60 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20 20  v*2 + endEq];.  
1cf70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cf80 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
1cf90 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
1cfa0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1cfb0 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 74  traint);.      t
1cfc0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1cfd0 49 64 78 47 54 20 29 3b 20 20 56 64 62 65 43 6f  IdxGT );  VdbeCo
1cfe0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1cff0 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20  OP_IdxGT );.    
1d000 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1d010 4f 50 5f 49 64 78 47 45 20 29 3b 20 20 56 64 62  OP_IdxGE );  Vdb
1d020 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1d030 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  p==OP_IdxGE );. 
1d040 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1d050 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20 20  p==OP_IdxLT );  
1d060 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d070 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  , op==OP_IdxLT )
1d080 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d090 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29  ( op==OP_IdxLE )
1d0a0 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
1d0b0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  f(v, op==OP_IdxL
1d0c0 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  E );.    }..    
1d0d0 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c  /* Seek the tabl
1d0e0 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71  e cursor, if req
1d0f0 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73  uired */.    dis
1d100 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1d110 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
1d120 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1d130 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
1d140 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d 69 74 54  );.    if( omitT
1d150 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  able ){.      /*
1d160 20 70 49 64 78 20 69 73 20 61 20 63 6f 76 65 72   pIdx is a cover
1d170 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e  ing index.  No n
1d180 65 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  eed to access th
1d190 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f  e main table. */
1d1a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 48  .    }else if( H
1d1b0 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54  asRowid(pIdx->pT
1d1c0 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 69  able) ){.      i
1d1d0 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61  RowidReg = ++pPa
1d1e0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1d1f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d200 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  p2(v, OP_IdxRowi
1d210 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77  d, iIdxCur, iRow
1d220 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1d230 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1d240 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1d250 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1d260 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d270 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d280 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77  Seek, iCur, iRow
1d290 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65  idReg);  /* Defe
1d2a0 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20  rred seek */.   
1d2b0 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75 72 21   }else if( iCur!
1d2c0 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20 20 20  =iIdxCur ){.    
1d2d0 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
1d2e0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1d2f0 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62  Index(pIdx->pTab
1d300 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69  le);.      iRowi
1d310 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  dReg = sqlite3Ge
1d320 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1d330 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29  e, pPk->nKeyCol)
1d340 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1d350 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   j<pPk->nKeyCol;
1d360 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b   j++){.        k
1d370 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
1d380 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50  OfIndex(pIdx, pP
1d390 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b  k->aiColumn[j]);
1d3a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d3b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1d3c0 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
1d3d0 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a  , k, iRowidReg+j
1d3e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d3f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d400 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
1d410 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  ound, iCur, addr
1d420 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cont,.          
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d440 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d   iRowidReg, pPk-
1d450 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43  >nKeyCol); VdbeC
1d460 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1d470 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  }..    /* Record
1d480 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1d490 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61   used to termina
1d4a0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73  te the loop. Dis
1d4b0 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45  able .    ** WHE
1d4c0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
1d4d0 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62  made redundant b
1d4e0 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67  y the index rang
1d4f0 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  e scan..    */. 
1d500 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1d510 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
1d520 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c  EROW ){.      pL
1d530 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
1d540 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  op;.    }else if
1d550 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
1d560 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1d570 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Prev;.    }else{
1d580 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
1d590 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
1d5a0 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70   }.    pLevel->p
1d5b0 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
1d5c0 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28 70   pLevel->p3 = (p
1d5d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1d5e0 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29 21  ERE_UNQ_WANTED)!
1d5f0 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69 66  =0 ? 1:0;.    if
1d600 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1d610 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
1d620 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AINT)==0 ){.    
1d630 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
1d640 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
1d650 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
1d660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d670 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
1d680 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  >p5==0 );.    }.
1d690 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
1d6a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
1d6b0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
1d6c0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1d6d0 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
1d6e0 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  OR ){.    /* Cas
1d6f0 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72  e 5:  Two or mor
1d700 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64  e separately ind
1d710 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
1d720 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a  cted by OR.    *
1d730 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
1d740 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1d750 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1d760 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20  1(a,b,c,d);.    
1d770 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
1d780 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20  X i1 ON t1(a);. 
1d790 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
1d7a0 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29  NDEX i2 ON t1(b)
1d7b0 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
1d7c0 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31  E INDEX i3 ON t1
1d7d0 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  (c);.    **.    
1d7e0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
1d7f0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20  OM t1 WHERE a=5 
1d800 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20  OR b=7 OR (c=11 
1d810 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a  AND d=13).    **
1d820 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65  .    ** In the e
1d830 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72  xample, there ar
1d840 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20  e three indexed 
1d850 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
1d860 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68  by OR..    ** Th
1d870 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
1d880 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  p looks like thi
1d890 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1d8a0 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
1d8b0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
1d8c0 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
1d8d0 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
1d8e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1d8f0 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e  hen, for each in
1d900 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20  dexed term, the 
1d910 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61  following. The a
1d920 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20  rguments to.    
1d930 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72  ** RowSetTest ar
1d940 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  e such that the 
1d950 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72  rowid of the cur
1d960 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65  rent row is inse
1d970 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  rted.    ** into
1d980 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20   the RowSet. If 
1d990 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  it is already pr
1d9a0 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73  esent, control s
1d9b0 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  kips the.    ** 
1d9c0 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64  Gosub opcode and
1d9d0 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20   jumps straight 
1d9e0 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
1d9f0 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e  rated by WhereEn
1da00 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  d()..    **.    
1da10 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
1da20 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72  3WhereBegin(<ter
1da30 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  m>).    **      
1da40 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20      RowSetTest  
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69  # Insert rowid i
1da70 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a  nto rowset.    *
1da80 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  *          Gosub
1da90 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a        2 A.    **
1daa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1dab0 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a  hereEnd().    **
1dac0 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e  .    ** Followin
1dad0 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64  g the above, cod
1dae0 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  e to terminate t
1daf0 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41  he loop. Label A
1db00 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20  , the target.   
1db10 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62   ** of the Gosub
1db20 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f   above, jumps to
1db30 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1db40 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
1db50 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20   Goto..    **.  
1db60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
1db70 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
1db80 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
1db90 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
1dba0 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  eg 1.    **     
1dbb0 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20       Goto       
1dbc0 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
1dbd0 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66   # The loop is f
1dbe0 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a  inished..    **.
1dbf0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20      **       A: 
1dc00 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20  <loop body>     
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65              # Re
1dc20 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65  turn data, whate
1dc30 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ver..    **.    
1dc40 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75  **          Retu
1dc50 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20  rn     2        
1dc60 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62          # Jump b
1dc70 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62  ack to the Gosub
1dc80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1dc90 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74       B: <after t
1dca0 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a  he loop>.    **.
1dcb0 20 20 20 20 2a 2a 20 41 64 64 65 64 20 32 30 31      ** Added 201
1dcc0 34 2d 30 35 2d 32 36 3a 20 49 66 20 74 68 65 20  4-05-26: If the 
1dcd0 74 61 62 6c 65 20 69 73 20 61 20 57 49 54 48 4f  table is a WITHO
1dce0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20  UT ROWID table, 
1dcf0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65 20  then.    ** use 
1dd00 61 6e 20 65 70 68 65 72 6d 65 72 61 6c 20 69 6e  an ephermeral in
1dd10 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 61  dex instead of a
1dd20 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63 6f 72   RowSet to recor
1dd30 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20 20  d the primary.  
1dd40 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68 65    ** keys of the
1dd50 20 72 6f 77 73 20 77 65 20 68 61 76 65 20 61 6c   rows we have al
1dd60 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20 20 20  ready seen..    
1dd70 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
1dd80 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
1dd90 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
1dda0 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
1ddb0 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1ddc0 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
1ddd0 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
1dde0 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
1ddf0 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
1de00 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
1de10 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20      Index *pCov 
1de20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1de30 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f   /* Potential co
1de40 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72  vering index (or
1de50 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e   NULL) */.    in
1de60 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72  t iCovCur = pPar
1de70 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20  se->nTab++;  /* 
1de80 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  Cursor used for 
1de90 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20  index scans (if 
1dea0 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  any) */..    int
1deb0 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
1dec0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
1ded0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1dee0 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
1def0 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
1df00 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1df30 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
1df40 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
1df50 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1df80 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
1df90 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
1dfa0 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
1dfb0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
1dfc0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
1dfd0 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
1dfe0 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1e010 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
1e020 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
1e030 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
1e040 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1e050 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
1e060 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
1e070 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
1e080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e0a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1e0b0 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
1e0c0 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
1e0d0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
1e0e0 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
1e0f0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61  ession */.    Ta
1e100 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
1e110 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 0a  Item->pTab;.   .
1e120 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1e130 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
1e140 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1e150 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1e160 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1e170 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20  or & WO_OR );.  
1e180 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
1e190 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1e1a0 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20  _ORINFO)!=0 );. 
1e1b0 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72     pOrWc = &pTer
1e1c0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
1e1d0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1e1e0 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20   = OP_Return;.  
1e1f0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72    pLevel->p1 = r
1e200 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f  egReturn;..    /
1e210 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53  * Set up a new S
1e220 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62  rcList in pOrTab
1e230 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1e240 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e  table being scan
1e250 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ned.    ** by th
1e260 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61  is loop in the a
1e270 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c  [0] slot and all
1e280 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
1e290 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73   in a[1..] slots
1e2a0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65  ..    ** This be
1e2b0 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73  comes the SrcLis
1e2c0 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  t in the recursi
1e2d0 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ve call to sqlit
1e2e0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
1e2f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1e300 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
1e310 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  ){.      int nNo
1e320 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
1e330 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1e340 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64  umber of notRead
1e350 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  y tables */.    
1e360 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1e370 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20  _item *origSrc; 
1e380 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
1e390 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  list of tables *
1e3a0 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64  /.      nNotRead
1e3b0 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  y = pWInfo->nLev
1e3c0 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b  el - iLevel - 1;
1e3d0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
1e3e0 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f  sqlite3StackAllo
1e3f0 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20 20  cRaw(db,.       
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e410 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72       sizeof(*pOr
1e420 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a  Tab)+ nNotReady*
1e430 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
1e440 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
1e450 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74   pOrTab==0 ) ret
1e460 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20  urn notReady;.  
1e470 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c      pOrTab->nAll
1e480 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65  oc = (u8)(nNotRe
1e490 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ady + 1);.      
1e4a0 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70  pOrTab->nSrc = p
1e4b0 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20  OrTab->nAlloc;. 
1e4c0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54       memcpy(pOrT
1e4d0 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c  ab->a, pTabItem,
1e4e0 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65   sizeof(*pTabIte
1e4f0 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53  m));.      origS
1e500 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  rc = pWInfo->pTa
1e510 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  bList->a;.      
1e520 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74  for(k=1; k<=nNot
1e530 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  Ready; k++){.   
1e540 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72       memcpy(&pOr
1e550 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67  Tab->a[k], &orig
1e560 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46  Src[pLevel[k].iF
1e570 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72  rom], sizeof(pOr
1e580 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20  Tab->a[k]));.   
1e590 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1e5a0 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70        pOrTab = p
1e5b0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
1e5c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1e5d0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f  nitialize the ro
1e5e0 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f  wset register to
1e5f0 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41   contain NULL. A
1e600 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20  n SQL NULL is . 
1e610 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74     ** equivalent
1e620 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77   to an empty row
1e630 73 65 74 2e 20 20 4f 72 2c 20 63 72 65 61 74 65  set.  Or, create
1e640 20 61 6e 20 65 70 68 65 72 6d 65 72 61 6c 20 69   an ephermeral i
1e650 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 70 61  ndex.    ** capa
1e660 62 6c 65 20 6f 66 20 68 6f 6c 64 69 6e 67 20 70  ble of holding p
1e670 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74  rimary keys in t
1e680 68 65 20 63 61 73 65 20 6f 66 20 61 20 57 49 54  he case of a WIT
1e690 48 4f 55 54 20 52 4f 57 49 44 2e 0a 20 20 20 20  HOUT ROWID..    
1e6a0 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69  **.    ** Also i
1e6b0 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74  nitialize regRet
1e6c0 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  urn to contain t
1e6d0 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
1e6e0 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20  e instruction . 
1e6f0 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
1e700 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
1e710 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65  OP_Return at the
1e720 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
1e730 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  oop. This.    **
1e740 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
1e750 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45  a few obscure LE
1e760 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68  FT JOIN cases wh
1e770 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70  ere control jump
1e780 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68  s.    ** over th
1e790 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
1e7a0 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  p into the body 
1e7b0 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63  of it. In this c
1e7c0 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
1e7d0 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65  correct response
1e7e0 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d   for the end-of-
1e7f0 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f  loop code (the O
1e800 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20  P_Return) is to 
1e810 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72  .    ** fall thr
1e820 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
1e830 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75   instruction, ju
1e840 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74  st as an OP_Next
1e850 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20   does if.    ** 
1e860 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69  called on an uni
1e870 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f  nitialized curso
1e880 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
1e890 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
1e8a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
1e8b0 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
1e8c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  ){.      if( Has
1e8d0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
1e8e0 20 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74         regRowset
1e8f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1e900 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
1e910 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e920 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52  OP_Null, 0, regR
1e930 6f 77 73 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  owset);.      }e
1e940 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 49 6e 64  lse{.        Ind
1e950 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
1e960 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
1e970 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
1e980 72 65 67 52 6f 77 73 65 74 20 3d 20 70 50 61 72  regRowset = pPar
1e990 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1e9a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e9b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
1e9c0 45 70 68 65 6d 65 72 61 6c 2c 20 72 65 67 52 6f  Ephemeral, regRo
1e9d0 77 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43  wset, pPk->nKeyC
1e9e0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
1e9f0 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
1ea00 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 50 6b  Info(pParse, pPk
1ea10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ea20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
1ea30 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1ea40 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d  }.    iRetInit =
1ea50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ea60 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1ea70 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  , 0, regReturn);
1ea80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1ea90 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
1eaa0 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68  lause is z of th
1eab0 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20  e form:  (x1 OR 
1eac0 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79  x2 OR ...) AND y
1ead0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72  .    ** Then for
1eae0 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20   every term xN, 
1eaf0 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20  evaluate as the 
1eb00 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78  subexpression: x
1eb10 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54  N AND z.    ** T
1eb20 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69  hat way, terms i
1eb30 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63  n y that are fac
1eb40 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64  tored into the d
1eb50 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a  isjunction will.
1eb60 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64      ** be picked
1eb70 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72   up by the recur
1eb80 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71  sive calls to sq
1eb90 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1eba0 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a  ) below..    **.
1ebb0 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c      ** Actually,
1ebc0 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
1ebd0 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64  ion is converted
1ebe0 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77   to "xN AND w" w
1ebf0 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a  here w is.    **
1ec00 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e   the "interestin
1ec10 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20  g" terms of z - 
1ec20 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e  terms that did n
1ec30 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
1ec40 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72  the.    ** ON or
1ec50 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1ec60 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e   a LEFT JOIN, an
1ec70 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  d terms that are
1ec80 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20   usable as .    
1ec90 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  ** indices..    
1eca0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f  **.    ** This o
1ecb0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f  ptimization also
1ecc0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66   only applies if
1ecd0 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f   the (x1 OR x2 O
1ece0 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20  R ...) term.    
1ecf0 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1ed00 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  ned in the ON cl
1ed10 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
1ed20 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  OIN..    ** See 
1ed30 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77  ticket http://ww
1ed40 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
1ed50 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34  /info/f2369304e4
1ed60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ed70 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a  pWC->nTerm>1 ){.
1ed80 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b        int iTerm;
1ed90 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d  .      for(iTerm
1eda0 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e  =0; iTerm<pWC->n
1edb0 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a  Term; iTerm++){.
1edc0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
1edd0 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65  xpr = pWC->a[iTe
1ede0 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm].pExpr;.     
1edf0 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69     if( &pWC->a[i
1ee00 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29  Term] == pTerm )
1ee10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1ee20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1ee30 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ee40 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e  _FromJoin) ) con
1ee50 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74  tinue;.        t
1ee60 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b  estcase( pWC->a[
1ee70 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
1ee80 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b 0a   TERM_ORINFO );.
1ee90 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1eea0 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
1eeb0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1eec0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
1eed0 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65    if( pWC->a[iTe
1eee0 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54  rm].wtFlags & (T
1eef0 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f  ERM_ORINFO|TERM_
1ef00 56 49 52 54 55 41 4c 29 20 29 20 63 6f 6e 74 69  VIRTUAL) ) conti
1ef10 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1ef20 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e   (pWC->a[iTerm].
1ef30 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
1ef40 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  LL)==0 ) continu
1ef50 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  e;.        pExpr
1ef60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1ef70 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
1ef80 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
1ef90 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
1efa0 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c  nd(db, pAndExpr,
1efb0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d   pExpr);.      }
1efc0 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45  .      if( pAndE
1efd0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
1efe0 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
1eff0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1f000 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78  K_AND, 0, pAndEx
1f010 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  pr, 0);.      }.
1f020 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75      }..    /* Ru
1f030 6e 20 61 20 73 65 70 61 72 61 74 65 20 57 48 45  n a separate WHE
1f040 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
1f050 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ch term of the O
1f060 52 20 63 6c 61 75 73 65 2e 20 20 41 66 74 65 72  R clause.  After
1f070 0a 20 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61 74  .    ** eliminat
1f080 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 20 66  ing duplicates f
1f090 72 6f 6d 20 6f 74 68 65 72 20 57 48 45 52 45 20  rom other WHERE 
1f0a0 63 6c 61 75 73 65 73 2c 20 74 68 65 20 61 63 74  clauses, the act
1f0b0 69 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20 20 20  ion for each.   
1f0c0 20 2a 2a 20 73 75 62 2d 57 48 45 52 45 20 63 6c   ** sub-WHERE cl
1f0d0 61 75 73 65 20 69 73 20 74 6f 20 74 6f 20 69 6e  ause is to to in
1f0e0 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f  voke the main lo
1f0f0 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62  op body as a sub
1f100 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
1f110 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1f120 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69  <pOrWc->nTerm; i
1f130 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72  i++){.      Wher
1f140 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d  eTerm *pOrTerm =
1f150 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a   &pOrWc->a[ii];.
1f160 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
1f170 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
1f180 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d  Cur || (pOrTerm-
1f190 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1f1a0 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
1f1b0 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53     WhereInfo *pS
1f1c0 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  ubWInfo;        
1f1d0 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73     /* Info for s
1f1e0 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63  ingle OR-term sc
1f1f0 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  an */.        Ex
1f200 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f  pr *pOrExpr = pO
1f210 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a  rTerm->pExpr; /*
1f220 20 43 75 72 72 65 6e 74 20 4f 52 20 63 6c 61 75   Current OR clau
1f230 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20  se term */.     
1f240 20 20 20 69 6e 74 20 6a 31 20 3d 20 30 3b 20 20     int j1 = 0;  
1f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f260 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1f270 20 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e 20   jump operation 
1f280 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1f290 41 6e 64 45 78 70 72 20 26 26 20 21 45 78 70 72  AndExpr && !Expr
1f2a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45  HasProperty(pOrE
1f2b0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
1f2c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
1f2d0 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  AndExpr->pLeft =
1f2e0 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20   pOrExpr;.      
1f2f0 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41      pOrExpr = pA
1f300 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  ndExpr;.        
1f310 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  }.        /* Loo
1f320 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
1f330 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
1f340 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
1f350 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62   */.        pSub
1f360 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
1f370 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
1f380 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70  , pOrTab, pOrExp
1f390 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3b0 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
1f3c0 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41  _CLOSE | WHERE_A
1f3d0 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20  ND_ONLY |.      
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41    WHERE_FORCE_TA
1f400 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54  BLE | WHERE_ONET
1f410 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43  ABLE_ONLY, iCovC
1f420 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ur);.        ass
1f430 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20 7c  ert( pSubWInfo |
1f440 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
1f450 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1f460 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ed );.        if
1f470 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20  ( pSubWInfo ){. 
1f480 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c 6f           WhereLo
1f490 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20 20  op *pSubLoop;.  
1f4a0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f          explainO
1f4b0 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20  neScan(.        
1f4c0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f        pParse, pO
1f4d0 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f  rTab, &pSubWInfo
1f4e0 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20  ->a[0], iLevel, 
1f4f0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30  pLevel->iFrom, 0
1f500 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1f510 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1f520 69 73 20 74 68 65 20 73 75 62 2d 57 48 45 52 45  is the sub-WHERE
1f530 20 63 6c 61 75 73 65 20 62 6f 64 79 2e 20 20 46   clause body.  F
1f540 69 72 73 74 20 73 6b 69 70 20 6f 76 65 72 0a 20  irst skip over. 
1f550 20 20 20 20 20 20 20 20 20 2a 2a 20 64 75 70 6c           ** dupl
1f560 69 63 61 74 65 20 72 6f 77 73 20 66 72 6f 6d 20  icate rows from 
1f570 70 72 69 6f 72 20 73 75 62 2d 57 48 45 52 45 20  prior sub-WHERE 
1f580 63 6c 61 75 73 65 73 2c 20 61 6e 64 20 72 65 63  clauses, and rec
1f590 6f 72 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  ord the.        
1f5a0 20 20 2a 2a 20 72 6f 77 69 64 20 28 6f 72 20 50    ** rowid (or P
1f5b0 52 49 4d 41 52 59 20 4b 45 59 29 20 66 6f 72 20  RIMARY KEY) for 
1f5c0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1f5d0 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  so that the same
1f5e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
1f5f0 77 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  w will be skippe
1f600 64 20 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20  d in subsequent 
1f610 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65  sub-WHERE clause
1f620 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  s..          */.
1f630 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1f640 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1f650 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
1f660 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
1f670 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
1f680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
1f690 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70  t iSet = ((ii==p
1f6a0 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d  OrWc->nTerm-1)?-
1f6b0 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20  1:ii);.         
1f6c0 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
1f6d0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
1f6e0 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74         r = sqlit
1f6f0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1f700 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
1f710 2c 20 2d 31 2c 20 69 43 75 72 2c 20 72 65 67 52  , -1, iCur, regR
1f720 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  owid, 0);.      
1f730 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c          j1 = sql
1f740 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1f750 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65  t(v, OP_RowSetTe
1f760 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30  st, regRowset, 0
1f770 2c 20 72 2c 69 53 65 74 29 3b 0a 20 20 20 20 20  , r,iSet);.     
1f780 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
1f790 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1f7a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f7b0 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
1f7c0 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
1f7d0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
1f7e0 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Tab);.          
1f7f0 20 20 20 20 69 6e 74 20 6e 50 6b 20 3d 20 70 50      int nPk = pP
1f800 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  k->nKeyCol;.    
1f810 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
1f820 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  k;..            
1f830 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 50 4b    /* Read the PK
1f840 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f   into an array o
1f850 66 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73  f temp registers
1f860 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1f870 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 47 65     r = sqlite3Ge
1f880 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1f890 65 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20  e, nPk);.       
1f8a0 20 20 20 20 20 20 20 66 6f 72 28 69 50 6b 3d 30         for(iPk=0
1f8b0 3b 20 69 50 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b  ; iPk<nPk; iPk++
1f8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f8d0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50     int iCol = pP
1f8e0 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d  k->aiColumn[iPk]
1f8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f900 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1f910 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
1f920 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 69  e, pTab, iCol, i
1f930 43 75 72 2c 20 72 2b 69 50 6b 2c 20 30 29 3b 0a  Cur, r+iPk, 0);.
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1f950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
1f960 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74  * Check if the t
1f970 65 6d 70 20 74 61 62 6c 65 20 61 6c 72 65 61 64  emp table alread
1f980 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20  y contains this 
1f990 6b 65 79 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20  key. If so,.    
1f9a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1f9b0 20 72 6f 77 20 68 61 73 20 61 6c 72 65 61 64 79   row has already
1f9c0 20 62 65 65 6e 20 69 6e 63 6c 75 64 65 64 20 69   been included i
1f9d0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1f9e0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20   and.           
1f9f0 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e     ** can be ign
1fa00 6f 72 65 64 20 28 62 79 20 6a 75 6d 70 69 6e 67  ored (by jumping
1fa10 20 70 61 73 74 20 74 68 65 20 47 6f 73 75 62 20   past the Gosub 
1fa20 62 65 6c 6f 77 29 2e 20 4f 74 68 65 72 77 69 73  below). Otherwis
1fa30 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1fa40 20 2a 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6b   ** insert the k
1fa50 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ey into the temp
1fa60 20 74 61 62 6c 65 20 61 6e 64 20 70 72 6f 63 65   table and proce
1fa70 65 64 20 77 69 74 68 20 70 72 6f 63 65 73 73 69  ed with processi
1fa80 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ng.             
1fa90 20 2a 2a 20 74 68 65 20 72 6f 77 2e 0a 20 20 20   ** the row..   
1faa0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55              ** U
1fac0 73 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 73  se some of the s
1fad0 61 6d 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ame optimization
1fae0 73 20 61 73 20 4f 50 5f 52 6f 77 53 65 74 54 65  s as OP_RowSetTe
1faf0 73 74 3a 20 49 66 20 69 53 65 74 0a 20 20 20 20  st: If iSet.    
1fb00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
1fb10 7a 65 72 6f 2c 20 61 73 73 75 6d 65 20 74 68 61  zero, assume tha
1fb20 74 20 74 68 65 20 6b 65 79 20 63 61 6e 6e 6f 74  t the key cannot
1fb30 20 61 6c 72 65 61 64 79 20 62 65 20 70 72 65 73   already be pres
1fb40 65 6e 74 20 69 6e 0a 20 20 20 20 20 20 20 20 20  ent in.         
1fb50 20 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70       ** the temp
1fb60 20 74 61 62 6c 65 2e 20 41 6e 64 20 69 66 20 69   table. And if i
1fb70 53 65 74 20 69 73 20 2d 31 2c 20 61 73 73 75 6d  Set is -1, assum
1fb80 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  e that there is 
1fb90 6e 6f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  no .            
1fba0 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 69 6e 73    ** need to ins
1fbb0 65 72 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f  ert the key into
1fbc0 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2c   the temp table,
1fbd0 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 65 76 65   as it will neve
1fbe0 72 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r .             
1fbf0 20 2a 2a 20 62 65 20 74 65 73 74 65 64 20 66 6f   ** be tested fo
1fc00 72 2e 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  r.  */ .        
1fc10 20 20 20 20 20 20 69 66 28 20 69 53 65 74 20 29        if( iSet )
1fc20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1fc30 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
1fc40 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
1fc50 50 5f 46 6f 75 6e 64 2c 20 72 65 67 52 6f 77 73  P_Found, regRows
1fc60 65 74 2c 20 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a  et, 0, r, nPk);.
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1fc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1fca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1fcb0 66 28 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20  f( iSet>=0 ){.  
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1fcd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1fce0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
1fcf0 2c 20 72 2c 20 6e 50 6b 2c 20 72 65 67 52 6f 77  , r, nPk, regRow
1fd00 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  id);.           
1fd10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fd20 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
1fd30 49 6e 73 65 72 74 2c 20 72 65 67 52 6f 77 73 65  Insert, regRowse
1fd40 74 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b  t, regRowid, 0);
1fd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fd60 20 69 66 28 20 69 53 65 74 20 29 20 73 71 6c 69   if( iSet ) sqli
1fd70 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1fd80 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
1fd90 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
1fda0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1fdb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65           /* Rele
1fdc0 61 73 65 20 74 68 65 20 61 72 72 61 79 20 6f 66  ase the array of
1fdd0 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73 20   temp registers 
1fde0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1fdf0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1fe00 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1fe10 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20   r, nPk);.      
1fe20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fe30 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
1fe40 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69  * Invoke the mai
1fe50 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20 61  n loop body as a
1fe60 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1fe70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fe80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1fe90 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72  _Gosub, regRetur
1fea0 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  n, iLoopBody);..
1feb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
1fec0 70 20 68 65 72 65 20 28 73 6b 69 70 70 69 6e 67  p here (skipping
1fed0 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62   the main loop b
1fee0 6f 64 79 20 73 75 62 72 6f 75 74 69 6e 65 29 20  ody subroutine) 
1fef0 69 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  if the.         
1ff00 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 75 62 2d   ** current sub-
1ff10 57 48 45 52 45 20 72 6f 77 20 69 73 20 61 20 64  WHERE row is a d
1ff20 75 70 6c 69 63 61 74 65 20 66 72 6f 6d 20 70 72  uplicate from pr
1ff30 69 6f 72 20 73 75 62 2d 57 48 45 52 45 73 2e 20  ior sub-WHEREs. 
1ff40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1ff50 20 6a 31 20 29 20 73 71 6c 69 74 65 33 56 64 62   j1 ) sqlite3Vdb
1ff60 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
1ff70 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
1ff80 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  The pSubWInfo->u
1ff90 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61  ntestedTerms fla
1ffa0 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  g means that thi
1ffb0 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20  s OR term.      
1ffc0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
1ffd0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44   one or more AND
1ffe0 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74   term from a not
1fff0 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68  Ready table.  Th
20000 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
20010 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f  erms from the no
20020 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75  tReady table cou
20030 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  ld not be tested
20040 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20   and will.      
20050 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
20060 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a  e tested later..
20070 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
20080 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
20090 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
200a0 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65  rms ) untestedTe
200b0 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  rms = 1;..      
200c0 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66      /* If all of
200d0 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65   the OR-connecte
200e0 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69  d terms are opti
200f0 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20  mized using the 
20100 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
20110 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65  * index, and the
20120 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64   index is opened
20130 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
20140 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
20150 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61          ** by ea
20160 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ch call to sqlit
20170 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d  e3WhereBegin() m
20180 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ade by this loop
20190 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20  , it may.       
201a0 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c     ** be possibl
201b0 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e  e to use that in
201c0 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e  dex as a coverin
201d0 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  g index..       
201e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
201f0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  ** If the call t
20200 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
20210 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75  gin() above resu
20220 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74  lted in a scan t
20230 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
20240 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
20250 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68  and this is eith
20260 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d  er the first OR-
20270 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20  connected term. 
20280 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
20290 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64  essed or the ind
202a0 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ex is the same a
202b0 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61  s that used by a
202c0 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20  ll previous.    
202d0 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20        ** terms, 
202e0 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20  set pCov to the 
202f0 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
20300 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77  ng index. Otherw
20310 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20  ise, set .      
20320 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e      ** pCov to N
20330 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ULL to indicate 
20340 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74  that no candidat
20350 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
20360 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20   will .         
20370 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65   ** be available
20380 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
20390 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f           pSubLoo
203a0 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  p = pSubWInfo->a
203b0 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  [0].pWLoop;.    
203c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
203d0 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
203e0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
203f0 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DEX)==0 );.     
20400 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f       if( (pSubLo
20410 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
20420 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
20430 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
20440 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70  i==0 || pSubLoop
20450 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
20460 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20  ==pCov).        
20470 20 20 20 26 26 20 28 48 61 73 52 6f 77 69 64 28     && (HasRowid(
20480 70 54 61 62 29 20 7c 7c 20 70 53 75 62 4c 6f 6f  pTab) || pSubLoo
20490 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
204a0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 21 3d 32 29  x->autoIndex!=2)
204b0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
204c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
204d0 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30  ( pSubWInfo->a[0
204e0 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43  ].iIdxCur==iCovC
204f0 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ur );.          
20500 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f    pCov = pSubLoo
20510 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
20520 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  x;.          }el
20530 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
20540 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  pCov = 0;.      
20550 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
20560 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c   /* Finish the l
20570 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
20580 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
20590 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
205a0 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
205b0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
205c0 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20  pSubWInfo);.    
205d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
205e0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
205f0 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76  u.pCovidx = pCov
20600 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20 29  ;.    if( pCov )
20610 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
20620 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20   = iCovCur;.    
20630 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
20640 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
20650 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20  pLeft = 0;.     
20660 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
20670 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29  te(db, pAndExpr)
20680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
20690 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
206a0 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c  v, iRetInit, sql
206b0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
206c0 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c  ddr(v));.    sql
206d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
206e0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
206f0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
20700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
20710 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
20720 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
20730 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
20740 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  el>1 ) sqlite3St
20750 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54  ackFree(db, pOrT
20760 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e  ab);.    if( !un
20770 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64 69  testedTerms ) di
20780 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
20790 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  , pTerm);.  }els
207a0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
207b0 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
207c0 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a  IZATION */..  {.
207d0 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20      /* Case 6:  
207e0 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62  There is no usab
207f0 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75  le index.  We mu
20800 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65  st do a complete
20810 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
20820 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74   scan of the ent
20830 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ire table..    *
20840 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
20850 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20  st u8 aStep[] = 
20860 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72  { OP_Next, OP_Pr
20870 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63  ev };.    static
20880 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74   const u8 aStart
20890 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64  [] = { OP_Rewind
208a0 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20  , OP_Last };.   
208b0 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30   assert( bRev==0
208c0 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20   || bRev==1 );. 
208d0 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
208e0 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a  >isRecursive ){.
208f0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
20900 6d 61 72 6b 65 64 20 69 73 52 65 63 75 72 73 69  marked isRecursi
20910 76 65 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73  ve have only a s
20920 69 6e 67 6c 65 20 72 6f 77 20 74 68 61 74 20 69  ingle row that i
20930 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20  s stored in.    
20940 20 20 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63 75    ** a pseudo-cu
20950 72 73 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20 74  rsor.  No need t
20960 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e 65 78 74  o Rewind or Next
20970 20 73 75 63 68 20 63 75 72 73 6f 72 73 2e 20 2a   such cursors. *
20980 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  /.      pLevel->
20990 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
209a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
209b0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65  Level->op = aSte
209c0 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 70  p[bRev];.      p
209d0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
209e0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
209f0 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
20a00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53  VdbeAddOp2(v, aS
20a10 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72  tart[bRev], iCur
20a20 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
20a30 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
20a40 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20  (v, bRev==0);.  
20a50 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
20a60 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a  If(v, bRev!=0);.
20a70 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35        pLevel->p5
20a80 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
20a90 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
20aa0 45 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  EP;.    }.  }.. 
20ab0 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
20ac0 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75  to test every su
20ad0 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74  bexpression that
20ae0 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65   can be complete
20af0 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  ly.  ** computed
20b00 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
20b10 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
20b20 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
20b30 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
20b40 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
20b50 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
20b60 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74   Expr *pE;.    t
20b70 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
20b80 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
20b90 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65  IRTUAL );.    te
20ba0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
20bb0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
20bc0 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
20bd0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
20be0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
20bf0 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
20c00 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
20c10 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
20c20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  & pLevel->notRea
20c30 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
20c40 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
20c50 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d  ->untestedTerms=
20c60 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
20c70 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
20c80 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
20c90 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21  _ONETABLE_ONLY)!
20ca0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  =0 );.      pWIn
20cb0 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
20cc0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  s = 1;.      con
20cd0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
20ce0 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
20cf0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
20d00 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pE!=0 );.    if(
20d10 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
20d20 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
20d30 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
20d40 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
20d50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
20d60 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
20d70 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
20d80 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pE, addrCont, SQ
20d90 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
20da0 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  ;.    pTerm->wtF
20db0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
20dc0 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  ED;.  }..  /* In
20dd0 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
20de0 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f  t for implied co
20df0 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20  nstraints based 
20e00 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a  on transitivity.
20e10 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22    ** of the "=="
20e20 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
20e30 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66    ** Example: If
20e40 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
20e50 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61  e contains "t1.a
20e60 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62  =t2.b" and "t2.b
20e70 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77  =123".  ** and w
20e80 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65  e are coding the
20e90 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65   t1 loop and the
20ea0 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74   t2 loop has not
20eb0 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a   yet coded,.  **
20ec0 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20   then we cannot 
20ed0 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32  use the "t1.a=t2
20ee0 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  .b" constraint, 
20ef0 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a  but we can code.
20f00 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64    ** the implied
20f10 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73   "t1.a=123" cons
20f20 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
20f30 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
20f40 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
20f50 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
20f60 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c  ){.    Expr *pE,
20f70 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65   *pEAlt;.    Whe
20f80 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20  reTerm *pAlt;.  
20f90 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
20fa0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
20fb0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
20fc0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20fd0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
20fe0 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56  rator!=(WO_EQUIV
20ff0 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e  |WO_EQ) ) contin
21000 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
21010 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
21020 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
21030 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
21040 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74  iLeftJoin ) cont
21050 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70  inue;.    pE = p
21060 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
21070 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
21080 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
21090 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20  _FromJoin) );.  
210a0 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
210b0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
210c0 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
210d0 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74  )!=0 );.    pAlt
210e0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
210f0 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e   iCur, pTerm->u.
21100 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52  leftColumn, notR
21110 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
21120 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  N, 0);.    if( p
21130 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Alt==0 ) continu
21140 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d  e;.    if( pAlt-
21150 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
21160 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
21170 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ue;.    testcase
21180 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
21190 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
211a0 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d   testcase( pAlt-
211b0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
211c0 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f  IN );.    VdbeMo
211d0 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
211e0 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76  "begin transitiv
211f0 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b  e constraint"));
21200 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c  .    pEAlt = sql
21210 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
21220 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45  w(db, sizeof(*pE
21230 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70  Alt));.    if( p
21240 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  EAlt ){.      *p
21250 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45  EAlt = *pAlt->pE
21260 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74  xpr;.      pEAlt
21270 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c  ->pLeft = pE->pL
21280 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eft;.      sqlit
21290 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
212a0 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64  arse, pEAlt, add
212b0 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
212c0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
212d0 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
212e0 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20  e(db, pEAlt);.  
212f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f    }.  }..  /* Fo
21300 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
21310 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
21320 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
21330 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
21340 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
21350 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
21360 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
21370 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
21380 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
21390 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
213a0 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
213b0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
213c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
213d0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
213e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
213f0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
21400 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
21410 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
21420 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
21430 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
21440 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
21450 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
21460 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
21470 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
21480 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
21490 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
214a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
214b0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
214c0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
214d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
214e0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
214f0 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
21500 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
21510 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
21520 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
21530 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
21540 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
21550 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
21560 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
21570 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
21580 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
21590 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b  untestedTerms );
215a0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
215b0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
215c0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
215d0 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73  pExpr );.      s
215e0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
215f0 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
21600 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74  >pExpr, addrCont
21610 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
21620 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72  ULL);.      pTer
21630 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
21640 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
21650 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c    }..  return pL
21660 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a  evel->notReady;.
21670 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  }..#if defined(W
21680 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
21690 44 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  D) && defined(SQ
216a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
216b0 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20  _EXPLAIN)./*.** 
216c0 47 65 6e 65 72 61 74 65 20 22 45 78 70 6c 61 6e  Generate "Explan
216d0 61 74 69 6f 6e 22 20 74 65 78 74 20 66 6f 72 20  ation" text for 
216e0 61 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2f 0a  a WhereTerm..*/.
216f0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
21700 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 56 64 62  eExplainTerm(Vdb
21710 65 20 2a 76 2c 20 57 68 65 72 65 54 65 72 6d 20  e *v, WhereTerm 
21720 2a 70 54 65 72 6d 29 7b 0a 20 20 63 68 61 72 20  *pTerm){.  char 
21730 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 6d 65 6d 63  zType[4];.  memc
21740 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c  py(zType, "...",
21750 20 34 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   4);.  if( pTerm
21760 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
21770 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65  _VIRTUAL ) zType
21780 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 69 66 28  [0] = 'V';.  if(
21790 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
217a0 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20  r & WO_EQUIV  ) 
217b0 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a  zType[1] = 'E';.
217c0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
217d0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
217e0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
217f0 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c   ) zType[2] = 'L
21800 27 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  ';.  sqlite3Expl
21810 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 25 73  ainPrintf(v, "%s
21820 20 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 73 71   ", zType);.  sq
21830 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
21840 28 76 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  (v, pTerm->pExpr
21850 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 57  );.}.#endif /* W
21860 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
21870 44 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  D && SQLITE_ENAB
21880 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 20  LE_TREE_EXPLAIN 
21890 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
218a0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
218b0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
218c0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
218d0 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
218e0 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
218f0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
21900 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
21910 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
21920 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  C){.  WhereInfo 
21930 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  *pWInfo = pWC->p
21940 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20  WInfo;.  int nb 
21950 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61  = 1+(pWInfo->pTa
21960 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38  bList->nSrc+7)/8
21970 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
21980 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
21990 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
219a0 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
219b0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
219c0 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
219d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
219e0 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
219f0 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
21a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21a10 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
21a20 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
21a30 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a  nb, p->prereq);.
21a40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21a50 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a70 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
21a80 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
21a90 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
21aa0 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
21ab0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
21ac0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
21ad0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
21ae0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 66 28 20  zName;.     if( 
21af0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
21b00 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d  x && (zName = p-
21b10 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
21b20 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
21b30 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
21b40 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
21b50 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
21b60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
21b70 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
21b80 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
21b90 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
21ba0 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
21bb0 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
21bc0 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
21bd0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
21be0 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
21bf0 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  6s %2d", zName, 
21c00 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
21c10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21c20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21c30 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b  intf("%20s","");
21c40 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
21c50 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
21c60 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
21c70 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
21c80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
21c90 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
21ca0 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
21cb0 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
21cc0 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
21cd0 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
21ce0 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
21cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
21d00 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
21d10 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
21d20 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
21d30 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
21d40 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
21d50 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
21d60 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a  f(" %-19s", z);.
21d70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21d80 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (z);.  }.  sqlit
21d90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
21da0 66 20 25 30 34 78 20 4e 20 25 64 22 2c 20 70 2d  f %04x N %d", p-
21db0 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
21dc0 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  erm);.  sqlite3D
21dd0 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
21de0 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
21df0 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
21e00 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  n, p->nOut);.#if
21e10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
21e20 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 0a 20  E_TREE_EXPLAIN. 
21e30 20 2f 2a 20 49 66 20 74 68 65 20 30 78 31 30 30   /* If the 0x100
21e40 20 62 69 74 20 6f 66 20 77 68 65 72 65 74 72 61   bit of wheretra
21e50 63 69 6e 67 20 69 73 20 73 65 74 2c 20 74 68 65  cing is set, the
21e60 6e 20 73 68 6f 77 20 61 6c 6c 20 6f 66 20 74 68  n show all of th
21e70 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a  e constraint.  *
21e80 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
21e90 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 61   the WhereLoop.a
21ea0 4c 54 65 72 6d 5b 5d 20 61 72 72 61 79 2e 0a 20  LTerm[] array.. 
21eb0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54   */.  if( p->nLT
21ec0 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57  erm && (sqlite3W
21ed0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
21ee0 30 29 21 3d 30 20 29 7b 20 20 2f 2a 20 57 48 45  0)!=0 ){  /* WHE
21ef0 52 45 54 52 41 43 45 20 30 78 31 30 30 20 2a 2f  RETRACE 0x100 */
21f00 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
21f10 56 64 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f  Vdbe *v = pWInfo
21f20 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  ->pParse->pVdbe;
21f30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
21f40 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20  ainBegin(v);.   
21f50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
21f60 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
21f70 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
21f80 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 5b  erm = p->aLTerm[
21f90 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  i];.      if( pT
21fa0 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
21fb0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
21fc0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c  ExplainPrintf(v,
21fd0 20 22 20 20 28 25 64 29 20 23 25 2d 32 64 20 22   "  (%d) #%-2d "
21fe0 2c 20 69 2b 31 2c 20 28 69 6e 74 29 28 70 54 65  , i+1, (int)(pTe
21ff0 72 6d 2d 70 57 43 2d 3e 61 29 29 3b 0a 20 20 20  rm-pWC->a));.   
22000 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
22010 6e 50 75 73 68 28 76 29 3b 0a 20 20 20 20 20 20  nPush(v);.      
22020 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d  whereExplainTerm
22030 28 76 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  (v, pTerm);.    
22040 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
22050 50 6f 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71  Pop(v);.      sq
22060 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76  lite3ExplainNL(v
22070 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22080 69 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73  ite3ExplainFinis
22090 68 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  h(v);.    sqlite
220a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73  3DebugPrintf("%s
220b0 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ", sqlite3VdbeEx
220c0 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20  planation(v));. 
220d0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64   }.#endif.}.#end
220e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
220f0 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e  t bulk memory in
22100 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65  to a valid Where
22110 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65  Loop that can be
22120 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68   passed.** to wh
22130 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72  ereLoopClear har
22140 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74  mlessly..*/.stat
22150 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
22160 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20  pInit(WhereLoop 
22170 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d  *p){.  p->aLTerm
22180 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63   = p->aLTermSpac
22190 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d  e;.  p->nLTerm =
221a0 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20   0;.  p->nLSlot 
221b0 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  = ArraySize(p->a
221c0 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70  LTermSpace);.  p
221d0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d  ->wsFlags = 0;.}
221e0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
221f0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e  e WhereLoop.u un
22200 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72  ion.  Leave Wher
22210 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74  eLoop.pLTerm int
22220 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  act..*/.static v
22230 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
22240 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20  arUnion(sqlite3 
22250 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
22260 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46  p){.  if( p->wsF
22270 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49  lags & (WHERE_VI
22280 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45  RTUALTABLE|WHERE
22290 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a  _AUTO_INDEX) ){.
222a0 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c      if( (p->wsFl
222b0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
222c0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20  UALTABLE)!=0 && 
222d0 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
222e0 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ee ){.      sqli
222f0 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74  te3_free(p->u.vt
22300 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
22310 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64    p->u.vtab.need
22320 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
22330 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
22340 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
22350 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
22360 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
22370 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62  EX)!=0 && p->u.b
22380 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
22390 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
223a0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62  bFree(db, p->u.b
223b0 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f  tree.pIndex->zCo
223c0 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c  lAff);.      sql
223d0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
223e0 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  (p->u.btree.pInd
223f0 65 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ex->pKeyInfo);. 
22400 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
22410 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
22420 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
22430 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
22440 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
22450 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
22460 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
22470 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
22480 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
22490 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
224a0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
224b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
224c0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
224d0 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
224e0 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
224f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
22500 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65  ->aLTerm);.  whe
22510 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
22520 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65  (db, p);.  where
22530 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a  LoopInit(p);.}..
22540 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  /*.** Increase t
22550 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
22560 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e  tion for pLoop->
22570 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61  aLTerm[] to be a
22580 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74  t least n..*/.st
22590 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
225a0 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33  opResize(sqlite3
225b0 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
225c0 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68  *p, int n){.  Wh
225d0 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b  ereTerm **paNew;
225e0 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74  .  if( p->nLSlot
225f0 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=n ) return SQL
22600 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e  ITE_OK;.  n = (n
22610 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20  +7)&~7;.  paNew 
22620 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
22630 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
22640 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29  p->aLTerm[0])*n)
22650 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30  ;.  if( paNew==0
22660 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
22670 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79  _NOMEM;.  memcpy
22680 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
22690 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
226a0 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
226b0 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
226c0 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
226d0 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
226e0 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
226f0 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  m);.  p->aLTerm 
22700 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c  = paNew;.  p->nL
22710 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75  Slot = n;.  retu
22720 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22730 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
22740 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
22750 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e   second pLoop in
22760 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f  to the first..*/
22770 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
22780 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65  eLoopXfer(sqlite
22790 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
227a0 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70   *pTo, WhereLoop
227b0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72   *pFrom){.  wher
227c0 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
227d0 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20  db, pTo);.  if( 
227e0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
227f0 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
22800 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d  nLTerm) ){.    m
22810 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30  emset(&pTo->u, 0
22820 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29  , sizeof(pTo->u)
22830 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
22840 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
22850 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
22860 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
22870 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
22880 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
22890 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
228a0 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
228b0 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
228c0 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
228d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
228e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
228f0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
22900 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
22910 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
22920 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
22930 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
22940 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
22950 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
22960 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
22970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22980 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
22990 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
229a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
229b0 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
229c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
229d0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
229e0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
229f0 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
22a00 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
22a10 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
22a20 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
22a30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22a40 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
22a50 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
22a60 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
22a70 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e   if( ALWAYS(pWIn
22a80 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65  fo) ){.    where
22a90 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49  ClauseClear(&pWI
22aa0 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77  nfo->sWC);.    w
22ab0 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c  hile( pWInfo->pL
22ac0 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68  oops ){.      Wh
22ad0 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49  ereLoop *p = pWI
22ae0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20  nfo->pLoops;.   
22af0 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70     pWInfo->pLoop
22b00 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  s = p->pNextLoop
22b10 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
22b20 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  pDelete(db, p);.
22b30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22b40 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
22b50 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fo);.  }.}../*.*
22b60 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
22b70 20 62 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 6c   both of the fol
22b80 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
22b90 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20  .**.**   (1)  X 
22ba0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
22bb0 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20  lower cost that 
22bc0 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73  Y.**   (2)  X is
22bd0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
22be0 20 6f 66 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22   of Y.**.** By "
22bf0 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 77  proper subset" w
22c00 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73  e mean that X us
22c10 65 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63  es fewer WHERE c
22c20 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74  lause terms.** t
22c30 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
22c40 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
22c50 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
22c60 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a   is also used.**
22c70 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   by Y..**.** If 
22c80 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
22c90 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59  bset of Y then Y
22ca0 20 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f   is a better cho
22cb0 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a  ice and ought.**
22cc0 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72   to have a lower
22cd0 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75   cost.  This rou
22ce0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55  tine returns TRU
22cf0 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74  E when that cost
22d00 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69   .** relationshi
22d10 70 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e  p is inverted an
22d20 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64  d needs to be ad
22d30 6a 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  justed..*/.stati
22d40 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43  c int whereLoopC
22d50 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
22d60 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  et(.  const Wher
22d70 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20  eLoop *pX,      
22d80 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c   /* First WhereL
22d90 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  oop to compare *
22da0 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  /.  const WhereL
22db0 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f  oop *pY        /
22dc0 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  * Compare agains
22dd0 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  t this WhereLoop
22de0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
22df0 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54  j;.  if( pX->nLT
22e00 65 72 6d 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72  erm >= pY->nLTer
22e10 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  m ) return 0; /*
22e20 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73   X is not a subs
22e30 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 69 66 28  et of Y */.  if(
22e40 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d   pX->rRun >= pY-
22e50 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28  >rRun ){.    if(
22e60 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e   pX->rRun > pY->
22e70 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  rRun ) return 0;
22e80 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
22e90 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
22ea0 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e    if( pX->nOut >
22eb0 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75   pY->nOut ) retu
22ec0 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
22ed0 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
22ee0 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  */.  }.  for(i=p
22ef0 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d  X->nLTerm-1; i>=
22f00 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 66 6f 72  0; i--){.    for
22f10 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  (j=pY->nLTerm-1;
22f20 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
22f30 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72     if( pY->aLTer
22f40 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d  m[j]==pX->aLTerm
22f50 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [i] ) break;.   
22f60 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29   }.    if( j<0 )
22f70 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58   return 0;  /* X
22f80 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66   not a subset of
22f90 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b   Y since term X[
22fa0 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59  i] not used by Y
22fb0 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
22fc0 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64   1;  /* All cond
22fd0 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d  itions meet */.}
22fe0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61  ../*.** Try to a
22ff0 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 6f  djust the cost o
23000 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d  f WhereLoop pTem
23010 70 6c 61 74 65 20 75 70 77 61 72 64 73 20 6f 72  plate upwards or
23020 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a   downwards so.**
23030 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   that:.**.**   (
23040 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  1) pTemplate cos
23050 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61 6e 79  ts less than any
23060 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
23070 73 20 74 68 61 74 20 61 72 65 20 61 20 70 72 6f  s that are a pro
23080 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73 75 62  per.**       sub
23090 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61 74 65  set of pTemplate
230a0 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54 65  .**.**   (2) pTe
230b0 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f 72  mplate costs mor
230c0 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  e than any other
230d0 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20   WhereLoops for 
230e0 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74 65 0a  which pTemplate.
230f0 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20 70 72  **       is a pr
23100 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a  oper subset..**.
23110 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65 72 65  ** To say "Where
23120 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72 6f 70  Loop X is a prop
23130 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 22 20  er subset of Y" 
23140 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75 73 65  means that X use
23150 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45 52 45  s fewer.** WHERE
23160 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
23170 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76  an Y and that ev
23180 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
23190 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20   term used by X 
231a0 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20  is.** also used 
231b0 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  by Y..**.** This
231c0 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6f   adjustment is o
231d0 6d 69 74 74 65 64 20 66 6f 72 20 53 4b 49 50 53  mitted for SKIPS
231e0 43 41 4e 20 6c 6f 6f 70 73 2e 20 20 49 6e 20 61  CAN loops.  In a
231f0 20 53 4b 49 50 53 43 41 4e 20 6c 6f 6f 70 2c 20   SKIPSCAN loop, 
23200 74 68 65 0a 2a 2a 20 57 68 65 72 65 4c 6f 6f 70  the.** WhereLoop
23210 2e 6e 4c 54 65 72 6d 20 66 69 65 6c 64 20 69 73  .nLTerm field is
23220 20 6e 6f 74 20 61 6e 20 61 63 63 75 72 61 74 65   not an accurate
23230 20 6d 65 61 73 75 72 65 20 6f 66 20 74 68 65 20   measure of the 
23240 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 52 45 0a  number of WHERE.
23250 2a 2a 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ** clause terms 
23260 63 6f 76 65 72 65 64 2c 20 73 69 6e 63 65 20 73  covered, since s
23270 6f 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ome of the first
23280 20 6e 4c 54 65 72 6d 20 65 6e 74 72 69 65 73 20   nLTerm entries 
23290 69 6e 20 61 4c 54 65 72 6d 5b 5d 0a 2a 2a 20 77  in aLTerm[].** w
232a0 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 28 62 65 63  ill be NULL (bec
232b0 61 75 73 65 20 74 68 65 79 20 61 72 65 20 73 6b  ause they are sk
232c0 69 70 70 65 64 29 2e 20 20 54 68 61 74 20 6d 61  ipped).  That ma
232d0 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66  kes it more diff
232e0 69 63 75 6c 74 0a 2a 2a 20 74 6f 20 63 6f 6d 70  icult.** to comp
232f0 61 72 65 20 74 68 65 20 6c 6f 6f 70 73 2e 20 20  are the loops.  
23300 57 65 20 63 6f 75 6c 64 20 61 64 64 20 65 78 74  We could add ext
23310 72 61 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  ra code to do th
23320 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 61 6e  e comparison, an
23330 64 0a 2a 2a 20 70 65 72 68 61 70 73 20 77 65 20  d.** perhaps we 
23340 77 69 6c 6c 20 73 6f 6d 65 64 61 79 2e 20 20 42  will someday.  B
23350 75 74 20 53 4b 49 50 53 43 41 4e 20 69 73 20 73  ut SKIPSCAN is s
23360 75 66 66 69 63 69 65 6e 74 6c 79 20 75 6e 63 6f  ufficiently unco
23370 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73 0a 2a  mmon, and this.*
23380 2a 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  * adjustment is 
23390 73 75 66 66 69 63 69 65 6e 74 20 6d 69 6e 6f 72  sufficient minor
233a0 2c 20 74 68 61 74 20 69 74 20 69 73 20 76 65 72  , that it is ver
233b0 79 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 63  y difficult to c
233c0 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 61 20 74 65  onstruct.** a te
233d0 73 74 20 63 61 73 65 20 77 68 65 72 65 20 74 68  st case where th
233e0 65 20 65 78 74 72 61 20 63 6f 64 65 20 77 6f 75  e extra code wou
233f0 6c 64 20 69 6d 70 72 6f 76 65 20 74 68 65 20 71  ld improve the q
23400 75 65 72 79 20 70 6c 61 6e 2e 20 20 42 65 74 74  uery plan.  Bett
23410 65 72 0a 2a 2a 20 74 6f 20 61 76 6f 69 64 20 74  er.** to avoid t
23420 68 65 20 61 64 64 65 64 20 63 6f 6d 70 6c 65 78  he added complex
23430 69 74 79 20 61 6e 64 20 6a 75 73 74 20 6f 6d 69  ity and just omi
23440 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e  t cost adjustmen
23450 74 73 20 74 6f 20 53 4b 49 50 53 43 41 4e 0a 2a  ts to SKIPSCAN.*
23460 2a 20 6c 6f 6f 70 73 2e 0a 2a 2f 0a 73 74 61 74  * loops..*/.stat
23470 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
23480 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73  pAdjustCost(cons
23490 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t WhereLoop *p, 
234a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
234b0 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54  late){.  if( (pT
234c0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
234d0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
234e0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
234f0 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d   if( (pTemplate-
23500 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
23510 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 29 20  _SKIPSCAN)!=0 ) 
23520 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20  return;.  for(; 
23530 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
23540 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  p){.    if( p->i
23550 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Tab!=pTemplate->
23560 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iTab ) continue;
23570 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
23580 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
23590 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69  EXED)==0 ) conti
235a0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d  nue;.    if( (p-
235b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
235c0 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 29 20  _SKIPSCAN)!=0 ) 
235d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
235e0 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  ( whereLoopCheap
235f0 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70  erProperSubset(p
23600 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a  , pTemplate) ){.
23610 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
23620 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64  pTemplate cost d
23630 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20  ownward so that 
23640 69 74 20 69 73 20 63 68 65 61 70 65 72 20 74 68  it is cheaper th
23650 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a  an its .      **
23660 20 73 75 62 73 65 74 20 70 20 2a 2f 0a 20 20 20   subset p */.   
23670 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
23680 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20  un = p->rRun;.  
23690 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
236a0 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20  Out = p->nOut - 
236b0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
236c0 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
236d0 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 54  rProperSubset(pT
236e0 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20  emplate, p) ){. 
236f0 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70       /* Adjust p
23700 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70  Template cost up
23710 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20  ward so that it 
23720 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e  is costlier than
23730 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a   p since.      *
23740 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  * pTemplate is a
23750 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
23760 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 70 54 65  f p */.      pTe
23770 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70  mplate->rRun = p
23780 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54  ->rRun;.      pT
23790 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20  emplate->nOut = 
237a0 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20  p->nOut + 1;.   
237b0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
237c0 53 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20  Search the list 
237d0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e  of WhereLoops in
237e0 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67   *ppPrev looking
237f0 20 66 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61   for one that ca
23800 6e 20 62 65 0a 2a 2a 20 73 75 70 70 6c 61 6e 74  n be.** supplant
23810 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e  ed by pTemplate.
23820 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  .**.** Return NU
23830 4c 4c 20 69 66 20 74 68 65 20 57 68 65 72 65 4c  LL if the WhereL
23840 6f 6f 70 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  oop list contain
23850 73 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  s an entry that 
23860 63 61 6e 20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20  can supplant.** 
23870 70 54 65 6d 70 6c 61 74 65 2c 20 69 6e 20 6f 74  pTemplate, in ot
23880 68 65 72 20 77 6f 72 64 73 20 69 66 20 70 54 65  her words if pTe
23890 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20  mplate does not 
238a0 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 6c 69  belong on the li
238b0 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20  st..**.** If pX 
238c0 69 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74  is a WhereLoop t
238d0 68 61 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61  hat pTemplate ca
238e0 6e 20 73 75 70 70 6c 61 6e 74 2c 20 74 68 65 6e  n supplant, then
238f0 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c   return the.** l
23900 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20  ink that points 
23910 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  to pX..**.** If 
23920 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74  pTemplate cannot
23930 20 73 75 70 70 6c 61 6e 74 20 61 6e 79 20 65 78   supplant any ex
23940 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f  isting element o
23950 66 20 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e  f the list but n
23960 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64  eeds.** to be ad
23970 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 2c  ded to the list,
23980 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
23990 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 61  ointer to the ta
239a0 69 6c 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a  il of the list..
239b0 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c  */.static WhereL
239c0 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46  oop **whereLoopF
239d0 69 6e 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65  indLesser(.  Whe
239e0 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c  reLoop **ppPrev,
239f0 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  .  const WhereLo
23a00 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b  op *pTemplate.){
23a10 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b  .  WhereLoop *p;
23a20 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65  .  for(p=(*ppPre
23a30 76 29 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70  v); p; ppPrev=&p
23a40 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a  ->pNextLoop, p=*
23a50 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28  ppPrev){.    if(
23a60 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
23a70 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e  ate->iTab || p->
23a80 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c  iSortIdx!=pTempl
23a90 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b  ate->iSortIdx ){
23aa0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74  .      /* If eit
23ab0 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20  her the iTab or 
23ac0 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20  iSortIdx values 
23ad0 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f  for two WhereLoo
23ae0 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a  p are different.
23af0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
23b00 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ose WhereLoops n
23b10 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64  eed to be consid
23b20 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  ered separately.
23b30 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20    Neither is.   
23b40 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74     ** a candidat
23b50 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65  e to replace the
23b60 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20   other. */.     
23b70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
23b80 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63  .    /* In the c
23b90 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
23ba0 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75  ation, the rSetu
23bb0 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  p value is eithe
23bc0 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72  r zero.    ** or
23bd0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69   the cost of bui
23be0 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  lding an automat
23bf0 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29  ic index (NlogN)
23c00 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20   and the NlogN. 
23c10 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d     ** is the sam
23c20 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65  e for compatible
23c30 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a   WhereLoops. */.
23c40 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
23c50 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d  Setup==0 || pTem
23c60 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30  plate->rSetup==0
23c70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
23c80 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d     || p->rSetup=
23c90 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
23ca0 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68  up );..    /* wh
23cb0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
23cc0 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74  ) always generat
23cd0 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74  es and inserts t
23ce0 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
23cf0 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66  ex.    ** case f
23d00 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d  irst.  Hence com
23d10 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74  patible candidat
23d20 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76  e WhereLoops nev
23d30 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72  er have a larger
23d40 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20  .    ** rSetup. 
23d50 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d  Call this SETUP-
23d60 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20  INVARIANT */.   
23d70 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
23d80 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
23d90 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  Setup );..    /*
23da0 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65   If existing Whe
23db0 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
23dc0 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
23dd0 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  e, pTemplate can
23de0 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   be.    ** disca
23df0 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70  rded.  WhereLoop
23e00 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a   p is better if:
23e10 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70  .    **   (1)  p
23e20 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
23e30 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70  endencies than p
23e40 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20  Template, and.  
23e50 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61    **   (2)  p ha
23e60 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
23e70 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54  wer cost than pT
23e80 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20  emplate.    */. 
23e90 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
23ea0 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
23eb0 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
23ec0 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  q    /* (1)  */.
23ed0 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75       && p->rSetu
23ee0 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p<=pTemplate->rS
23ef0 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20  etup            
23f00 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
23f10 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
23f20 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
23f30 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
23f40 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
23f50 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  /.     && p->nOu
23f60 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t<=pTemplate->nO
23f70 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
23f80 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20          /* (2c) 
23f90 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
23fa0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69  return 0;  /* Di
23fb0 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20  scard pTemplate 
23fc0 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
23fd0 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73   If pTemplate is
23fe0 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74   always better t
23ff0 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73  han p, then caus
24000 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
24010 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74  itten.    ** wit
24020 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54  h pTemplate.  pT
24030 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
24040 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20  r than p if:.   
24050 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70   **   (1)  pTemp
24060 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65  late has no more
24070 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61   dependences tha
24080 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  n p, and.    ** 
24090 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65    (2)  pTemplate
240a0 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
240b0 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
240c0 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   p..    */.    i
240d0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
240e0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
240f0 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
24100 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20  rereq   /* (1)  
24110 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  */.     && p->rR
24120 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un>=pTemplate->r
24130 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  Run             
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24150 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
24160 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d  && p->nOut>=pTem
24170 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
241a0 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
241b0 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
241c0 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
241d0 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50  etup ); /* SETUP
241e0 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65  -INVARIANT above
241f0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
24200 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f     /* Cause p to
24210 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
24220 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
24230 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24240 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a  rn ppPrev;.}../*
24250 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
24260 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f  place a WhereLoo
24270 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68  p entry using th
24280 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c  e template suppl
24290 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ied..**.** An ex
242a0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
242b0 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20   entry might be 
242c0 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
242d0 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a  he new template.
242e0 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64  ** is better and
242f0 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e   has fewer depen
24300 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65  dencies.  Or the
24310 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62   template will b
24320 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64  e ignored.** and
24330 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20   no insert will 
24340 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73  occur if an exis
24350 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ting WhereLoop i
24360 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73  s faster and has
24370 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64  .** fewer depend
24380 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
24390 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72  template.  Other
243a0 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65  wise a new Where
243b0 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64  Loop is.** added
243c0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65   based on the te
243d0 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  mplate..**.** If
243e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
243f0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
24400 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74  en we care about
24410 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
24420 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
24430 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
24440 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
24450 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
24460 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
24470 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
24480 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
24490 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
244a0 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
244b0 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
244c0 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
244d0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
244e0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
244f0 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
24500 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
24510 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
24520 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
24530 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
24540 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
24550 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
24560 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
24570 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  * new template i
24580 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73  s better.  Loops
24590 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74   may be overwrit
245a0 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ten if the follo
245b0 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69  wing .** conditi
245c0 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ons are met:.**.
245d0 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20  **    (1)  They 
245e0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54  have the same iT
245f0 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54  ab..**    (2)  T
24600 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
24610 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20  e iSortIdx..**  
24620 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c    (3)  The templ
24630 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20  ate has same or 
24640 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
24650 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  es than the curr
24660 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28  ent loop.**    (
24670 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  4)  The template
24680 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72   has the same or
24690 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
246a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
246b0 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  p.*/.static int 
246c0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
246d0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
246e0 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72   *pBuilder, Wher
246f0 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
24700 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
24710 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57  *ppPrev, *p;.  W
24720 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
24730 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
24740 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
24750 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
24760 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  rse->db;..  /* I
24770 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
24780 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  et is defined, t
24790 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72  hen only keep tr
247a0 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73  ack of the costs
247b0 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71  .  ** and prereq
247c0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  s..  */.  if( pB
247d0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d  uilder->pOrSet!=
247e0 30 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52  0 ){.#if WHERETR
247f0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
24800 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72  u16 n = pBuilder
24810 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20  ->pOrSet->n;.   
24820 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
24830 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
24840 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  t(pBuilder->pOrS
24850 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  et, pTemplate->p
24860 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65  rereq, pTemplate
24870 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20  ->rRun,.        
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24890 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
248a0 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69  plate->nOut);.#i
248b0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
248c0 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
248d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
248e0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
248f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
24900 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
24910 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
24920 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
24930 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
24940 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
24950 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
24960 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
24970 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24980 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66    }..  /* Look f
24990 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  or an existing W
249a0 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c  hereLoop to repl
249b0 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61  ace with pTempla
249c0 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c  te.  */.  whereL
249d0 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57  oopAdjustCost(pW
249e0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54  Info->pLoops, pT
249f0 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72  emplate);.  ppPr
24a00 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  ev = whereLoopFi
24a10 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f  ndLesser(&pWInfo
24a20 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c  ->pLoops, pTempl
24a30 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50  ate);..  if( ppP
24a40 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rev==0 ){.    /*
24a50 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   There already e
24a60 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f  xists a WhereLoo
24a70 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68  p on the list th
24a80 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  at is better.   
24a90 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61   ** than pTempla
24aa0 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f  te, so just igno
24ab0 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  re pTemplate */.
24ac0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
24ad0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
24ae0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
24af0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
24b00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24b10 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
24b20 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20  s-noop: ");.    
24b30 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
24b40 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
24b50 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
24b60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
24b70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
24b80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
24b90 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a  = *ppPrev;.  }..
24ba0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
24bb0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
24bc0 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
24bd0 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f   p[] should be o
24be0 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  verwritten.  ** 
24bf0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d  with pTemplate[]
24c00 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20   if p[] exists, 
24c10 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68  or if p==NULL th
24c20 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  en allocate a ne
24c30 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70  w.  ** WhereLoop
24c40 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a   and insert it..
24c50 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52    */.#if WHERETR
24c60 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
24c70 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  x8 */.  if( sqli
24c80 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
24c90 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70  0x8 ){.    if( p
24ca0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
24cb0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24cc0 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20  "ins-del:  ");. 
24cd0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
24ce0 69 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d  int(p, pBuilder-
24cf0 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >pWC);.    }.   
24d00 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24d10 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22  ntf("ins-new:  "
24d20 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
24d30 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
24d40 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
24d50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
24d60 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ( p==0 ){.    /*
24d70 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
24d80 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64  WhereLoop to add
24d90 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
24da0 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a  he list */.    *
24db0 70 70 50 72 65 76 20 3d 20 70 20 3d 20 73 71 6c  ppPrev = p = sql
24dc0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
24dd0 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  db, sizeof(Where
24de0 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  Loop));.    if( 
24df0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
24e00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
24e10 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
24e20 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f  ;.    p->pNextLo
24e30 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  op = 0;.  }else{
24e40 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20  .    /* We will 
24e50 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57  be overwriting W
24e60 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42  hereLoop p[].  B
24e70 75 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c  ut before we do,
24e80 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f   first.    ** go
24e90 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73   through the res
24ea0 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e  t of the list an
24eb0 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68  d delete any oth
24ec0 65 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64  er entries besid
24ed0 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68  es.    ** p[] th
24ee0 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70  at are also supp
24ef0 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61  lated by pTempla
24f00 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c  te */.    WhereL
24f10 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26  oop **ppTail = &
24f20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
24f30 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f    WhereLoop *pTo
24f40 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  Del;.    while( 
24f50 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20  *ppTail ){.     
24f60 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c   ppTail = whereL
24f70 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70  oopFindLesser(pp
24f80 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29  Tail, pTemplate)
24f90 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45  ;.      if( NEVE
24fa0 52 28 70 70 54 61 69 6c 3d 3d 30 29 20 29 20 62  R(ppTail==0) ) b
24fb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44  reak;.      pToD
24fc0 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20  el = *ppTail;.  
24fd0 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d      if( pToDel==
24fe0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
24ff0 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65   *ppTail = pToDe
25000 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69  l->pNextLoop;.#i
25010 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
25020 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
25030 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25040 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
25050 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25060 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25070 69 6e 73 2d 64 65 6c 3a 20 22 29 3b 0a 20 20 20  ins-del: ");.   
25080 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
25090 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69  int(pToDel, pBui
250a0 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
250b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
250c0 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
250d0 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20  (db, pToDel);.  
250e0 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c    }.  }.  whereL
250f0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
25100 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
25110 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
25120 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
25130 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
25140 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
25150 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
25160 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
25170 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
25180 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
25190 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
251a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
251b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
251c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
251d0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
251e0 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72  ut value downwar
251f0 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
25200 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
25210 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
25220 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
25230 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20   loop but which 
25240 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20  are not used by 
25250 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a  an.** index..**.
25260 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  ** In the curren
25270 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
25280 2c 20 74 68 65 20 66 69 72 73 74 20 65 78 74 72  , the first extr
25290 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
252a0 65 72 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74  erm reduces.** t
252b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
252c0 70 75 74 20 72 6f 77 73 20 62 79 20 61 20 66 61  put rows by a fa
252d0 63 74 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65  ctor of 10 and e
252e0 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74  ach additional t
252f0 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74  erm.** reduces t
25300 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
25310 70 75 74 20 72 6f 77 73 20 62 79 20 73 71 72 74  put rows by sqrt
25320 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  (2)..*/.static v
25330 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74  oid whereLoopOut
25340 70 75 74 41 64 6a 75 73 74 28 57 68 65 72 65 43  putAdjust(WhereC
25350 6c 61 75 73 65 20 2a 70 57 43 2c 20 57 68 65 72  lause *pWC, Wher
25360 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 29 7b 0a 20  eLoop *pLoop){. 
25370 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
25380 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73  m, *pX;.  Bitmas
25390 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e  k notAllowed = ~
253a0 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70  (pLoop->prereq|p
253b0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b  Loop->maskSelf);
253c0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20  .  int i, j;..  
253d0 69 66 28 20 21 4f 70 74 69 6d 69 7a 61 74 69 6f  if( !Optimizatio
253e0 6e 45 6e 61 62 6c 65 64 28 70 57 43 2d 3e 70 57  nEnabled(pWC->pW
253f0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
25400 2c 20 53 51 4c 49 54 45 5f 41 64 6a 75 73 74 4f  , SQLITE_AdjustO
25410 75 74 45 73 74 29 20 29 7b 0a 20 20 20 20 72 65  utEst) ){.    re
25420 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
25430 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54  i=pWC->nTerm, pT
25440 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b  erm=pWC->a; i>0;
25450 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i--, pTerm++){.
25460 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
25470 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
25480 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65  IRTUAL)!=0 ) bre
25490 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ak;.    if( (pTe
254a0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
254b0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
254c0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
254d0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
254e0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41  prereqAll & notA
254f0 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e  llowed)!=0 ) con
25500 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a  tinue;.    for(j
25510 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31  =pLoop->nLTerm-1
25520 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
25530 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e      pX = pLoop->
25540 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  aLTerm[j];.     
25550 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e   if( pX==0 ) con
25560 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
25570 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72 65   pX==pTerm ) bre
25580 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ak;.      if( pX
25590 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26 20  ->iParent>=0 && 
255a0 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61  (&pWC->a[pX->iPa
255b0 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20  rent])==pTerm ) 
255c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
255d0 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20   if( j<0 ){.    
255e0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d    pLoop->nOut +=
255f0 20 28 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72   (pTerm->truthPr
25600 6f 62 3c 3d 30 20 3f 20 70 54 65 72 6d 2d 3e 74  ob<=0 ? pTerm->t
25610 72 75 74 68 50 72 6f 62 20 3a 20 2d 31 29 3b 0a  ruthProb : -1);.
25620 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
25630 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
25640 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
25650 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
25660 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
25670 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
25680 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
25690 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
256a0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
256b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
256c0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
256d0 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
256e0 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
256f0 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
25700 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
25710 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
25720 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
25730 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
25740 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
25750 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
25760 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
25770 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
25780 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
25790 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
257a0 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
257b0 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
257c0 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
257d0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
257e0 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
257f0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
25800 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
25810 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
25820 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
25830 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
25840 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
25850 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25860 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
25870 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
25880 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
25890 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
258a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258b0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
258c0 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
258d0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
258e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
258f0 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
25900 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
25910 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
25920 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
25930 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
25940 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
25950 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
25960 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
25970 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
25980 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
25990 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
259a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
259b0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
259c0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
259d0 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
259e0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
259f0 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
25a00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
25a10 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
25a20 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
25a30 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
25a40 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
25a50 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
25a60 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
25a70 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
25a80 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25aa0 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
25ab0 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
25ac0 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
25ad0 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
25ae0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
25af0 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
25b00 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
25b10 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
25b20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
25b30 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
25b40 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
25b50 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b70 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
25b80 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
25b90 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
25ba0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
25bb0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
25bc0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
25bd0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
25be0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
25bf0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
25c00 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
25c10 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
25c20 74 72 65 65 2e 6e 53 6b 69 70 20 2a 2f 0a 20 20  tree.nSkip */.  
25c30 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
25c40 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
25c50 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
25c60 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
25c70 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73  gs */.  LogEst s
25c80 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
25c90 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
25ca0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
25cb0 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
25cc0 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ce0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
25cf0 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
25d00 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
25d10 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
25d20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
25d30 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  code */.  LogEst
25d40 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20   rLogSize;      
25d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
25d60 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
25d70 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
25d80 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a  erm *pTop = 0, *
25d90 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70  pBtm = 0; /* Top
25da0 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
25db0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
25dc0 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
25dd0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
25de0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
25df0 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
25e00 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65  E_NOMEM;..  asse
25e10 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
25e20 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
25e30 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
25e40 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
25e50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25e60 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
25e70 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
25e80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
25e90 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
25ea0 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
25eb0 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
25ec0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
25ed0 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  || (pSrc->jointy
25ee0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
25ef0 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
25f00 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
25f10 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
25f20 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
25f30 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
25f40 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
25f50 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  L|WO_GT|WO_GE|WO
25f60 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20  _LT|WO_LE;.  }. 
25f70 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
25f80 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b  ordered ) opMask
25f90 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47   &= ~(WO_GT|WO_G
25fa0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a  E|WO_LT|WO_LE);.
25fb0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
25fc0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
25fd0 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29 3b  robe->nKeyCol );
25fe0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62  .  if( pNew->u.b
25ff0 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62  tree.nEq < pProb
26000 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  e->nKeyCol ){.  
26010 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d    iCol = pProbe-
26020 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e  >aiColumn[pNew->
26030 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20  u.btree.nEq];.  
26040 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20  }else{.    iCol 
26050 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72  = -1;.  }.  pTer
26060 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
26070 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
26080 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
26090 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20  ursor, iCol,.   
260a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260b0 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72       opMask, pPr
260c0 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45  obe);.  saved_nE
260d0 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  q = pNew->u.btre
260e0 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e  e.nEq;.  saved_n
260f0 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  Skip = pNew->u.b
26100 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 73 61  tree.nSkip;.  sa
26110 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
26120 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
26130 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
26140 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
26150 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
26160 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
26170 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
26180 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  nOut;.  pNew->rS
26190 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67  etup = 0;.  rLog
261a0 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 70 50  Size = estLog(pP
261b0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
261c0 74 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  t[0]);..  /* Con
261d0 73 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b  sider using a sk
261e0 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65  ip-scan if there
261f0 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
26200 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
26210 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
26220 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  for the left-mos
26230 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69  t terms of the i
26240 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65  ndex, and if the
26250 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75   average.  ** nu
26260 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20  mber of repeats 
26270 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  in the left-most
26280 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61   terms is at lea
26290 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a  st 18. .  **.  *
262a0 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62  * The magic numb
262b0 65 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65  er 18 is selecte
262c0 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74  d on the basis t
262d0 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20  hat scanning 17 
262e0 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d  rows.  ** is alm
262f0 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b  ost always quick
26300 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78  er than an index
26310 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75   seek (even thou
26320 67 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a  gh if the index.
26330 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65    ** contains fe
26340 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f  wer than 2^17 ro
26350 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68  ws we assume oth
26360 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20  erwise in other 
26370 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68  parts of.  ** th
26380 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76  e code). And, ev
26390 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c  en if it is not,
263a0 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62   it should not b
263b0 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65  e too much slowe
263c0 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20  r. .  ** On the 
263d0 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20  other hand, the 
263e0 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c  extra seeks coul
263f0 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73  d end up being s
26400 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
26410 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65  * more expensive
26420 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
26430 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  42==sqlite3LogEs
26440 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 70  t(18) );.  if( p
26450 54 65 72 6d 3d 3d 30 0a 20 20 20 26 26 20 73 61  Term==0.   && sa
26460 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e  ved_nEq==saved_n
26470 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64  Skip.   && saved
26480 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e  _nEq+1<pProbe->n
26490 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72  KeyCol.   && pPr
264a0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
264b0 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34  [saved_nEq+1]>=4
264c0 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69  2  /* TUNING: Mi
264d0 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73  nimum for skip-s
264e0 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63  can */.   && (rc
264f0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69   = whereLoopResi
26500 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
26510 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53  w->nLTerm+1))==S
26520 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
26530 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a    LogEst nIter;.
26540 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
26550 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65  e.nEq++;.    pNe
26560 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  w->u.btree.nSkip
26570 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ++;.    pNew->aL
26580 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
26590 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m++] = 0;.    pN
265a0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
265b0 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20  HERE_SKIPSCAN;. 
265c0 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62     nIter = pProb
265d0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
265e0 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f  aved_nEq] - pPro
265f0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
26600 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20  saved_nEq+1];.  
26610 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
26620 6e 49 74 65 72 3b 0a 20 20 20 20 77 68 65 72 65  nIter;.    where
26630 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
26640 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
26650 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
26660 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
26670 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
26680 64 5f 6e 4f 75 74 3b 0a 20 20 7d 0a 20 20 66 6f  d_nOut;.  }.  fo
26690 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
266a0 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
266b0 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
266c0 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
266d0 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72    u16 eOp = pTer
266e0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  m->eOperator;   
266f0 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72  /* Shorthand for
26700 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
26710 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20  r */.    LogEst 
26720 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f  rCostIdx;.    Lo
26730 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73  gEst nOutUnadjus
26740 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  ted;        /* n
26750 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20  Out before IN() 
26760 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74  and WHERE adjust
26770 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
26780 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
26790 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
267a0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
267b0 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
267c0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
267d0 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
267e0 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49    if( (eOp==WO_I
267f0 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
26800 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
26810 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
26820 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63   (iCol<0 || pSrc
26830 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ->pTab->aCol[iCo
26840 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20  l].notNull).    
26850 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
26860 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20  e; /* ignore IS 
26870 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74  [NOT] NULL const
26880 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55  raints on NOT NU
26890 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
268a0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
268b0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
268c0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
268d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
268e0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
268f0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
26900 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
26910 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
26920 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  q;.    pNew->nLT
26930 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
26940 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  rm;.    if( wher
26950 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
26960 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
26970 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
26980 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65  * OOM */.    pNe
26990 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
269a0 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72  nLTerm++] = pTer
269b0 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  m;.    pNew->pre
269c0 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65  req = (saved_pre
269d0 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  req | pTerm->pre
269e0 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65  reqRight) & ~pNe
269f0 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20  w->maskSelf;..  
26a00 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c    assert( nInMul
26a10 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  ==0.        || (
26a20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
26a30 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
26a40 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c  L)!=0 .        |
26a50 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
26a60 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
26a70 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  IN)!=0 .        
26a80 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
26a90 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
26aa0 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a  AN)!=0 .    );..
26ab0 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
26ac0 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  _IN ){.      Exp
26ad0 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
26ae0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ->pExpr;.      p
26af0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
26b00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
26b10 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
26b20 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
26b30 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
26b40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
26b50 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
26b60 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20  ":  TUNING: the 
26b70 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32  SELECT returns 2
26b80 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  5 rows */.      
26b90 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73    nIn = 46;  ass
26ba0 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
26bb0 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20  LogEst(25) );.  
26bc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
26bd0 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
26be0 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
26bf0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
26c00 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
26c10 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
26c20 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
26c30 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c    nIn = sqlite3L
26c40 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70  ogEst(pExpr->x.p
26c50 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
26c60 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
26c70 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a  rt( nIn>0 );  /*
26c80 20 52 48 53 20 61 6c 77 61 79 73 20 68 61 73 20   RHS always has 
26c90 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e  2 or more terms.
26ca0 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a 20  ..  The parser. 
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65         ** change
26cd0 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74  s "x IN (?)" int
26ce0 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20  o "x=?". */..   
26cf0 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
26d00 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20   (WO_EQ) ){.    
26d10 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
26d20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
26d30 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  EQ;.      if( iC
26d40 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d  ol<0 || (nInMul=
26d50 3d 30 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74  =0 && pNew->u.bt
26d60 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  ree.nEq==pProbe-
26d70 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20  >nKeyCol-1) ){. 
26d80 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
26d90 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e  =0 && pProbe->on
26da0 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
26db0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
26dc0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
26dd0 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20  RE_UNQ_WANTED;. 
26de0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26df0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
26e00 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
26e10 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d  NEROW;.        }
26e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
26e30 73 65 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f  se if( eOp & WO_
26e40 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
26e50 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
26e60 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
26e70 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  LL;.    }else if
26e80 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57  ( eOp & (WO_GT|W
26e90 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74  O_GE) ){.      t
26ea0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
26eb0 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  O_GT );.      te
26ec0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
26ed0 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  _GE );.      pNe
26ee0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
26ef0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
26f00 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  |WHERE_BTM_LIMIT
26f10 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70  ;.      pBtm = p
26f20 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70  Term;.      pTop
26f30 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
26f40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
26f50 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  Op & (WO_LT|WO_L
26f60 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  E) );.      test
26f70 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c  case( eOp & WO_L
26f80 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
26f90 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45  ase( eOp & WO_LE
26fa0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
26fb0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
26fc0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
26fd0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
26fe0 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72       pTop = pTer
26ff0 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  m;.      pBtm = 
27000 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27010 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
27020 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
27030 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
27040 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
27050 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20  LTerm-2] : 0;.  
27060 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
27070 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e  his point pNew->
27080 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
27090 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
270a0 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20  s expected to.  
270b0 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20    ** be visited 
270c0 62 79 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  by the index sca
270d0 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65  n before conside
270e0 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c  ring term pTerm,
270f0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76   or the.    ** v
27100 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64  alues of nIn and
27110 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65   nInMul. In othe
27120 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e  r words, assumin
27130 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20  g that all .    
27140 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74  ** "x IN(...)" t
27150 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65  erms are replace
27160 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20  d with "x = ?". 
27170 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74  This block updat
27180 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  es.    ** the va
27190 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
271a0 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  t to account for
271b0 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20   pTerm (but not 
271c0 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f  nIn/nInMul).  */
271d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
271e0 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
271f0 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Out );.    if( p
27200 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
27210 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
27220 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  E ){.      /* Ad
27230 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20  just nOut using 
27240 73 74 61 74 33 2f 73 74 61 74 34 20 64 61 74 61  stat3/stat4 data
27250 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69  . Or, if there i
27260 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34  s no stat3/stat4
27270 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20  .      ** data, 
27280 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72  using some other
27290 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20   estimate.  */. 
272a0 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
272b0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
272c0 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70  Builder, pBtm, p
272d0 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  Top, pNew);.    
272e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
272f0 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75   nEq = ++pNew->u
27300 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20  .btree.nEq;.    
27310 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
27320 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
27330 7c 57 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20 20 20  |WO_IN) );..    
27340 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
27350 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
27360 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
27370 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
27380 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a  0 && iCol>=0 ){.
27390 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
273a0 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c  (eOp & WO_IN) ||
273b0 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20   nIn==0 );.     
273c0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
273d0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
273e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
273f0 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
27400 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ob;.        pNew
27410 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
27420 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
27430 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4c 49  lags |= WHERE_LI
27440 4b 45 4c 49 48 4f 4f 44 3b 0a 20 20 20 20 20 20  KELIHOOD;.      
27450 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
27460 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
27470 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20  3_OR_STAT4.     
27480 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
27490 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
274a0 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20   nInMul==0 .    
274b0 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
274c0 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
274d0 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
274e0 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
274f0 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
27500 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
27510 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
27520 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20  QLITE_Stat3) .  
27530 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20         && ((eOp 
27540 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21  & WO_IN)==0 || !
27550 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
27560 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
27570 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20  _xIsSelect)).   
27580 20 20 20 20 20 20 26 26 20 28 70 4e 65 77 2d 3e        && (pNew->
27590 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
275a0 4c 49 4b 45 4c 49 48 4f 4f 44 29 3d 3d 30 0a 20  LIKELIHOOD)==0. 
275b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
275c0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
275d0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
275e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65            if( (e
275f0 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  Op & (WO_EQ|WO_I
27600 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20  SNULL))!=0 ){.  
27610 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
27620 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20  se( eOp & WO_EQ 
27630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
27640 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
27650 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
27660 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
27670 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
27680 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
27690 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
276a0 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &nOut);.        
276b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
276c0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49       rc = whereI
276d0 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  nScanEst(pParse,
276e0 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
276f0 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74  ->x.pList, &nOut
27700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
27710 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27720 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
27730 7c 20 6e 4f 75 74 3e 30 20 29 3b 0a 20 20 20 20  | nOut>0 );.    
27740 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
27750 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20  LITE_NOTFOUND ) 
27760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27770 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
27790 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eak;          /*
277a0 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   Jump out of the
277b0 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20   pTerm loop */. 
277c0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75           if( nOu
277d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
277e0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
277f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74  lite3LogEst(nOut
27800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
27810 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61  f( pNew->nOut>sa
27820 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d  ved_nOut ) pNew-
27830 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
27840 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
27850 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
27860 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
27870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27880 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23   if( nOut==0 ).#
27890 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
278a0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
278b0 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d  nOut += (pProbe-
278c0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
278d0 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
278e0 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b  wLogEst[nEq-1]);
278f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
27900 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
27910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
27920 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
27930 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f  e is no likeliho
27940 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75  od() value, assu
27950 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20  me that a .     
27960 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49         ** "col I
27970 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69  S NULL" expressi
27980 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65  on matches twice
27990 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20   as many rows . 
279a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73             ** as
279b0 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20   (col=?). */.   
279c0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
279d0 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20  Out += 10;.     
279e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
279f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
27a00 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74      /* Set rCost
27a10 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20  Idx to the cost 
27a20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65  of visiting sele
27a30 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64  cted rows in ind
27a40 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69  ex. Add.    ** i
27a50 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c  t to pNew->rRun,
27a60 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e   which is curren
27a70 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  tly set to the c
27a80 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ost of the index
27a90 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c  .    ** seek onl
27aa0 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73  y. Then, if this
27ab0 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
27ac0 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68  ng index, add th
27ad0 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a  e cost of.    **
27ae0 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f   visiting the ro
27af0 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ws in the main t
27b00 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43  able.  */.    rC
27b10 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e  ostIdx = pNew->n
27b20 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50  Out + 1 + (15*pP
27b30 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f  robe->szIdxRow)/
27b40 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61  pSrc->pTab->szTa
27b50 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  bRow;.    pNew->
27b60 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
27b70 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
27b80 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20  , rCostIdx);.   
27b90 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
27ba0 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58  ags & (WHERE_IDX
27bb0 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29  _ONLY|WHERE_IPK)
27bc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  )==0 ){.      pN
27bd0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
27be0 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77  e3LogEstAdd(pNew
27bf0 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f  ->rRun, pNew->nO
27c00 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a  ut + 16);.    }.
27c10 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73  .    nOutUnadjus
27c20 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  ted = pNew->nOut
27c30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
27c40 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
27c50 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
27c60 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
27c70 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f  ;.    whereLoopO
27c80 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69  utputAdjust(pBui
27c90 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 29  lder->pWC, pNew)
27ca0 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
27cb0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
27cc0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20  der, pNew);..   
27cd0 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
27ce0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
27cf0 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  N_RANGE ){.     
27d00 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
27d10 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65  ved_nOut;.    }e
27d20 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
27d30 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64  >nOut = nOutUnad
27d40 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  justed;.    }.. 
27d50 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
27d60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
27d70 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20  P_LIMIT)==0.    
27d80 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
27d90 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e  e.nEq<(pProbe->n
27da0 4b 65 79 43 6f 6c 20 2b 20 28 70 50 72 6f 62 65  KeyCol + (pProbe
27db0 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20  ->zName!=0)).   
27dc0 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c   ){.      whereL
27dd0 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
27de0 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
27df0 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b   pProbe, nInMul+
27e00 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nIn);.    }.    
27e10 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
27e20 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20  ed_nOut;.#ifdef 
27e30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
27e40 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
27e50 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
27e60 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64  alid = nRecValid
27e70 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
27e80 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61  New->prereq = sa
27e90 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e  ved_prereq;.  pN
27ea0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
27eb0 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70  = saved_nEq;.  p
27ec0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  New->u.btree.nSk
27ed0 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
27ee0 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
27ef0 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
27f00 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  s;.  pNew->nOut 
27f10 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
27f20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
27f30 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72  aved_nLTerm;.  r
27f40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27f50 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69  ** Return True i
27f60 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
27f70 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67   that pIndex mig
27f80 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a  ht be useful in.
27f90 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  ** implementing 
27fa0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
27fb0 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e  use in pBuilder.
27fc0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61  .**.** Return Fa
27fd0 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20  lse if pBuilder 
27fe0 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
27ff0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
28000 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65  use or.** if the
28010 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72  re is no way for
28020 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73   pIndex to be us
28030 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e  eful in implemen
28040 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44  ting that.** ORD
28050 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f  ER BY clause..*/
28060 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65  .static int inde
28070 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
28080 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f  derBy(.  WhereLo
28090 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
280a0 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49  der,.  Index *pI
280b0 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72  ndex,.  int iCur
280c0 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73  sor.){.  ExprLis
280d0 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69  t *pOB;.  int ii
280e0 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e  , jj;..  if( pIn
280f0 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
28100 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
28110 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65  ( (pOB = pBuilde
28120 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r->pWInfo->pOrde
28130 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  rBy)==0 ) return
28140 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   0;.  for(ii=0; 
28150 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69  ii<pOB->nExpr; i
28160 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
28170 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
28180 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
28190 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  OB->a[ii].pExpr)
281a0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
281b0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
281c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
281d0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
281e0 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
281f0 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
28200 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
28210 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
28220 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
28230 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  mn==pIndex->aiCo
28240 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72  lumn[jj] ) retur
28250 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
28260 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
28270 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
28280 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65  rn a bitmask whe
28290 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74  re 1s indicate t
282a0 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hat the correspo
282b0 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a  nding column of.
282c0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  ** the table is 
282d0 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
282e0 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  .  Only the firs
282f0 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65  t 63 columns are
28300 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
28310 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63  static Bitmask c
28320 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e  olumnsInIndex(In
28330 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69  dex *pIdx){.  Bi
28340 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69  tmask m = 0;.  i
28350 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49  nt j;.  for(j=pI
28360 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a  dx->nColumn-1; j
28370 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69  >=0; j--){.    i
28380 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt x = pIdx->aiC
28390 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66  olumn[j];.    if
283a0 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
283b0 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
283c0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
283d0 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29  case( x==BMS-2 )
283e0 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d  ;.      if( x<BM
283f0 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42  S-1 ) m |= MASKB
28400 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IT(x);.    }.  }
28410 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a  .  return m;.}..
28420 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
28430 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  if a partial ind
28440 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64  ex with pPartInd
28450 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75  exWhere can be u
28460 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  sed.** in the cu
28470 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65  rrent query.  Re
28480 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
28490 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65  can be and false
284a0 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
284b0 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62  ic int whereUsab
284c0 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
284d0 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c  nt iTab, WhereCl
284e0 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
284f0 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *pWhere){.  int 
28500 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  i;.  WhereTerm *
28510 70 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30  pTerm;.  for(i=0
28520 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
28530 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
28540 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
28550 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
28560 49 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65 72  ImpliesExpr(pTer
28570 6d 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65  m->pExpr, pWhere
28580 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
28590 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
285a0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
285b0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
285c0 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e  bjects for a sin
285d0 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65  gle table of the
285e0 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20   join where the 
285f0 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e  table.** is iden
28600 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
28610 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
28620 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
28630 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ranteed to be.**
28640 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c   a b-tree table,
28650 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
28660 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
28670 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70  costs (WhereLoop
28680 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d  .rRun) of the b-
28690 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64  tree loops added
286a0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
286b0 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61  n.** are calcula
286c0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
286d0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c  **.** For a full
286e0 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20   scan, assuming 
286f0 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e  the table (or in
28700 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52  dex) contains nR
28710 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  ow rows:.**.**  
28720 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
28730 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20   3.0            
28740 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d          // full-
28750 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20  table scan.**   
28760 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
28770 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
28780 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
28790 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  f covering index
287a0 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
287b0 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20  Row * (K+3.0)   
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
287d0 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65  scan of non-cove
287e0 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a  ring index.**.**
287f0 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61   where K is a va
28800 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20  lue between 1.1 
28810 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65  and 3.0 set base
28820 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  d on the relativ
28830 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  e .** estimated 
28840 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
28850 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
28860 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a  ble records..**.
28870 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20  ** For an index 
28880 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73  scan, where nVis
28890 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  it is the number
288a0 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76   of index rows v
288b0 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  isited.** by the
288c0 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b   scan, and nSeek
288d0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
288e0 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  f seek operation
288f0 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a  s required on .*
28900 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  * the index b-tr
28910 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ee:.**.**     co
28920 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
28930 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56  g(nRow) + K * nV
28940 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f  isit)          /
28950 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  / covering index
28960 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
28970 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
28980 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56  ) + (K+3.0) * nV
28990 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d  isit)    // non-
289a0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
289b0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e  *.** Normally, n
289c0 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b  Seek is 1. nSeek
289d0 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
289e0 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75  than 1 come abou
289f0 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45  t if the .** WHE
28a00 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64  RE clause includ
28a10 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22  es "x IN (....)"
28a20 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70   terms used in p
28a30 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f  lace of "x=?". O
28a40 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69  r when .** impli
28a50 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43  cit "x IN (SELEC
28a60 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74  T x FROM tbl)" t
28a70 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66  erms are added f
28a80 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a  or skip-scans..*
28a90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
28aa0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a  reLoopAddBtree(.
28ab0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
28ac0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a  er *pBuilder, /*
28ad0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
28ae0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  formation */.  B
28af0 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20  itmask mExtra   
28b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
28b10 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65  tra prerequesite
28b20 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73  s for using this
28b30 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57   table */.){.  W
28b40 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
28b50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48  ;          /* WH
28b60 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
28b70 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
28b80 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20  *pProbe;        
28b90 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
28ba0 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  x we are evaluat
28bb0 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73  ing */.  Index s
28bc0 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pk;             
28bd0 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69       /* A fake i
28be0 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
28bf0 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
28c00 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69 52 6f  */.  LogEst aiRo
28c10 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20  wEstPk[2];      
28c20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f 67   /* The aiRowLog
28c30 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  Est[] value for 
28c40 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
28c50 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50  .  i16 aiColumnP
28c60 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f  k = -1;        /
28c70 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20  * The aColumn[] 
28c80 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
28c90 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63  k index */.  Src
28ca0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
28cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28cc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
28cd0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28ce0 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20  item *pSrc;  /* 
28cf0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
28d00 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64  btree term to ad
28d10 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
28d20 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
28d30 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57     /* Template W
28d40 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
28d50 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
28d60 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
28d70 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
28d80 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64  */.  int iSortId
28d90 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  x = 1;          
28da0 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72   /* Index number
28db0 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20   */.  int b;    
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28dd0 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76    /* A boolean v
28de0 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  alue */.  LogEst
28df0 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   rSize;         
28e00 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20        /* number 
28e10 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
28e20 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  able */.  LogEst
28e30 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20   rLogSize;      
28e40 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74        /* Logarit
28e50 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  hm of the number
28e60 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
28e70 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  table */.  Where
28e80 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
28e90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
28ea0 72 73 65 64 20 57 48 45 52 45 20 63 6c 61 75 73  rsed WHERE claus
28eb0 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
28ec0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
28ed0 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
28ee0 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a  g queried */.  .
28ef0 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
28f00 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66  r->pNew;.  pWInf
28f10 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
28f20 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74  Info;.  pTabList
28f30 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
28f40 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54  ist;.  pSrc = pT
28f50 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77  abList->a + pNew
28f60 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20 3d  ->iTab;.  pTab =
28f70 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
28f80 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
28f90 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49  WC;.  assert( !I
28fa0 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70  sVirtual(pSrc->p
28fb0 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70  Tab) );..  if( p
28fc0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20  Src->pIndex ){. 
28fd0 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44     /* An INDEXED
28fe0 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69   BY clause speci
28ff0 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  fies a particula
29000 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  r index to use *
29010 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70  /.    pProbe = p
29020 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d  Src->pIndex;.  }
29030 65 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f 77  else if( !HasRow
29040 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
29050 70 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70  pProbe = pTab->p
29060 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Index;.  }else{.
29070 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
29080 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
29090 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20  ause.  Create a 
290a0 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63  fake Index objec
290b0 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a  t in local.    *
290c0 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74  * variable sPk t
290d0 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
290e0 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
290f0 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74  y index.  Make t
29100 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20  his.    ** fake 
29110 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20  index the first 
29120 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e  in a chain of In
29130 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68  dex objects with
29140 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c   all of the real
29150 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  .    ** indices 
29160 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
29170 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61   /* First of rea
291a0 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
291b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
291c0 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
291d0 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
291e0 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20    sPk.nKeyCol = 
291f0 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
29200 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
29210 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
29220 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
29230 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
29240 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
29250 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
29260 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
29270 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
29280 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
29290 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
292a0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
292b0 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
292c0 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
292d0 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
292e0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
292f0 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
29300 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
29310 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
29320 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
29330 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
29340 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
29350 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
29360 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
29370 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
29380 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
29390 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
293a0 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
293b0 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
293c0 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70  .  }.  rSize = p
293d0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
293e0 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
293f0 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69  tLog(rSize);..#i
29400 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29410 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
29420 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  X.  /* Automatic
29430 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
29440 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
29450 53 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66  Set.   && (pWInf
29460 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
29470 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
29480 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
29490 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d  & pSrc->pIndex==
294a0 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76  0.   && !pSrc->v
294b0 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26  iaCoroutine.   &
294c0 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  & !pSrc->notInde
294d0 78 65 64 0a 20 20 20 26 26 20 48 61 73 52 6f 77  xed.   && HasRow
294e0 69 64 28 70 54 61 62 29 0a 20 20 20 26 26 20 21  id(pTab).   && !
294f0 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74  pSrc->isCorrelat
29500 65 64 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  ed.   && !pSrc->
29510 69 73 52 65 63 75 72 73 69 76 65 0a 20 20 29 7b  isRecursive.  ){
29520 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
29530 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
29540 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
29550 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
29560 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
29570 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
29580 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
29590 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
295a0 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
295b0 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
295c0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
295d0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
295e0 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
295f0 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
29600 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
29610 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
29620 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30  x(pTerm, pSrc, 0
29630 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
29640 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
29650 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
29660 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20  ->u.btree.nSkip 
29670 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
29680 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
29690 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  x = 0;.        p
296a0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
296b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
296c0 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
296d0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
296e0 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f  ING: One-time co
296f0 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67  st for computing
29700 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
29710 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20 20  ndex is.        
29720 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79  ** approximately
29730 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65   7*N*log2(N) whe
29740 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
29750 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20  er of rows in.  
29760 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62        ** the tab
29770 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
29780 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
29790 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67  w->rSetup = rLog
297a0 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 32  Size + rSize + 2
297b0 38 3b 20 20 61 73 73 65 72 74 28 20 32 38 3d 3d  8;  assert( 28==
297c0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 37 29  sqlite3LogEst(7)
297d0 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
297e0 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65  UNING: Each inde
297f0 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20  x lookup yields 
29800 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  20 rows in the t
29810 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20  able.  This.    
29820 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74      ** is more t
29830 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75  han the usual gu
29840 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20  ess of 10 rows, 
29850 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f  since we have no
29860 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   way.        ** 
29870 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20  of knowning how 
29880 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e  selective the in
29890 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74  dex will ultimat
298a0 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c  ely be.  It woul
298b0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  d.        ** not
298c0 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65   be unreasonable
298d0 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61   to make this va
298e0 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e  lue much larger.
298f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
29900 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73  ->nOut = 43;  as
29910 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65  sert( 43==sqlite
29920 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20  3LogEst(20) );. 
29930 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
29940 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
29950 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e  tAdd(rLogSize,pN
29960 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20  ew->nOut);.     
29970 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
29980 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   = WHERE_AUTO_IN
29990 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  DEX;.        pNe
299a0 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
299b0 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  ra | pTerm->prer
299c0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
299d0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
299e0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
299f0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
29a00 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
29a10 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
29a20 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a  UTOMATIC_INDEX *
29a30 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  /..  /* Loop ove
29a40 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20  r all indices.  
29a50 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53  */.  for(; rc==S
29a60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f  QLITE_OK && pPro
29a70 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62  be; pProbe=pProb
29a80 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49  e->pNext, iSortI
29a90 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  dx++){.    if( p
29aa0 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
29ab0 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20  here!=0.     && 
29ac0 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74  !whereUsablePart
29ad0 69 61 6c 49 6e 64 65 78 28 70 4e 65 77 2d 3e 69  ialIndex(pNew->i
29ae0 54 61 62 2c 20 70 57 43 2c 20 70 50 72 6f 62 65  Tab, pWC, pProbe
29af0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
29b00 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
29b10 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20  ue;  /* Partial 
29b20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69  index inappropri
29b30 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  ate for this que
29b40 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ry */.    }.    
29b50 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
29b60 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
29b70 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
29b80 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
29b90 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  New->u.btree.nSk
29ba0 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  ip = 0;.    pNew
29bb0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
29bc0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
29bd0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
29be0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
29bf0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
29c00 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d  Extra;.    pNew-
29c10 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
29c20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
29c30 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65  .pIndex = pProbe
29c40 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d  ;.    b = indexM
29c50 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
29c60 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50  rBy(pBuilder, pP
29c70 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72  robe, pSrc->iCur
29c80 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  sor);.    /* The
29c90 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44   ONEPASS_DESIRED
29ca0 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63   flags never occ
29cb0 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74  urs together wit
29cc0 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  h ORDER BY */.  
29cd0 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66    assert( (pWInf
29ce0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
29cf0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
29d00 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d  SIRED)==0 || b==
29d10 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72  0 );.    if( pPr
29d20 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a  obe->tnum<=0 ){.
29d30 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
29d40 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
29d50 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ex */.      pNew
29d60 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
29d70 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a  E_IPK;..      /*
29d80 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   Full table scan
29d90 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
29da0 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
29db0 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20  SortIdx : 0;.   
29dc0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
29dd0 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65  st of full table
29de0 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29   scan is (N*3.0)
29df0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
29e00 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
29e10 31 36 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  16;.      whereL
29e20 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
29e30 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  pWC, pNew);.    
29e40 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
29e50 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
29e60 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e   pNew);.      pN
29e70 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
29e80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
29e90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
29ea0 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
29eb0 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   m;.      if( pP
29ec0 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67  robe->isCovering
29ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
29ee0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
29ef0 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
29f00 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
29f10 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20      m = 0;.     
29f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29f30 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
29f40 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
29f50 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
29f60 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
29f70 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57  gs = (m==0) ? (W
29f80 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
29f90 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57  ERE_INDEXED) : W
29fa0 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
29fb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
29fc0 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e  Full scan via in
29fd0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
29fe0 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61   b.       || !Ha
29ff0 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20  sRowid(pTab).   
2a000 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20      || ( m==0.  
2a010 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
2a020 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
2a030 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72           && (pPr
2a040 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  obe->szIdxRow<pT
2a050 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20  ab->szTabRow).  
2a060 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
2a070 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2a080 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2a090 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
2a0a0 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
2a0b0 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
2a0c0 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
2a0d0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2a0e0 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
2a0f0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
2a100 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
2a110 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
2a120 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
2a130 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
2a140 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20  rtIdx : 0;..    
2a150 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
2a160 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  of visiting the 
2a170 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a  index rows is N*
2a180 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20  K, where K is.  
2a190 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
2a1a0 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65   1.1 and 3.0, de
2a1b0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72  pending on the r
2a1c0 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
2a1d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2a1e0 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
2a1f0 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73  rows. If this is
2a200 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
2a210 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20  index scan,.    
2a220 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20      ** also add 
2a230 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
2a240 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20  ting table rows 
2a250 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20  (N*3.0).  */.   
2a260 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2a270 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31  = rSize + 1 + (1
2a280 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
2a290 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52  ow)/pTab->szTabR
2a2a0 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
2a2b0 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
2a2c0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
2a2d0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2a2e0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a  pNew->rRun, rSiz
2a2f0 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d  e+16);.        }
2a300 0a 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ..        whereL
2a310 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
2a320 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  pWC, pNew);.    
2a330 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2a340 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2a350 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2a360 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
2a370 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
2a380 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2a390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2a3a0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2a3b0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
2a3c0 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
2a3d0 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20  obe, 0);.#ifdef 
2a3e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
2a3f0 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
2a400 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
2a410 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d  beFree(pBuilder-
2a420 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69  >pRec);.    pBui
2a430 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
2a440 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  = 0;.    pBuilde
2a450 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e  r->pRec = 0;.#en
2a460 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
2a470 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
2a480 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
2a490 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e  hen only that on
2a4a0 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a  e index is.    *
2a4b0 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f  * considered. */
2a4c0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70  .    if( pSrc->p
2a4d0 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20  Index ) break;. 
2a4e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2a4f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2a500 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2a510 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  BLE./*.** Add al
2a520 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
2a530 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  cts for a table 
2a540 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e  of the join iden
2a550 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75  tified by.** pBu
2a560 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
2a570 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69  b.  That table i
2a580 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2a590 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  be a virtual tab
2a5a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2a5b0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  t whereLoopAddVi
2a5c0 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f  rtual(.  WhereLo
2a5d0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
2a5e0 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63  der,  /* WHERE c
2a5f0 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
2a600 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
2a610 45 78 74 72 61 0a 29 7b 0a 20 20 57 68 65 72 65  Extra.){.  Where
2a620 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2a630 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
2a640 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
2a650 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
2a660 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
2a670 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
2a680 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
2a690 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2a6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a6b0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2a6c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
2a6d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
2a6e0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
2a6f0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
2a700 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20  arch */.  Table 
2a710 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
2a720 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *db;.  sqlite3_
2a730 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
2a740 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
2a750 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2a760 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
2a770 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
2a780 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
2a790 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
2a7a0 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
2a7b0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pTerm;.  int i,
2a7c0 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   j;.  int iTerm,
2a7d0 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   mxTerm;.  int n
2a7e0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
2a7f0 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20  t seenIn = 0;   
2a800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a810 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72  ue if an IN oper
2a820 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  ator is seen */.
2a830 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20    int seenVar = 
2a840 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2a850 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d  * True if a non-
2a860 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61  constant constra
2a870 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  int is seen */. 
2a880 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20   int iPhase;    
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a8a0 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e   0: const w/o IN
2a8b0 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e  , 1: const, 2: n
2a8c0 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a  o IN,  2: IN */.
2a8d0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2a8e0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
2a8f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e  LITE_OK;..  pWIn
2a900 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2a910 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  WInfo;.  pParse 
2a920 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2a930 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
2a940 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  >db;.  pWC = pBu
2a950 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e  ilder->pWC;.  pN
2a960 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2a970 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70  New;.  pSrc = &p
2a980 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2a990 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
2a9a0 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
2a9b0 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49  Tab;.  assert( I
2a9c0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
2a9d0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61  ;.  pIdxInfo = a
2a9e0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
2a9f0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
2aa00 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  rc, pBuilder->pO
2aa10 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
2aa20 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  IdxInfo==0 ) ret
2aa30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2aa40 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
2aa50 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53   = 0;.  pNew->rS
2aa60 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
2aa70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2aa80 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
2aa90 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2aaa0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
2aab0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
2aac0 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
2aad0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
2aae0 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74  tUsage;.  nConst
2aaf0 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
2ab00 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
2ab10 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
2ab20 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e  size(db, pNew, n
2ab30 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20  Constraint) ){. 
2ab40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2ab50 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
2ab60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ab70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
2ab80 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50  for(iPhase=0; iP
2ab90 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b  hase<=3; iPhase+
2aba0 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65  +){.    if( !see
2abb0 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31  nIn && (iPhase&1
2abc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  )!=0 ){.      iP
2abd0 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hase++;.      if
2abe0 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65  ( iPhase>3 ) bre
2abf0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
2ac00 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50  ( !seenVar && iP
2ac10 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a  hase>1 ) break;.
2ac20 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
2ac30 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
2ac40 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2ac50 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
2ac60 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66  onstraint;.    f
2ac70 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
2ac80 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
2ac90 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
2aca0 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64  ){.      j = pId
2acb0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
2acc0 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  et;.      pTerm 
2acd0 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
2ace0 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61      switch( iPha
2acf0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  se ){.        ca
2ad00 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 0:    /* Cons
2ad10 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e  tants without IN
2ad20 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
2ad30 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2ad40 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
2ad50 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
2ad60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2ad70 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
2ad80 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d          seenIn =
2ad90 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
2ada0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
2adb0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2adc0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2add0 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a     seenVar = 1;.
2ade0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
2adf0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2ae00 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
2ae10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2ae20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2ae30 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
2ae40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
2ae50 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
2ae60 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   1:    /* Consta
2ae70 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72  nts with IN oper
2ae80 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  ators */.       
2ae90 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49     assert( seenI
2aea0 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
2aeb0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2aec0 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
2aed0 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20  Right==0);.     
2aee0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2aef0 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f      case 2:    /
2af00 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
2af10 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  out IN */.      
2af20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
2af30 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Var );.         
2af40 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2af50 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  e = (pTerm->eOpe
2af60 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
2af70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
2af80 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61  ak;.        defa
2af90 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62  ult:   /* Variab
2afa0 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20  les with IN */. 
2afb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2afc0 20 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e   seenVar && seen
2afd0 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
2afe0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2aff0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2b000 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2b010 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
2b020 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
2b030 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
2b040 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
2b050 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  nt);.    if( pId
2b060 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2b070 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
2b080 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
2b090 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49  >idxStr);.    pI
2b0a0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
2b0b0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2b0c0 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
2b0d0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
2b0e0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
2b0f0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2b100 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
2b110 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
2b120 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
2b130 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
2b140 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20  L / (double)2;. 
2b150 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
2b160 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b  imatedRows = 25;
2b170 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65  .    rc = vtabBe
2b180 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
2b190 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  pTab, pIdxInfo);
2b1a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2b1b0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
2b1c0 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49  tab_exit;.    pI
2b1d0 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
2b1e0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2b1f0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
2b200 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2b210 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  int;.    pNew->p
2b220 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a  rereq = mExtra;.
2b230 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b      mxTerm = -1;
2b240 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
2b250 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73  w->nLSlot>=nCons
2b260 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f  traint );.    fo
2b270 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
2b280 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
2b290 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
2b2a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2b2b0 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  .omitMask = 0;. 
2b2c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
2b2d0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
2b2e0 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
2b2f0 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20     if( (iTerm = 
2b300 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
2b310 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20  dex - 1)>=0 ){. 
2b320 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43         j = pIdxC
2b330 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
2b340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
2b350 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm>=nConstraint
2b360 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30  .         || j<0
2b370 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d  .         || j>=
2b380 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20  pWC->nTerm.     
2b390 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54      || pNew->aLT
2b3a0 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20  erm[iTerm]!=0.  
2b3b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2b3c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2b3d0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
2b3e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2b3f0 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73  pParse, "%s.xBes
2b400 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63  tIndex() malfunc
2b410 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  tion", pTab->zNa
2b420 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
2b430 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  oto whereLoopAdd
2b440 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20  Vtab_exit;.     
2b450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
2b460 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43  tcase( iTerm==nC
2b470 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20  onstraint-1 );. 
2b480 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2b490 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   j==0 );.       
2b4a0 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57   testcase( j==pW
2b4b0 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20  C->nTerm-1 );.  
2b4c0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
2b4d0 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
2b4e0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c    pNew->prereq |
2b4f0 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  = pTerm->prereqR
2b500 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
2b510 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77  sert( iTerm<pNew
2b520 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
2b530 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2b540 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b  [iTerm] = pTerm;
2b550 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2b560 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65  rm>mxTerm ) mxTe
2b570 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20  rm = iTerm;.    
2b580 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
2b590 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20  erm==15 );.     
2b5a0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
2b5b0 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
2b5c0 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26    if( iTerm<16 &
2b5d0 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  & pUsage[i].omit
2b5e0 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e   ) pNew->u.vtab.
2b5f0 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  omitMask |= 1<<i
2b600 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
2b610 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2b620 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
2b630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2b640 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d   pUsage[i].omit=
2b650 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b660 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    /* Do not atte
2b670 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e  mpt to use an IN
2b680 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74   constraint if t
2b690 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
2b6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2b6b0 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71  says that the eq
2b6c0 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73  uivalent EQ cons
2b6d0 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
2b6e0 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e   safely omitted.
2b6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2b700 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74  If we do attempt
2b710 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63   to use such a c
2b720 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20  onstraint, some 
2b730 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20  rows might be.  
2b740 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70            ** rep
2b750 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74  eated in the out
2b760 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  put. */.        
2b770 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b790 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61   /* A virtual ta
2b7a0 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  ble that is cons
2b7b0 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e  trained by an IN
2b7c0 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a   clause may not.
2b7d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
2b7e0 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42  sume the ORDER B
2b7f0 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65  Y clause because
2b800 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f   (1) the order o
2b810 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20  f IN terms.     
2b820 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e       ** is not n
2b830 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74  ecessarily relat
2b840 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20  ed to the order 
2b850 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20  of output terms 
2b860 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
2b870 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
2b880 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
2b890 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
2b8a0 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
2b8b0 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65        ** togethe
2b8c0 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  r.  */.         
2b8d0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
2b8e0 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
2b8f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b900 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2b910 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  i>=nConstraint )
2b920 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  {.      pNew->nL
2b930 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
2b940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b950 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65  New->nLTerm<=pNe
2b960 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
2b970 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2b980 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66  idxNum = pIdxInf
2b990 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20  o->idxNum;.     
2b9a0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
2b9b0 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66  edFree = pIdxInf
2b9c0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2b9d0 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49  Str;.      pIdxI
2b9e0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2b9f0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  dxStr = 0;.     
2ba00 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
2ba10 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xStr = pIdxInfo-
2ba20 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  >idxStr;.      p
2ba30 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72  New->u.vtab.isOr
2ba40 64 65 72 65 64 20 3d 20 28 69 38 29 28 70 49 64  dered = (i8)(pId
2ba50 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
2ba60 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 20  nsumed ?.       
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2ba90 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
2baa0 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  y : 0);.      pN
2bab0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2bac0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2bad0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2bae0 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49  FromDouble(pIdxI
2baf0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
2bb00 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  st);.      pNew-
2bb10 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c  >nOut = sqlite3L
2bb20 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e  ogEst(pIdxInfo->
2bb30 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a  estimatedRows);.
2bb40 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49        whereLoopI
2bb50 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2bb60 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
2bb70 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
2bb80 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
2bb90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2bba0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
2bbb0 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  tr);.        pNe
2bbc0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2bbd0 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ee = 0;.      }.
2bbe0 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65      }.  }  ..whe
2bbf0 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
2bc00 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e  it:.  if( pIdxIn
2bc10 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2bc20 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
2bc30 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
2bc40 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
2bc50 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
2bc60 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  nfo);.  return r
2bc70 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
2bc80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2bc90 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
2bca0 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20  * Add WhereLoop 
2bcb0 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c  entries to handl
2bcc0 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69  e OR terms.  Thi
2bcd0 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68  s works for eith
2bce0 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20  er.** btrees or 
2bcf0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a  virtual tables..
2bd00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2bd10 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65  ereLoopAddOr(Whe
2bd20 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
2bd30 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b  Builder, Bitmask
2bd40 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72   mExtra){.  Wher
2bd50 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
2bd60 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
2bd70 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
2bd80 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  *pWC;.  WhereLoo
2bd90 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65  p *pNew;.  Where
2bda0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57  Term *pTerm, *pW
2bdb0 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  CEnd;.  int rc =
2bdc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2bdd0 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43  t iCur;.  WhereC
2bde0 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
2bdf0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2be00 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68   sSubBuild;.  Wh
2be10 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73  ereOrSet sSum, s
2be20 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Cur;.  struct Sr
2be30 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2be40 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42  m;.  .  pWC = pB
2be50 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69  uilder->pWC;.  i
2be60 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
2be70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e  Flags & WHERE_AN
2be80 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20  D_ONLY ) return 
2be90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43  SQLITE_OK;.  pWC
2bea0 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
2beb0 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65  WC->nTerm;.  pNe
2bec0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
2bed0 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  ew;.  memset(&sS
2bee0 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  um, 0, sizeof(sS
2bef0 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  um));.  pItem = 
2bf00 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2bf10 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
2bf20 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
2bf30 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f  ->iCursor;..  fo
2bf40 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
2bf50 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20  pTerm<pWCEnd && 
2bf60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
2bf70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
2bf80 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2bf90 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20  or & WO_OR)!=0. 
2bfa0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
2bfb0 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
2bfc0 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ble & pNew->mask
2bfd0 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b  Self)!=0 .    ){
2bfe0 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
2bff0 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  se * const pOrWC
2c000 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
2c010 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
2c020 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
2c030 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f  t pOrWCEnd = &pO
2c040 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54  rWC->a[pOrWC->nT
2c050 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72  erm];.      Wher
2c060 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a  eTerm *pOrTerm;.
2c070 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d        int once =
2c080 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   1;.      int i,
2c090 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73   j;.    .      s
2c0a0 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69  SubBuild = *pBui
2c0b0 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62  lder;.      sSub
2c0c0 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d  Build.pOrderBy =
2c0d0 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75   0;.      sSubBu
2c0e0 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43  ild.pOrSet = &sC
2c0f0 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70  ur;..      for(p
2c100 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
2c110 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
2c120 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
2c130 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
2c140 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2c150 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20   WO_AND)!=0 ){. 
2c160 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
2c170 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72  ld.pWC = &pOrTer
2c180 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
2c190 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
2c1a0 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
2c1b0 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
2c1c0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  {.          temp
2c1d0 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  WC.pWInfo = pWC-
2c1e0 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  >pWInfo;.       
2c1f0 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72     tempWC.pOuter
2c200 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
2c210 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b    tempWC.op = TK
2c220 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20  _AND;.          
2c230 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31  tempWC.nTerm = 1
2c240 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
2c250 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
2c260 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
2c270 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57  ild.pWC = &tempW
2c280 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  C;.        }else
2c290 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
2c2a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
2c2b0 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d          sCur.n =
2c2c0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
2c2d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2c2e0 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28  ABLE.        if(
2c2f0 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
2c300 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
2c310 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2c320 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73  oopAddVirtual(&s
2c330 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
2c340 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2c350 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2c360 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2c370 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
2c380 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  ee(&sSubBuild, m
2c390 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20  Extra);.        
2c3a0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2c3b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c3c0 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a  || sCur.n==0 );.
2c3d0 20 20 20 20 20 20 20 20 69 66 28 20 73 43 75 72          if( sCur
2c3e0 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
2c3f0 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20     sSum.n = 0;. 
2c400 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2c410 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c420 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20  ( once ){.      
2c430 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
2c440 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20  &sSum, &sCur);. 
2c450 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
2c460 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
2c470 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
2c480 65 4f 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20  eOrSet sPrev;.  
2c490 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
2c4a0 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75  ove(&sPrev, &sSu
2c4b0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  m);.          sS
2c4c0 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
2c4d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2c4e0 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Prev.n; i++){.  
2c4f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2c500 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b  0; j<sCur.n; j++
2c510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c520 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26   whereOrInsert(&
2c530 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d  sSum, sPrev.a[i]
2c540 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61  .prereq | sCur.a
2c550 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20  [j].prereq,.    
2c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
2c580 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61  ogEstAdd(sPrev.a
2c590 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61  [i].rRun, sCur.a
2c5a0 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20  [j].rRun),.     
2c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
2c5d0 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  gEstAdd(sPrev.a[
2c5e0 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b  i].nOut, sCur.a[
2c5f0 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20  j].nOut));.     
2c600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c610 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2c620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
2c630 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
2c640 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
2c650 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
2c660 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2c670 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s = WHERE_MULTI_
2c680 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  OR;.      pNew->
2c690 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
2c6a0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
2c6b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73   = 0;.      mems
2c6c0 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20  et(&pNew->u, 0, 
2c6d0 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29  sizeof(pNew->u))
2c6e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
2c6f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c700 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29  & i<sSum.n; i++)
2c710 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  {.        /* TUN
2c720 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73  ING: Currently s
2c730 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73  Sum.a[i].rRun is
2c740 20 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20   set to the sum 
2c750 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20  of the costs.   
2c760 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73       ** of all s
2c770 75 62 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65  ub-scans require
2c780 64 20 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e  d by the OR-scan
2c790 2e 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74  . However, due t
2c7a0 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20  o rounding.     
2c7b0 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74     ** errors, it
2c7c0 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 65   may be that the
2c7d0 20 63 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d   cost of the OR-
2c7e0 73 63 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f  scan is equal to
2c7f0 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   its.        ** 
2c800 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65 20 73  most expensive s
2c810 75 62 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65  ub-scan. Add the
2c820 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62   smallest possib
2c830 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20  le penalty .    
2c840 20 20 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65      ** (equivale
2c850 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e  nt to multiplyin
2c860 67 20 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e  g the cost by 1.
2c870 30 37 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68  07) to ensure th
2c880 61 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  at .        ** t
2c890 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70  his does not hap
2c8a0 70 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  pen. Otherwise, 
2c8b0 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
2c8c0 73 20 73 75 63 68 20 61 73 20 74 68 65 0a 20 20  s such as the.  
2c8d0 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
2c8e0 6e 67 20 77 68 65 72 65 20 74 68 65 72 65 20 69  ng where there i
2c8f0 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79  s an index on "y
2c900 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ":.        **.  
2c910 20 20 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45        **     WHE
2c920 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d  RE likelihood(x=
2c930 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a  ?, 0.99) OR y=?.
2c940 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2c950 20 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65     ** the planne
2c960 72 20 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22  r may elect to "
2c970 4f 52 22 20 74 6f 67 65 74 68 65 72 20 61 20 66  OR" together a f
2c980 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61  ull-table scan a
2c990 6e 64 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  nd an.        **
2c9a0 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41   index lookup. A
2c9b0 6e 64 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72  nd other similar
2c9c0 6c 79 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20  ly odd results. 
2c9d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
2c9e0 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b  ->rRun = sSum.a[
2c9f0 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20  i].rRun + 1;.   
2ca00 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2ca10 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74  = sSum.a[i].nOut
2ca20 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2ca30 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b  prereq = sSum.a[
2ca40 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20  i].prereq;.     
2ca50 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2ca60 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2ca70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
2ca80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ca90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2caa0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
2cab0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
2cac0 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74  ll tables .*/.st
2cad0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
2cae0 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f  opAddAll(WhereLo
2caf0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
2cb00 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
2cb10 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
2cb20 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2cb30 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d  Bitmask mExtra =
2cb40 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   0;.  Bitmask mP
2cb50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rior = 0;.  int 
2cb60 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20  iTab;.  SrcList 
2cb70 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
2cb80 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
2cb90 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2cba0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
2cbb0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
2cbc0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
2cbd0 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d    int nTabList =
2cbe0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
2cbf0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2cc00 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f  TE_OK;.  u8 prio
2cc10 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20  rJoinType = 0;. 
2cc20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
2cc30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  ;..  /* Loop ove
2cc40 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  r the tables in 
2cc50 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c  the join, from l
2cc60 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a  eft to right */.
2cc70 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
2cc80 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65  r->pNew;.  where
2cc90 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a  LoopInit(pNew);.
2cca0 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49    for(iTab=0, pI
2ccb0 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  tem=pTabList->a;
2ccc0 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20   iTab<nTabList; 
2ccd0 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  iTab++, pItem++)
2cce0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62  {.    pNew->iTab
2ccf0 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65   = iTab;.    pNe
2cd00 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65  w->maskSelf = ge
2cd10 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
2cd20 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e  MaskSet, pItem->
2cd30 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  iCursor);.    if
2cd40 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  ( ((pItem->joint
2cd50 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70  ype|priorJoinTyp
2cd60 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
2cd70 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
2cd80 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50       mExtra = mP
2cd90 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rior;.    }.    
2cda0 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20  priorJoinType = 
2cdb0 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  pItem->jointype;
2cdc0 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
2cdd0 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
2cde0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
2cdf0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
2ce00 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  l(pBuilder, mExt
2ce10 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ra);.    }else{.
2ce20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2ce30 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
2ce40 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
2ce50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2ce60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ce70 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2ce80 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
2ce90 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
2cea0 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20  }.    mPrior |= 
2ceb0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
2cec0 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62      if( rc || db
2ced0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2cee0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68   break;.  }.  wh
2cef0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
2cf00 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
2cf10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
2cf20 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
2cf30 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
2cf40 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
2cf50 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
2cf60 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 5th.** parame
2cf70 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
2cf80 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
2cf90 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
2cfa0 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
2cfb0 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
2cfc0 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
2cfd0 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65  eparate sort ope
2cfe0 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ration.  Return 
2cff0 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a  N:.** .**   N>0:
2d000 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68     N terms of th
2d010 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2d020 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
2d030 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74  **   N==0:  No t
2d040 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
2d050 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
2d060 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
2d070 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65  <0:   Unknown ye
2d080 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73  t how many terms
2d090 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67   of ORDER BY mig
2d0a0 68 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e  ht be satisfied.
2d0b0 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74     .**.** Note t
2d0c0 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66  hat processing f
2d0d0 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  or WHERE_GROUPBY
2d0e0 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49   and WHERE_DISTI
2d0f0 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a  NCTBY is not as.
2d100 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68  ** strict.  With
2d110 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
2d120 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20  STINCT the only 
2d130 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74  requirement is t
2d140 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  hat.** equivalen
2d150 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d  t rows appear im
2d160 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65  mediately adjace
2d170 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65  nt to one anothe
2d180 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20  r.  GROUP BY.** 
2d190 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20  and DISTINCT do 
2d1a0 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73  not require rows
2d1b0 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e   to appear in an
2d1c0 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  y particular ord
2d1d0 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73  er as long.** as
2d1e0 20 65 71 75 69 76 65 6c 65 6e 74 20 72 6f 77 73   equivelent rows
2d1f0 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
2d200 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72  ether.  Thus for
2d210 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
2d220 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f  STINCT.** the pO
2d230 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e  rderBy terms can
2d240 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61   be matched in a
2d250 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20  ny order.  With 
2d260 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a  ORDER BY, the .*
2d270 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  * pOrderBy terms
2d280 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64   must be matched
2d290 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d   in strict left-
2d2a0 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a  to-right order..
2d2b0 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65  */.static i8 whe
2d2c0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
2d2d0 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49  rderBy(.  WhereI
2d2e0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20  nfo *pWInfo,    
2d2f0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
2d300 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
2d310 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
2d320 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  * ORDER BY or GR
2d330 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e  OUP BY or DISTIN
2d340 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65  CT clause to che
2d350 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  ck */.  WherePat
2d360 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a  h *pPath,     /*
2d370 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74   The WherePath t
2d380 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36  o check */.  u16
2d390 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
2d3a0 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74     /* Might cont
2d3b0 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42  ain WHERE_GROUPB
2d3c0 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49  Y or WHERE_DISTI
2d3d0 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e  NCTBY */.  u16 n
2d3e0 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  Loop,           
2d3f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
2d400 74 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e  tries in pPath->
2d410 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65  aLoop[] */.  Whe
2d420 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20  reLoop *pLast,  
2d430 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57     /* Add this W
2d440 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20  hereLoop to the 
2d450 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c  end of pPath->aL
2d460 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61  oop[] */.  Bitma
2d470 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20  sk *pRevMask    
2d480 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66   /* OUT: Mask of
2d490 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72   WhereLoops to r
2d4a0 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  un in reverse or
2d4b0 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72  der */.){.  u8 r
2d4c0 65 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20  evSet;          
2d4d0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76    /* True if rev
2d4e0 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75   is known */.  u
2d4f0 38 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  8 rev;          
2d500 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74       /* Composit
2d510 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  e sort order */.
2d520 20 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20    u8 revIdx;    
2d530 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2d540 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
2d550 20 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69   u8 isOrderDisti
2d560 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72  nct;   /* All pr
2d570 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61  ior WhereLoops a
2d580 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  re order-distinc
2d590 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e  t */.  u8 distin
2d5a0 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20  ctColumns;   /* 
2d5b0 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70  True if the loop
2d5c0 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20   has UNIQUE NOT 
2d5d0 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
2d5e0 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20    u8 isMatch;   
2d5f0 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75          /* iColu
2d600 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72  mn matches a ter
2d610 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
2d620 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31  Y clause */.  u1
2d630 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  6 nKeyCol;      
2d640 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d650 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   key columns in 
2d660 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20  pIndex */.  u16 
2d670 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  nColumn;        
2d680 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
2d690 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c  r of ordered col
2d6a0 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
2d6b0 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65  x */.  u16 nOrde
2d6c0 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
2d6d0 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20  Number terms in 
2d6e0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2d6f0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  use */.  int iLo
2d700 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  op;            /
2d710 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65  * Index of Where
2d720 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65  Loop in pPath be
2d730 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  ing processed */
2d740 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
2d750 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2d760 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
2d770 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
2d780 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
2d790 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e  umber for curren
2d7a0 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20  t WhereLoop */. 
2d7b0 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
2d7c0 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75         /* A colu
2d7d0 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
2d7e0 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20   table iCur */. 
2d7f0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
2d800 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e  p = 0; /* Curren
2d810 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e  t WhereLoop bein
2d820 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a  g processed. */.
2d830 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2d840 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e  rm;     /* A sin
2d850 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
2d860 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2d870 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b    Expr *pOBExpr;
2d880 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
2d890 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
2d8a0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2d8b0 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e */.  CollSeq *
2d8c0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20  pColl;       /* 
2d8d0 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e  COLLATE function
2d8e0 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42   from an ORDER B
2d8f0 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  Y clause term */
2d900 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
2d910 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
2d920 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
2d930 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20   with pLoop */. 
2d940 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2d950 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2d960 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
2d970 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
2d980 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20  Bitmask obSat = 
2d990 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  0;    /* Mask of
2d9a0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2d9b0 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72  satisfied so far
2d9c0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
2d9d0 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Done;       /* M
2d9e0 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52  ask of all ORDER
2d9f0 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42   BY terms */.  B
2da00 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74  itmask orderDist
2da10 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61  inctMask;  /* Ma
2da20 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f  sk of all well-o
2da30 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a  rdered loops */.
2da40 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b    Bitmask ready;
2da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2da60 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c   Mask of inner l
2da70 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  oops */..  /*.  
2da80 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
2da90 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d  ereLoop is "one-
2daa0 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72  row" if it gener
2dab0 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ates no more tha
2dac0 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f  n one.  ** row o
2dad0 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65  f output.  A Whe
2dae0 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f  reLoop is one-ro
2daf0 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  w if all of the 
2db00 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
2db10 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c  ue:.  **  (a) Al
2db20 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
2db30 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45  match with WHERE
2db40 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a  _COLUMN_EQ..  **
2db50 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20    (b) The index 
2db60 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41  is unique.  ** A
2db70 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ny WhereLoop wit
2db80 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d  h an WHERE_COLUM
2db90 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  N_EQ constraint 
2dba0 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  on the rowid is 
2dbb0 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76  one-row..  ** Ev
2dbc0 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72  ery one-row Wher
2dbd0 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20  eLoop will have 
2dbe0 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  the WHERE_ONEROW
2dbf0 20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c   bit set in wsFl
2dc00 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ags..  **.  ** W
2dc10 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
2dc20 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69  oop is "order-di
2dc30 73 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73  stinct" if the s
2dc40 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72  et of columns fr
2dc50 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65  om.  ** that Whe
2dc60 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20  reLoop that are 
2dc70 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
2dc80 63 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65  clause are diffe
2dc90 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20  rent for every. 
2dca0 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57   ** row of the W
2dcb0 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79  hereLoop.  Every
2dcc0 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
2dcd0 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  op is automatica
2dce0 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64  lly.  ** order-d
2dcf0 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65  istinct.   A Whe
2dd00 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20  reLoop that has 
2dd10 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  no columns in th
2dd20 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2dd30 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72  e.  ** is not or
2dd40 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f  der-distinct. To
2dd50 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
2dd60 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20  ct is not quite 
2dd70 74 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e  the same as bein
2dd80 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69  g.  ** UNIQUE si
2dd90 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c  nce a UNIQUE col
2dda0 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  umn or index can
2ddb0 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72   have multiple r
2ddc0 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61  ows that .  ** a
2ddd0 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c  re NULL and NULL
2dde0 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69   values are equi
2ddf0 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70  valent for the p
2de00 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d  urpose of order-
2de10 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54  distinct..  ** T
2de20 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69  o be order-disti
2de30 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73  nct, the columns
2de40 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20   must be UNIQUE 
2de50 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20  and NOT NULL..  
2de60 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  **.  ** The rowi
2de70 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73  d for a table is
2de80 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61   always UNIQUE a
2de90 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77  nd NOT NULL so w
2dea0 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a  henever the.  **
2deb0 20 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69   rowid appears i
2dec0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2ded0 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65  lause, the corre
2dee0 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f  sponding WhereLo
2def0 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d  op is.  ** autom
2df00 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64  atically order-d
2df10 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20  istinct..  */.. 
2df20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
2df30 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c  y!=0 );.  if( nL
2df40 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  oop && Optimizat
2df50 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
2df60 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
2df70 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  xJoin) ) return 
2df80 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d  0;..  nOrderBy =
2df90 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
2dfa0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f  ;.  testcase( nO
2dfb0 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b  rderBy==BMS-1 );
2dfc0 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e  .  if( nOrderBy>
2dfd0 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30  BMS-1 ) return 0
2dfe0 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74  ;  /* Cannot opt
2dff0 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72  imize overly lar
2e000 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a  ge ORDER BYs */.
2e010 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2e020 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20  t = 1;.  obDone 
2e030 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72  = MASKBIT(nOrder
2e040 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69  By)-1;.  orderDi
2e050 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a  stinctMask = 0;.
2e060 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66    ready = 0;.  f
2e070 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72  or(iLoop=0; isOr
2e080 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f  derDistinct && o
2e090 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69  bSat<obDone && i
2e0a0 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f  Loop<=nLoop; iLo
2e0b0 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69  op++){.    if( i
2e0c0 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c  Loop>0 ) ready |
2e0d0 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
2e0e0 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69  f;.    pLoop = i
2e0f0 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61  Loop<nLoop ? pPa
2e100 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  th->aLoop[iLoop]
2e110 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66   : pLast;.    if
2e120 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2e130 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2e140 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69  TABLE ){.      i
2e150 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  f( pLoop->u.vtab
2e160 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53  .isOrdered ) obS
2e170 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20  at = obDone;.   
2e180 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2e190 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66      iCur = pWInf
2e1a0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2e1b0 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72  Loop->iTab].iCur
2e1c0 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  sor;..    /* Mar
2e1d0 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20  k off any ORDER 
2e1e0 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69  BY term X that i
2e1f0 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  s a column in th
2e200 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
2e210 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  * the current lo
2e220 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  op for which the
2e230 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68  re is term in th
2e240 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63  e WHERE.    ** c
2e250 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
2e260 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58  m X IS NULL or X
2e270 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  =? that referenc
2e280 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20  e only outer.   
2e290 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a   ** loops..    *
2e2a0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
2e2b0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
2e2c0 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42  .      if( MASKB
2e2d0 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
2e2e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2e2f0 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
2e300 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
2e310 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
2e320 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
2e330 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
2e340 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
2e350 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
2e360 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
2e370 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
2e380 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
2e390 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d  indTerm(&pWInfo-
2e3a0 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45  >sWC, iCur, pOBE
2e3b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  xpr->iColumn,.  
2e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3d0 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f       ~ready, WO_
2e3e0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29  EQ|WO_ISNULL, 0)
2e3f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
2e400 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
2e410 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
2e420 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  m->eOperator&WO_
2e430 45 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70  EQ)!=0 && pOBExp
2e440 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  r->iColumn>=0 ){
2e450 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2e460 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20  har *z1, *z2;.  
2e470 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2e480 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2e490 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
2e4a0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2e4b0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2e4c0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
2e4d0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
2e4e0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ll;.        z1 =
2e4f0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
2e500 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
2e510 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2e520 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
2e530 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b  , pTerm->pExpr);
2e540 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
2e550 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
2e560 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2e570 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d       z2 = pColl-
2e580 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
2e590 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2e5a0 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20  mp(z1, z2)!=0 ) 
2e5b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2e5c0 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d  }.      obSat |=
2e5d0 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
2e5e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f   }..    if( (pLo
2e5f0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2e600 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29  ERE_ONEROW)==0 )
2e610 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  {.      if( pLoo
2e620 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2e630 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20  RE_IPK ){.      
2e640 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
2e650 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
2e660 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  0;.        nColu
2e670 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  mn = 1;.      }e
2e680 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20  lse if( (pIndex 
2e690 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2e6a0 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70  .pIndex)==0 || p
2e6b0 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
2e6c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
2e6d0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
2e6e0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79  se{.        nKey
2e6f0 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b  Col = pIndex->nK
2e700 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e  eyCol;.        n
2e710 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
2e720 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
2e730 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
2e740 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20  n==nKeyCol+1 || 
2e750 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
2e760 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20  ->pTable) );.   
2e770 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
2e780 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
2e790 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c  olumn-1]==(-1) |
2e7a0 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64  | !HasRowid(pInd
2e7b0 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20  ex->pTable));.  
2e7c0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2e7d0 74 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e  tinct = pIndex->
2e7e0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
2e7f0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2e800 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
2e810 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
2e820 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65  the index and de
2e830 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73  al with the ones
2e840 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61  .      ** that a
2e850 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e  re not constrain
2e860 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a  ed by == or IN..
2e870 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2e880 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b  ev = revSet = 0;
2e890 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43  .      distinctC
2e8a0 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20  olumns = 0;.    
2e8b0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
2e8c0 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
2e8d0 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20      u8 bOnce;   
2e8e0 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
2e8f0 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
2e900 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
2e910 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72      /* Skip over
2e920 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20   == and IS NULL 
2e930 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20  terms */.       
2e940 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
2e950 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
2e960 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62     && pLoop->u.b
2e970 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20  tree.nSkip==0.  
2e980 20 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20         && ((i = 
2e990 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
2e9a0 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28  ->eOperator) & (
2e9b0 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
2e9c0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )!=0.        ){.
2e9d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20            if( i 
2e9e0 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
2e9f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2ea00 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
2ea10 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
2ea20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2ea30 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
2ea40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2ea50 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
2ea60 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2ea70 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   Get the column 
2ea80 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61  number in the ta
2ea90 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e  ble (iColumn) an
2eaa0 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20  d sort order.   
2eab0 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29       ** (revIdx)
2eac0 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f   for the j-th co
2ead0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
2eae0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  x..        */.  
2eaf0 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
2eb00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43   ){.          iC
2eb10 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
2eb20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
2eb30 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
2eb40 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
2eb50 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  er[j];.         
2eb60 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
2eb70 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  ndex->pTable->iP
2eb80 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20  Key ) iColumn = 
2eb90 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
2eba0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  e{.          iCo
2ebb0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
2ebc0 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b       revIdx = 0;
2ebd0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2ebe0 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73      /* An uncons
2ebf0 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74  trained column t
2ec00 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  hat might be NUL
2ec10 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  L means that thi
2ec20 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65  s.        ** Whe
2ec30 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65  reLoop is not we
2ec40 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20  ll-ordered.     
2ec50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2ec60 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2ec70 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43  t.         && iC
2ec80 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20  olumn>=0.       
2ec90 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75    && j>=pLoop->u
2eca0 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
2ecb0 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70      && pIndex->p
2ecc0 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
2ecd0 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a  umn].notNull==0.
2ece0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2ecf0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2ed00 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
2ed10 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2ed20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42  Find the ORDER B
2ed30 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72  Y term that corr
2ed40 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a  esponds to the j
2ed50 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20  -th column.     
2ed60 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64     ** of the ind
2ed70 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74  ex and mark that
2ed80 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f   ORDER BY term o
2ed90 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ff .        */. 
2eda0 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31         bOnce = 1
2edb0 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63  ;.        isMatc
2edc0 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  h = 0;.        f
2edd0 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26  or(i=0; bOnce &&
2ede0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
2edf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2ee00 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
2ee10 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
2ee20 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70            pOBExp
2ee30 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
2ee40 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
2ee50 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
2ee60 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2ee70 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
2ee80 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
2ee90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
2eea0 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
2eeb0 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
2eec0 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20  NCTBY );.       
2eed0 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
2eee0 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55  gs & (WHERE_GROU
2eef0 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  PBY|WHERE_DISTIN
2ef00 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63  CTBY))==0 ) bOnc
2ef10 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2ef20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
2ef30 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
2ef40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ef50 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2ef60 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
2ef70 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ef80 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2ef90 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
2efa0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2efb0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
2efc0 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
2efd0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2efe0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2eff0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2f000 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2f010 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
2f020 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
2f030 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
2f040 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
2f050 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2f060 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
2f070 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  e, pIndex->azCol
2f080 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69  l[j])!=0 ) conti
2f090 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2f0a0 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74  .          isMat
2f0b0 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
2f0c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2f0d0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
2f0e0 73 4d 61 74 63 68 20 26 26 20 28 70 57 49 6e 66  sMatch && (pWInf
2f0f0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2f100 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d  WHERE_GROUPBY)==
2f110 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
2f120 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
2f130 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f  sort order is co
2f140 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f  mpatible in an O
2f150 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
2f160 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72            ** Sor
2f170 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c  t order is irrel
2f180 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55  evant for a GROU
2f190 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a  P BY clause. */.
2f1a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
2f1b0 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  vSet ){.        
2f1c0 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72      if( (rev ^ r
2f1d0 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79  evIdx)!=pOrderBy
2f1e0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2f1f0 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a   ) isMatch = 0;.
2f200 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2f210 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76  .            rev
2f220 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64   = revIdx ^ pOrd
2f230 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
2f240 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rder;.          
2f250 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65    if( rev ) *pRe
2f260 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  vMask |= MASKBIT
2f270 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  (iLoop);.       
2f280 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b       revSet = 1;
2f290 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2f2b0 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20  f( isMatch ){.  
2f2c0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
2f2d0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
2f2e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
2f2f0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d  istinctColumns==
2f300 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
2f310 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2f320 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2f330 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  }.          obSa
2f340 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
2f350 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2f360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
2f370 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20  match found */. 
2f380 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
2f390 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29  0 || j<nKeyCol )
2f3a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
2f3b0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
2f3c0 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
2f3d0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2f3e0 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
2f3f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f400 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f410 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
2f420 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61   end Loop over a
2f430 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
2f440 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69   */.      if( di
2f450 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b  stinctColumns ){
2f460 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2f470 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
2f480 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
2f490 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2f4a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2f4b0 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f    } /* end-if no
2f4c0 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20  t one-row */..  
2f4d0 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
2f4e0 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59  y other ORDER BY
2f4f0 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65   terms that refe
2f500 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20  rence pLoop */. 
2f510 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
2f520 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
2f530 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2f540 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  k |= pLoop->mask
2f550 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28  Self;.      for(
2f560 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
2f570 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
2f580 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  xpr *p;.        
2f590 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20  Bitmask mTerm;. 
2f5a0 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
2f5b0 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
2f5c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2f5d0 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e    p = pOrderBy->
2f5e0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2f5f0 20 20 20 20 6d 54 65 72 6d 20 3d 20 65 78 70 72      mTerm = expr
2f600 54 61 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e  TableUsage(&pWIn
2f610 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b  fo->sMaskSet,p);
2f620 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65  .        if( mTe
2f630 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65  rm==0 && !sqlite
2f640 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
2f650 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  p) ) continue;. 
2f660 20 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72         if( (mTer
2f670 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74  m&~orderDistinct
2f680 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
2f690 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
2f6a0 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
2f6b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2f6c0 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68   }.  } /* End th
2f6d0 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  e loop over all 
2f6e0 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20  WhereLoops from 
2f6f0 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20  outer-most down 
2f700 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f  to inner-most */
2f710 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62  .  if( obSat==ob
2f720 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69  Done ) return (i
2f730 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  8)nOrderBy;.  if
2f740 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e  ( !isOrderDistin
2f750 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ct ){.    for(i=
2f760 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b  nOrderBy-1; i>0;
2f770 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74   i--){.      Bit
2f780 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54  mask m = MASKBIT
2f790 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69  (i) - 1;.      i
2f7a0 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20  f( (obSat&m)==m 
2f7b0 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20  ) return i;.    
2f7c0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
2f7d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
2f7e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
2f7f0 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
2f800 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74  flag is set in t
2f810 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74  he mask passed t
2f820 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
2f830 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c  gin(),.** the pl
2f840 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68  anner assumes th
2f850 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64  at the specified
2f860 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69   pOrderBy list i
2f870 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f  s actually a GRO
2f880 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20  UP.** BY clause 
2f890 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64  - and so any ord
2f8a0 65 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72  er that groups r
2f8b0 6f 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20  ows as required 
2f8c0 73 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a  satisfies the.**
2f8d0 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20   request..**.** 
2f8e0 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69  Normally, in thi
2f8f0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
2f900 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
2f910 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65  e caller to dete
2f920 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72  rmine.** whether
2f930 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73   or not the rows
2f940 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e   are really bein
2f950 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73  g delivered in s
2f960 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a  orted order, or.
2f970 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20  ** just in some 
2f980 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74  other order that
2f990 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65   provides the re
2f9a0 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e  quired grouping.
2f9b0 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20   However,.** if 
2f9c0 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59  the WHERE_SORTBY
2f9d0 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c  GROUP flag is al
2f9e0 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  so passed to sql
2f9f0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2fa00 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  , then.** this f
2fa10 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
2fa20 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74  alled on the ret
2fa30 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20  urned WhereInfo 
2fa40 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72  object. It retur
2fa50 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  ns.** true if th
2fa60 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69  e rows really wi
2fa70 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20  ll be sorted in 
2fa80 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72  the specified or
2fa90 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a  der, or false.**
2faa0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
2fab0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61  * For example, a
2fac0 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  ssuming:.**.**  
2fad0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
2fae0 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a   ON t1(x, Y);.**
2faf0 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20  .** then.**.**  
2fb00 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2fb10 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f  1 GROUP BY x,y O
2fb20 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d  RDER BY x,y;   -
2fb30 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a  - IsSorted()==1.
2fb40 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2fb50 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79  OM t1 GROUP BY y
2fb60 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b  ,x ORDER BY y,x;
2fb70 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29     -- IsSorted()
2fb80 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ==0.*/.int sqlit
2fb90 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28  e3WhereIsSorted(
2fba0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2fbb0 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57  o){.  assert( pW
2fbc0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2fbd0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
2fbe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
2fbf0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2fc00 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   & WHERE_SORTBYG
2fc10 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e  ROUP );.  return
2fc20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b   pWInfo->sorted;
2fc30 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  .}..#ifdef WHERE
2fc40 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
2fc50 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75   For debugging u
2fc60 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74  se only: */.stat
2fc70 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
2fc80 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65  herePathName(Whe
2fc90 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69  rePath *pPath, i
2fca0 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c  nt nLoop, WhereL
2fcb0 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73  oop *pLast){.  s
2fcc0 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65  tatic char zName
2fcd0 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  [65];.  int i;. 
2fce0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f   for(i=0; i<nLoo
2fcf0 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69  p; i++){ zName[i
2fd00 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  ] = pPath->aLoop
2fd10 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66  [i]->cId; }.  if
2fd20 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b  ( pLast ) zName[
2fd30 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49  i++] = pLast->cI
2fd40 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  d;.  zName[i] = 
2fd50 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d  0;.  return zNam
2fd60 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
2fd70 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73  ** Given the lis
2fd80 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  t of WhereLoop o
2fd90 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f  bjects at pWInfo
2fda0 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72  ->pLoops, this r
2fdb0 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70  outine.** attemp
2fdc0 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ts to find the l
2fdd0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
2fde0 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68  that visits each
2fdf0 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e   WhereLoop.** on
2fe00 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69  ce.  This path i
2fe10 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e  s then loaded in
2fe20 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61  to the pWInfo->a
2fe30 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73  [].pWLoop fields
2fe40 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74  ..**.** Assume t
2fe50 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  hat the total nu
2fe60 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
2fe70 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65  ows that will ne
2fe80 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a  ed to be sorted.
2fe90 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45  ** will be nRowE
2fea0 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f  st (in the 10*lo
2feb0 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  g2 representatio
2fec0 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20  n).  Or, ignore 
2fed0 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73  sorting.** costs
2fee0 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a   if nRowEst==0..
2fef0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
2ff00 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
2ff10 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  s or SQLITE_NOME
2ff20 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M of a memory al
2ff30 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f  location.** erro
2ff40 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
2ff50 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
2ff60 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66  hSolver(WhereInf
2ff70 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73  o *pWInfo, LogEs
2ff80 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e  t nRowEst){.  in
2ff90 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20  t mxChoice;     
2ffa0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2ffb0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  um number of sim
2ffc0 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20  ultaneous paths 
2ffd0 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  tracked */.  int
2ffe0 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   nLoop;         
2fff0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30000 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
30010 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65   join */.  Parse
30020 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
30030 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
30040 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
30050 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
30060 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
30070 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
30080 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  n */.  int iLoop
30090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
300a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
300b0 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20   over the terms 
300c0 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
300d0 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20   int ii, jj;    
300e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
300f0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
30100 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20   int mxI = 0;   
30110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
30120 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72  dex of next entr
30130 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a  y to replace */.
30140 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
30150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30160 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
30170 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a  Y clause terms *
30180 2f 0a 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74  /.  LogEst rCost
30190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
301a0 20 43 6f 73 74 20 6f 66 20 61 20 70 61 74 68 20   Cost of a path 
301b0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  */.  LogEst nOut
301c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
301d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  * Number of outp
301e0 75 74 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  uts */.  LogEst 
301f0 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20  mxCost = 0;     
30200 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
30210 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
30220 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  aths */.  LogEst
30230 20 6d 78 4f 75 74 20 3d 20 30 3b 20 20 20 20 20   mxOut = 0;     
30240 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
30250 4f 75 74 20 76 61 6c 75 65 20 6f 6e 20 74 68 65  Out value on the
30260 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
30270 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
30280 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
30290 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
302a0 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
302b0 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
302c0 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
302d0 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
302e0 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
302f0 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
30300 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
30310 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
30320 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
30330 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
30340 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
30350 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
30360 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
30370 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
30380 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
30390 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
303a0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
303b0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
303c0 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
303d0 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
303e0 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
303f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
30400 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
30410 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
30420 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
30430 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
30440 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
30450 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
30460 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
30470 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
30480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30490 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
304a0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
304b0 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72  utine */..  pPar
304c0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
304d0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
304e0 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
304f0 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
30500 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46  ;.  /* TUNING: F
30510 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65  or simple querie
30520 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74  s, only the best
30530 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64   path is tracked
30540 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79  ..  ** For 2-way
30550 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65   joins, the 5 be
30560 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c  st paths are fol
30570 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  lowed..  ** For 
30580 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f  joins of 3 or mo
30590 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b  re tables, track
305a0 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74   the 10 best pat
305b0 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65  hs */.  mxChoice
305c0 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20   = (nLoop==1) ? 
305d0 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20  1 : (nLoop==2 ? 
305e0 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72  5 : 10);.  asser
305f0 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f  t( nLoop<=pWInfo
30600 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
30610 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45   );.  WHERETRACE
30620 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62  (0x002, ("---- b
30630 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29  egin solver\n"))
30640 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
30650 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
30660 73 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e  space for aTo an
30670 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20  d aFrom */.  ii 
30680 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
30690 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
306a0 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
306b0 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70  xChoice*2;.  pSp
306c0 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ace = sqlite3DbM
306d0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29  allocRaw(db, ii)
306e0 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d  ;.  if( pSpace==
306f0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
30700 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d  E_NOMEM;.  aTo =
30710 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70   (WherePath*)pSp
30720 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61  ace;.  aFrom = a
30730 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d  To+mxChoice;.  m
30740 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20  emset(aFrom, 0, 
30750 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29  sizeof(aFrom[0])
30760 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65  );.  pX = (Where
30770 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78  Loop**)(aFrom+mx
30780 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69  Choice);.  for(i
30790 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46  i=mxChoice*2, pF
307a0 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69  rom=aTo; ii>0; i
307b0 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58  i--, pFrom++, pX
307c0 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20   += nLoop){.    
307d0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70  pFrom->aLoop = p
307e0 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  X;.  }..  /* See
307f0 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
30800 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
30810 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
30820 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
30830 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
30840 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
30850 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
30860 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
30870 32 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  25.  If the cost
30880 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
30890 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
308a0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
308b0 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
308c0 65 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20  e first 25.  ** 
308d0 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
308e0 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
308f0 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
30900 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
30910 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
30920 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73  ryLoop, 46);  as
30930 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65  sert( 46==sqlite
30940 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20  3LogEst(25) );. 
30950 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f   nFrom = 1;..  /
30960 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65  * Precompute the
30970 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
30980 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
30990 74 20 73 65 74 2c 20 69 66 20 74 68 65 20 63 61  t set, if the ca
309a0 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  ller.  ** to sql
309b0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
309c0 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61   was concerned a
309d0 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a  bout sorting */.
309e0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
309f0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f  rderBy==0 || nRo
30a00 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  wEst==0 ){.    a
30a10 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
30a20 64 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 72 64 65  d = 0;.    nOrde
30a30 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
30a40 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  {.    aFrom[0].i
30a50 73 4f 72 64 65 72 65 64 20 3d 20 2d 31 3b 0a 20  sOrdered = -1;. 
30a60 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57     nOrderBy = pW
30a70 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
30a80 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nExpr;.  }..  /*
30a90 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   Compute success
30aa0 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65  ively longer Whe
30ab0 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68  rePaths using th
30ac0 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72  e previous gener
30ad0 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68  ation.  ** of Wh
30ae0 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20  erePaths as the 
30af0 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65  basis for the ne
30b00 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20  xt.  Keep track 
30b10 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
30b20 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20    ** best paths 
30b30 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69  at each generati
30b40 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  on */.  for(iLoo
30b50 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
30b60 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
30b70 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nTo = 0;.    for
30b80 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72  (ii=0, pFrom=aFr
30b90 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  om; ii<nFrom; ii
30ba0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
30bb0 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70      for(pWLoop=p
30bc0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70  WInfo->pLoops; p
30bd0 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57  WLoop; pWLoop=pW
30be0 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29  Loop->pNextLoop)
30bf0 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
30c00 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20  k maskNew;.     
30c10 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
30c20 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sk = 0;.        
30c30 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70  i8 isOrdered = p
30c40 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
30c50 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
30c60 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e  Loop->prereq & ~
30c70 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
30c80 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
30c90 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
30ca0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20  oop->maskSelf & 
30cb0 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
30cc0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
30cd0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
30ce0 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
30cf0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
30d00 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
30d10 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
30d20 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
30d30 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f  t */.        rCo
30d40 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
30d50 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53  stAdd(pWLoop->rS
30d60 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75  etup,pWLoop->rRu
30d70 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29  n + pFrom->nRow)
30d80 3b 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74 20  ;.        rCost 
30d90 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
30da0 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f 6d 2d  dd(rCost, pFrom-
30db0 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  >rCost);.       
30dc0 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e   nOut = pFrom->n
30dd0 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f  Row + pWLoop->nO
30de0 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  ut;.        mask
30df0 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  New = pFrom->mas
30e00 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
30e10 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
30e20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c    if( isOrdered<
30e30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
30e40 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65  sOrdered = where
30e50 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
30e60 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20  erBy(pWInfo,.   
30e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e80 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
30e90 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49  erBy, pFrom, pWI
30ea0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c  nfo->wctrlFlags,
30eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30ec0 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70          iLoop, p
30ed0 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29  WLoop, &revMask)
30ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30ef0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20  isOrdered>=0 && 
30f00 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72  isOrdered<nOrder
30f10 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
30f20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74    /* TUNING: Est
30f30 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61  imated cost of a
30f40 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73   full external s
30f50 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ort, where N is 
30f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30f70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
30f80 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20  ws to sort is:. 
30f90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
30fa0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 63            **   c
30fb0 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a  ost = (3.0 * N *
30fc0 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 20 20 20 20   log(N))..      
30fd0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
30fe0 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20        ** Or, if 
30ff0 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61  the order-by cla
31000 75 73 65 20 68 61 73 20 58 20 74 65 72 6d 73 20  use has X terms 
31010 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73  but only the las
31020 74 20 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  t Y .           
31030 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75   ** terms are ou
31040 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e  t of order, then
31050 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77   block-sorting w
31060 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a  ill reduce the .
31070 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
31080 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a  orting cost to:.
31090 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
310a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20             **   
310b0 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
310c0 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58  * log(N)) * (Y/X
310d0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ).            **
310e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
310f0 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69  The (Y/X) term i
31100 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
31110 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61 62  ing stack variab
31120 6c 65 20 72 53 63 61 6c 65 0a 20 20 20 20 20 20  le rScale.      
31130 20 20 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20        ** below. 
31140 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
31150 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72  LogEst rScale, r
31160 53 6f 72 74 43 6f 73 74 3b 0a 20 20 20 20 20 20  SortCost;.      
31170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f        assert( nO
31180 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d  rderBy>0 && 66==
31190 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
311a0 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  0) );.          
311b0 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74    rScale = sqlit
311c0 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72  e3LogEst((nOrder
311d0 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2a 31 30  By-isOrdered)*10
311e0 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36  0/nOrderBy) - 66
311f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 53  ;.            rS
31200 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73  ortCost = nRowEs
31210 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45  t + estLog(nRowE
31220 73 74 29 20 2b 20 72 53 63 61 6c 65 20 2b 20 31  st) + rScale + 1
31230 36 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  6;..            
31240 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68 65 20 63  /* TUNING: The c
31250 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  ost of implement
31260 69 6e 67 20 44 49 53 54 49 4e 43 54 20 75 73 69  ing DISTINCT usi
31270 6e 67 20 61 20 42 2d 54 52 45 45 20 69 73 0a 20  ng a B-TREE is. 
31280 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69             ** si
31290 6d 69 6c 61 72 20 62 75 74 20 77 69 74 68 20 61  milar but with a
312a0 20 6c 61 72 67 65 72 20 63 6f 6e 73 74 61 6e 74   larger constant
312b0 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f 6e 61 6c   of proportional
312c0 69 74 79 2e 20 0a 20 20 20 20 20 20 20 20 20 20  ity. .          
312d0 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62 79    ** Multiply by
312e0 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 66   an additional f
312f0 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20 20 2a  actor of 3.0.  *
31300 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
31310 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
31320 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
31330 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
31340 20 20 20 20 20 20 20 20 20 20 20 20 72 53 6f 72              rSor
31350 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 20  tCost += 16;.   
31360 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31370 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
31380 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20  E(0x002,.       
31390 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73          ("---- s
313a0 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25  ort cost=%-3d (%
313b0 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73 20  d/%d) increases 
313c0 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64  cost %3d to %-3d
313d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
313e0 20 20 20 20 20 72 53 6f 72 74 43 6f 73 74 2c 20       rSortCost, 
313f0 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65  (nOrderBy-isOrde
31400 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20  red), nOrderBy, 
31410 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20  rCost,.         
31420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
31430 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c 72 53  gEstAdd(rCost,rS
31440 6f 72 74 43 6f 73 74 29 29 29 3b 0a 20 20 20 20  ortCost)));.    
31450 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
31460 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
31470 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73  (rCost, rSortCos
31480 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
31490 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
314a0 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
314b0 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
314c0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
314d0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
314e0 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73   see if pWLoop s
314f0 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74  hould be added t
31500 6f 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62  o the mxChoice b
31510 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
31520 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20        for(jj=0, 
31530 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b  pTo=aTo; jj<nTo;
31540 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
31550 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
31560 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b  ->maskLoop==mask
31570 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  New.           &
31580 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72  & ((pTo->isOrder
31590 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 38 30  ed^isOrdered)&80
315a0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
315b0 26 26 20 28 28 70 54 6f 2d 3e 72 43 6f 73 74 3c  && ((pTo->rCost<
315c0 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e  =rCost && pTo->n
315d0 52 6f 77 3c 3d 6e 4f 75 74 29 20 7c 7c 0a 20 20  Row<=nOut) ||.  
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
315f0 54 6f 2d 3e 72 43 6f 73 74 3e 3d 72 43 6f 73 74  To->rCost>=rCost
31600 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e   && pTo->nRow>=n
31610 4f 75 74 29 29 0a 20 20 20 20 20 20 20 20 20 20  Out)).          
31620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
31630 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f  estcase( jj==nTo
31640 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
31650 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
31660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
31670 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e         if( jj>=n
31680 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  To ){.          
31690 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
316a0 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f  e && rCost>=mxCo
316b0 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  st ){.#ifdef WHE
316c0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
316d0 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
316e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
316f0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
31700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
31710 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
31720 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
31730 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
31740 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
31750 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
31760 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
31770 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
31780 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
31790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317a0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
317b0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
317c0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
317d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
317e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
317f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31800 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 6e        /* Add a n
31810 65 77 20 50 61 74 68 20 74 6f 20 74 68 65 20 61  ew Path to the a
31820 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20  To[] set */.    
31830 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78        if( nTo<mx
31840 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
31850 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73        /* Increas
31860 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
31870 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65  e aTo set by one
31880 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
31890 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20  jj = nTo++;.    
318a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
318b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
318c0 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68  path replaces th
318d0 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f  e prior worst to
318e0 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f   keep count belo
318f0 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20  w mxChoice */.  
31900 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d            jj = m
31910 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xI;.          }.
31920 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20            pTo = 
31930 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66  &aTo[jj];.#ifdef
31940 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
31950 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
31960 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
31970 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
31980 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
31990 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
319a0 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63  ntf("New    %s c
319b0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
319c0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
319d0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
319e0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
319f0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
31a00 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
31a10 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31a20 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
31a30 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
31a40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
31a50 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dif.        }els
31a60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
31a70 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f   pTo->rCost<=rCo
31a80 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c  st && pTo->nRow<
31a90 3d 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65 66 20  =nOut ){.#ifdef 
31aa0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
31ab0 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
31ac0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
31ad0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
31ae0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
31af0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
31b00 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
31b10 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20            "Skip 
31b20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
31b30 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
31b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b50 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
31b60 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
31b70 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
31b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31b90 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
31ba0 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
31bb0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
31bc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
31bd0 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73  bugPrintf("   vs
31be0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64   %s cost=%-3d,%d
31bf0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
31c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c10 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
31c20 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
31c30 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
31c40 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
31c50 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
31c60 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f  Ordered>=0 ? pTo
31c70 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ->isOrdered+'0' 
31c80 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
31c90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31ca0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
31cb0 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
31cc0 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Cost );.        
31cd0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
31ce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31cf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
31d00 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b  o->rCost==rCost+
31d10 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 );.          /
31d20 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74  * A new and bett
31d30 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70  er score for a p
31d40 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65  reviously create
31d50 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74  d equivalent pat
31d60 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  h */.#ifdef WHER
31d70 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
31d80 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
31d90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
31da0 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
31db0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31dc0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
31dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31de0 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d  "Update %s cost=
31df0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
31e00 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
31e10 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
31e20 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
31e30 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
31e40 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
31e50 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
31e60 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
31e70 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
31e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
31e90 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73  bugPrintf("  was
31ea0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
31eb0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
31ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
31ed0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
31ee0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
31ef0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
31f00 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
31f10 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
31f20 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
31f30 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
31f40 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
31f50 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
31f60 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
31f70 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
31f80 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
31f90 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
31fa0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
31fb0 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
31fc0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
31fd0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
31fe0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
31ff0 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
32000 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
32010 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20  Row = nOut;.    
32020 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
32030 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
32040 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
32050 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
32060 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
32070 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
32080 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
32090 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
320a0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
320b0 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
320c0 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
320d0 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
320e0 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d  .          mxI =
320f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   0;.          mx
32100 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43  Cost = aTo[0].rC
32110 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  ost;.          m
32120 78 4f 75 74 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52  xOut = aTo[0].nR
32130 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ow;.          fo
32140 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
32150 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
32160 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
32170 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32180 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
32190 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74  t || (pTo->rCost
321a0 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d  ==mxCost && pTo-
321b0 3e 6e 52 6f 77 3e 6d 78 4f 75 74 29 20 29 7b 0a  >nRow>mxOut) ){.
321c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
321d0 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73  Cost = pTo->rCos
321e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
321f0 20 6d 78 4f 75 74 20 3d 20 70 54 6f 2d 3e 6e 52   mxOut = pTo->nR
32200 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow;.            
32210 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20    mxI = jj;.    
32220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32230 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
32240 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
32250 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
32260 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32  _ENABLED  /* >=2
32270 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
32280 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32  te3WhereTrace>=2
32290 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
322a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
322b0 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
322c0 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
322d0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
322e0 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
322f0 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
32300 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32310 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
32320 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
32330 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
32340 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
32350 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
32360 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
32370 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
32380 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
32390 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
323a0 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
323b0 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20  d+'0') : '?');. 
323c0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
323d0 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20  isOrdered>0 ){. 
323e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
323f0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
32400 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
32410 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
32420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32430 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
32440 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
32450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32460 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
32470 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
32480 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
32490 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
324a0 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
324b0 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
324c0 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
324d0 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
324e0 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
324f0 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
32500 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
32510 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
32520 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
32530 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
32540 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
32550 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
32560 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32570 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
32580 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
32590 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
325a0 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
325b0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
325c0 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
325d0 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66  rom = aFrom;.  f
325e0 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
325f0 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
32600 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
32610 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
32620 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
32630 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ii];.  }.  asser
32640 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
32650 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a  l==nLoop );.  /*
32660 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74   Load the lowest
32670 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20   cost path into 
32680 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28  pWInfo */.  for(
32690 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
326a0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
326b0 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
326c0 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
326d0 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20  >a + iLoop;.    
326e0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d  pLevel->pWLoop =
326f0 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d   pWLoop = pFrom-
32700 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
32710 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
32720 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b   = pWLoop->iTab;
32730 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
32740 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  bCur = pWInfo->p
32750 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
32760 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
32770 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57  r;.  }.  if( (pW
32780 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
32790 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
327a0 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26  STINCT)!=0.   &&
327b0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
327c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
327d0 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26  TINCTBY)==0.   &
327e0 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  & pWInfo->eDisti
327f0 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
32800 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e  NCT_NOOP.   && n
32810 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20  RowEst.  ){.    
32820 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b  Bitmask notUsed;
32830 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68  .    int rc = wh
32840 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
32850 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
32860 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
32870 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20  et, pFrom,.     
32880 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
32890 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c  E_DISTINCTBY, nL
328a0 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
328b0 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e  oop[nLoop-1], &n
328c0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
328d0 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65   rc==pWInfo->pRe
328e0 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29  sultSet->nExpr )
328f0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
32900 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
32910 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
32920 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
32930 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
32940 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
32950 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
32960 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
32970 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69  NCTBY ){.      i
32980 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65  f( pFrom->isOrde
32990 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  red==pWInfo->pOr
329a0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
329b0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
329c0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
329d0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
329e0 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
329f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
32a00 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46  nfo->nOBSat = pF
32a10 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a  rom->isOrdered;.
32a20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
32a30 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49  ->nOBSat<0 ) pWI
32a40 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b  nfo->nOBSat = 0;
32a50 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
32a60 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
32a70 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20  revLoop;.    }. 
32a80 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
32a90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
32aa0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
32ab0 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
32ac0 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
32ad0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
32ae0 70 72 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  pr.    ){.      
32af0 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 20  Bitmask notUsed 
32b00 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
32b10 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50 61 74  Order = wherePat
32b20 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
32b30 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
32b40 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  ->pOrderBy, .   
32b50 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c         pFrom, 0,
32b60 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
32b70 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
32b80 20 26 6e 6f 74 55 73 65 64 0a 20 20 20 20 20 20   &notUsed.      
32b90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32ba0 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d   pWInfo->sorted=
32bb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  =0 );.      pWIn
32bc0 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 28 6e 4f  fo->sorted = (nO
32bd0 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
32be0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  rderBy->nExpr);.
32bf0 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57      }.  }...  pW
32c00 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
32c10 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20  pFrom->nRow;..  
32c20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72  /* Free temporar
32c30 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74  y memory and ret
32c40 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  urn success */. 
32c50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
32c60 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65  b, pSpace);.  re
32c70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
32c80 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75  }../*.** Most qu
32c90 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61  eries use only a
32ca0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74   single table (t
32cb0 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e  hey are not join
32cc0 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73  s) and have.** s
32cd0 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61  imple == constra
32ce0 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64  ints against ind
32cf0 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68  exed fields.  Th
32d00 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
32d10 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74  pts.** to plan t
32d20 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65  hose simple case
32d30 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73  s using much les
32d40 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20  s ceremony than 
32d50 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70  the.** general-p
32d60 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61  urpose query pla
32d70 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62  nner, and thereb
32d80 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73  y yield faster s
32d90 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
32da0 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68  .** times for th
32db0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a  e common case..*
32dc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
32dd0 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
32de0 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63   if this query c
32df0 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79  an be handled by
32e00 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c   this.** no-fril
32e10 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  ls query planner
32e20 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69  .  Return zero i
32e30 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65  f this query nee
32e40 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72  ds the .** gener
32e50 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
32e60 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61   planner..*/.sta
32e70 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f  tic int whereSho
32e80 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42  rtCut(WhereLoopB
32e90 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
32ea0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
32eb0 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  pWInfo;.  struct
32ec0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
32ed0 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61  Item;.  WhereCla
32ee0 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
32ef0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
32f00 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
32f10 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
32f20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a  int j;.  Table *
32f30 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
32f40 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f  Idx;.  .  pWInfo
32f50 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
32f60 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  nfo;.  if( pWInf
32f70 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
32f80 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
32f90 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  E ) return 0;.  
32fa0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
32fb0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d  pTabList->nSrc>=
32fc0 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  1 );.  pItem = p
32fd0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
32fe0 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74  >a;.  pTab = pIt
32ff0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20  em->pTab;.  if( 
33000 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
33010 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
33020 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20  ( pItem->zIndex 
33030 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
33040 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
33050 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
33060 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
33070 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
33080 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
33090 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f  Flags = 0;.  pLo
330a0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
330b0 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d  p = 0;.  pTerm =
330c0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
330d0 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45  Cur, -1, 0, WO_E
330e0 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  Q, 0);.  if( pTe
330f0 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  rm ){.    pLoop-
33100 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
33110 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
33120 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  _IPK|WHERE_ONERO
33130 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c  W;.    pLoop->aL
33140 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
33150 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  .    pLoop->nLTe
33160 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f  rm = 1;.    pLoo
33170 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
33180 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e   1;.    /* TUNIN
33190 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77  G: Cost of a row
331a0 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20  id lookup is 10 
331b0 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  */.    pLoop->rR
331c0 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d  un = 33;  /* 33=
331d0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
331e0 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  0) */.  }else{. 
331f0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
33200 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
33210 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
33220 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
33230 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70   pLoop->aLTermSp
33240 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ace==pLoop->aLTe
33250 72 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  rm );.      asse
33260 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 4c  rt( ArraySize(pL
33270 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
33280 29 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 69 66  )==4 );.      if
33290 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
332a0 3d 4f 45 5f 4e 6f 6e 65 20 0a 20 20 20 20 20 20  =OE_None .      
332b0 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49   || pIdx->pPartI
332c0 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20  dxWhere!=0 .    
332d0 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79     || pIdx->nKey
332e0 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c  Col>ArraySize(pL
332f0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
33300 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69  ) .      ) conti
33310 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nue;.      for(j
33320 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
33330 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
33340 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
33350 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
33360 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
33370 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  , 0, WO_EQ, pIdx
33380 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
33390 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
333a0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
333b0 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72  aLTerm[j] = pTer
333c0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
333d0 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b   if( j!=pIdx->nK
333e0 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  eyCol ) continue
333f0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  ;.      pLoop->w
33400 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
33410 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f  OLUMN_EQ|WHERE_O
33420 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45  NEROW|WHERE_INDE
33430 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  XED;.      if( p
33440 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  Idx->isCovering 
33450 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73  || (pItem->colUs
33460 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49  ed & ~columnsInI
33470 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29  ndex(pIdx))==0 )
33480 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
33490 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
334a0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
334b0 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d    }.      pLoop-
334c0 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20  >nLTerm = j;.   
334d0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
334e0 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20  e.nEq = j;.     
334f0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
33500 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
33510 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
33520 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65  Cost of a unique
33530 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73   index lookup is
33540 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f   15 */.      pLo
33550 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20  op->rRun = 39;  
33560 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 39==sqlite3Lo
33570 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20  gEst(15) */.    
33580 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
33590 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
335a0 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70  wsFlags ){.    p
335b0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
335c0 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e  gEst)1;.    pWIn
335d0 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20  fo->a[0].pWLoop 
335e0 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f  = pLoop;.    pLo
335f0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67  op->maskSelf = g
33600 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
33610 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  sMaskSet, iCur);
33620 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
33630 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72  ].iTabCur = iCur
33640 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  ;.    pWInfo->nR
33650 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69  owOut = 1;.    i
33660 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
33670 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  rBy ) pWInfo->nO
33680 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e  BSat =  pWInfo->
33690 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
336a0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
336b0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
336c0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
336d0 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
336e0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
336f0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
33700 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64  IQUE;.    }.#ifd
33710 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
33720 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d      pLoop->cId =
33730 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20   '0';.#endif.   
33740 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
33750 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
33760 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
33770 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
33780 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
33790 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
337a0 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
337b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
337c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
337d0 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
337e0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
337f0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
33800 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
33810 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
33820 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
33830 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
33840 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
33850 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
33860 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
33870 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
33880 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
33890 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
338a0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
338b0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
338c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
338d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
338e0 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
338f0 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
33900 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
33910 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
33920 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
33930 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
33940 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
33950 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
33960 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
33970 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
33980 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
33990 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
339a0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
339b0 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
339c0 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
339d0 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
339e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
339f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
33a00 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
33a10 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
33a20 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
33a30 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
33a40 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
33a50 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
33a60 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
33a70 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
33a80 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
33a90 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
33aa0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
33ab0 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
33ac0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
33ad0 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
33ae0 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
33af0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
33b00 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
33b10 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
33b20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
33b30 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
33b40 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
33b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b60 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
33b70 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
33b80 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
33b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ba0 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
33bb0 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
33bc0 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
33bd0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
33be0 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
33bf0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
33c00 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
33c10 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
33c20 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
33c30 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
33c40 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
33c50 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
33c60 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
33c70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
33c80 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
33c90 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
33ca0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
33cb0 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
33cc0 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
33cd0 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
33ce0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
33cf0 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
33d00 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
33d10 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
33d20 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
33d30 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
33d40 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
33d50 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
33d60 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
33d70 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
33d80 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
33d90 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
33da0 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
33db0 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
33dc0 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
33dd0 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
33de0 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
33df0 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
33e00 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
33e10 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
33e20 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
33e30 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
33e40 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
33e50 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
33e60 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
33e70 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
33e80 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
33e90 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
33ea0 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
33eb0 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
33ec0 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
33ed0 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
33ee0 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
33ef0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
33f00 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
33f10 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
33f20 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
33f30 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
33f40 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
33f50 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
33f60 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
33f70 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
33f80 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
33f90 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
33fa0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
33fb0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
33fc0 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
33fd0 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
33fe0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
33ff0 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
34000 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
34010 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
34020 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
34030 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
34040 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
34050 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
34060 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
34070 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
34080 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
34090 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
340a0 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
340b0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
340c0 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
340d0 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
340e0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
340f0 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
34100 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
34110 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
34120 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
34130 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
34140 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
34150 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
34160 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
34170 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
34180 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
34190 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
341a0 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
341b0 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
341c0 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
341d0 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
341e0 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
341f0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
34200 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
34210 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
34220 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
34230 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
34240 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
34250 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
34260 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
34270 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
34280 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
34290 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
342a0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
342b0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
342c0 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
342d0 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
342e0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
342f0 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
34300 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
34310 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
34320 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
34330 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
34340 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
34350 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
34360 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
34370 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
34380 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
34390 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
343a0 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
343b0 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
343c0 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
343d0 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
343e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
343f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f  DER BY clause (o
34400 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
34410 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20  lause.** if the 
34420 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
34430 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74  ag is set in wct
34440 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45  rlFlags) of a SE
34450 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
34460 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
34470 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
34480 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
34490 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
344a0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
344b0 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
344c0 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
344d0 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
344e0 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
344f0 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20  .** The iIdxCur 
34500 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
34510 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
34520 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20  f an index.  If 
34530 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  .** WHERE_ONETAB
34540 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
34550 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63  iIdxCur is the c
34560 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
34570 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75  an index.** to u
34580 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  se for OR clause
34590 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
345a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  e WHERE clause s
345b0 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a  hould use this.*
345c0 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f  * specific curso
345d0 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45  r.  If WHERE_ONE
345e0 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20  PASS_DESIRED is 
345f0 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75  set, then iIdxCu
34600 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  r is.** the firs
34610 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61  t cursor in an a
34620 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20  rray of cursors 
34630 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e  for all indices.
34640 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64    iIdxCur should
34650 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
34660 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f  ompute the appro
34670 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65  priate cursor de
34680 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68  pending on which
34690 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65   index is.** use
346a0 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
346b0 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
346c0 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
346d0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
346e0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
346f0 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
34700 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
34710 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c  FROM clause: A l
34720 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
34730 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
34740 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
34750 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
34760 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
34770 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
34780 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
34790 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
347a0 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f  UP BY) clause, o
347b0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
347c0 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
347d0 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20  , /* Result set 
347e0 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
347f0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
34800 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ,       /* One o
34810 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
34820 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
34830 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
34840 69 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20  int iIdxCur     
34850 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52        /* If WHER
34860 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
34870 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75  is set, index cu
34880 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  rsor number */.)
34890 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e  {.  int nByteWIn
348a0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
348b0 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c  * Num. bytes all
348c0 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65  ocated for Where
348d0 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20  Info struct */. 
348e0 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20   int nTabList;  
348f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
34900 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
34910 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f  s in pTabList */
34920 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
34930 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Info;         /*
34940 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   Will become the
34950 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
34960 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
34970 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
34980 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f  arse->pVdbe;   /
34990 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61  * The virtual da
349a0 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f  tabase engine */
349b0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
349c0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ady;          /*
349d0 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   Cursors that ar
349e0 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69  e not yet positi
349f0 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oned */.  WhereL
34a00 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b  oopBuilder sWLB;
34a10 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
34a20 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f  eLoop builder */
34a30 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
34a40 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a  *pMaskSet;    /*
34a50 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
34a60 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68  mask set */.  Wh
34a70 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
34a80 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69  ;        /* A si
34a90 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57  ngle level in pW
34aa0 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57  Info->a[] */.  W
34ab0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
34ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
34ad0 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65  nter to a single
34ae0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
34af0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  t */.  int ii;  
34b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b10 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
34b20 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
34b30 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
34b40 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
34b50 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
34b60 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
34b70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
34b80 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f  rn code */...  /
34b90 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69  * Variable initi
34ba0 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64  alization */.  d
34bb0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
34bc0 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20    memset(&sWLB, 
34bd0 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29  0, sizeof(sWLB))
34be0 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  ;..  /* An ORDER
34bf0 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65  /GROUP BY clause
34c00 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36 33   of more than 63
34c10 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65   terms cannot be
34c20 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20   optimized */.  
34c30 74 65 73 74 63 61 73 65 28 20 70 4f 72 64 65 72  testcase( pOrder
34c40 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e  By && pOrderBy->
34c50 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a  nExpr==BMS-1 );.
34c60 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
34c70 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  & pOrderBy->nExp
34c80 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72 42  r>=BMS ) pOrderB
34c90 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f  y = 0;.  sWLB.pO
34ca0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
34cb0 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65  y;..  /* Disable
34cc0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
34cd0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51  timization if SQ
34ce0 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
34cf0 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a   is set via.  **
34d00 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74   sqlite3_test_ct
34d10 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  rl(SQLITE_TESTCT
34d20 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
34d30 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f  ,...) */.  if( O
34d40 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
34d50 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  led(db, SQLITE_D
34d60 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20  istinctOpt) ){. 
34d70 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d     wctrlFlags &=
34d80 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53   ~WHERE_WANT_DIS
34d90 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TINCT;.  }..  /*
34da0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
34db0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
34dc0 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
34dd0 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
34de0 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
34df0 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
34e00 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  /.  testcase( pT
34e10 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d  abList->nSrc==BM
34e20 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c  S );.  if( pTabL
34e30 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
34e40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
34e50 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
34e60 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
34e70 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
34e80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
34e90 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66    }..  /* This f
34ea0 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79  unction normally
34eb0 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73   generates a nes
34ec0 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c  ted loop for all
34ed0 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a   tables in .  **
34ee0 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20   pTabList.  But 
34ef0 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  if the WHERE_ONE
34f00 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
34f10 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20  is set, then we 
34f20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79  should.  ** only
34f30 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   generate code f
34f40 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62  or the first tab
34f50 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61  le in pTabList a
34f60 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20  nd assume that. 
34f70 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20   ** any cursors 
34f80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
34f90 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65  subsequent table
34fa0 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69  s are uninitiali
34fb0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62  zed..  */.  nTab
34fc0 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61  List = (wctrlFla
34fd0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
34fe0 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20  BLE_ONLY) ? 1 : 
34ff0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a  pTabList->nSrc;.
35000 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
35010 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
35020 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
35030 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
35040 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20  become the.  ** 
35050 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20  return value. A 
35060 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
35070 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  n is used to sto
35080 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  re the WhereInfo
35090 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68  .  ** struct, th
350a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68  e contents of Wh
350b0 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65  ereInfo.a[], the
350c0 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
350d0 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20  ucture.  ** and 
350e0 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  the WhereMaskSet
350f0 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63   structure. Sinc
35100 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f  e WhereClause co
35110 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65  ntains an 8-byte
35120 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70  .  ** field (typ
35130 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75  e Bitmask) it mu
35140 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e  st be aligned on
35150 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
35160 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ary on.  ** some
35170 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20   architectures. 
35180 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38  Hence the ROUND8
35190 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  () below..  */. 
351a0 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f   nByteWInfo = RO
351b0 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72  UND8(sizeof(Wher
351c0 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74  eInfo)+(nTabList
351d0 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  -1)*sizeof(Where
351e0 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66  Level));.  pWInf
351f0 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
35200 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
35210 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28  eWInfo + sizeof(
35220 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69  WhereLoop));.  i
35230 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
35240 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
35250 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
35260 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  nfo);.    pWInfo
35270 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77   = 0;.    goto w
35280 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
35290 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69    }.  pWInfo->ai
352a0 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20  CurOnePass[0] = 
352b0 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
352c0 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Pass[1] = -1;.  
352d0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d  pWInfo->nLevel =
352e0 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   nTabList;.  pWI
352f0 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  nfo->pParse = pP
35300 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  arse;.  pWInfo->
35310 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
35320 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
35330 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
35340 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52  By;.  pWInfo->pR
35350 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75  esultSet = pResu
35360 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  ltSet;.  pWInfo-
35370 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f  >iBreak = pWInfo
35380 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ->iContinue = sq
35390 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
353a0 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d  el(v);.  pWInfo-
353b0 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63  >wctrlFlags = wc
353c0 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e  trlFlags;.  pWIn
353d0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
353e0 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
353f0 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73  ueryLoop;.  pMas
35400 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  kSet = &pWInfo->
35410 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42  sMaskSet;.  sWLB
35420 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  .pWInfo = pWInfo
35430 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26  ;.  sWLB.pWC = &
35440 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73  pWInfo->sWC;.  s
35450 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72  WLB.pNew = (Wher
35460 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29  eLoop*)(((char*)
35470 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e  pWInfo)+nByteWIn
35480 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  fo);.  assert( E
35490 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
354a0 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29  ENT(sWLB.pNew) )
354b0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
354c0 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69  t(sWLB.pNew);.#i
354d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
354e0 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63  G.  sWLB.pNew->c
354f0 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66  Id = '*';.#endif
35500 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
35510 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
35520 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
35530 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
35540 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
35550 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
35560 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
35570 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
35580 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61   initMaskSet(pMa
35590 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43  skSet);.  whereC
355a0 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66  lauseInit(&pWInf
355b0 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b  o->sWC, pWInfo);
355c0 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 70  .  whereSplit(&p
355d0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65  WInfo->sWC, pWhe
355e0 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  re, TK_AND);.   
355f0 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
35600 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
35610 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
35620 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
35630 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
35640 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
35650 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
35660 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
35670 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f   thru..  */.  fo
35680 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e  r(ii=0; ii<sWLB.
35690 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  pWC->nTerm; ii++
356a0 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c  ){.    if( nTabL
356b0 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ist==0 || sqlite
356c0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
356d0 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d  otJoin(sWLB.pWC-
356e0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b  >a[ii].pExpr) ){
356f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
35700 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
35710 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69  , sWLB.pWC->a[ii
35720 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d  ].pExpr, pWInfo-
35730 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20  >iBreak,.       
35740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35750 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e    SQLITE_JUMPIFN
35760 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42  ULL);.      sWLB
35770 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c  .pWC->a[ii].wtFl
35780 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
35790 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
357a0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
357b0 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a   No FROM clause.
357c0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c    */.  if( nTabL
357d0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ist==0 ){.    if
357e0 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ( pOrderBy ) pWI
357f0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f  nfo->nOBSat = pO
35800 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
35810 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
35820 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
35830 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
35840 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
35850 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
35860 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
35870 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69  }.  }..  /* Assi
35880 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
35890 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
358a0 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
358b0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
358c0 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67  .  ** When assig
358d0 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c  ning bitmask val
358e0 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75  ues to FROM clau
358f0 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d  se cursors, it m
35900 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20  ust be.  ** the 
35910 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69  case that if X i
35920 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
35930 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20  r the N-th FROM 
35940 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e  clause term then
35950 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  .  ** the bitmas
35960 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63  k for all FROM c
35970 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74  lause terms to t
35980 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e  he left of the N
35990 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73  -th term.  ** is
359a0 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70   (X-1).   An exp
359b0 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
359c0 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
359d0 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73  LEFT JOIN can us
359e0 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e  e.  ** its Expr.
359f0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
35a00 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68  value to find th
35a10 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65  e bitmask of the
35a20 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a   right table.  *
35a30 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
35a40 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20  Subtracting one 
35a50 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74  from the right t
35a60 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76  able bitmask giv
35a70 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73  es a.  ** bitmas
35a80 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
35a90 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
35aa0 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69  the join.  Knowi
35ab0 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  ng the bitmask. 
35ac0 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c   ** for all tabl
35ad0 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
35ae0 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73  f a left join is
35af0 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
35b00 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a  ket #3015..  **.
35b10 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
35b20 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
35b30 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
35b40 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
35b50 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69  s in.  ** pTabLi
35b60 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65  st, not just the
35b70 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20   first nTabList 
35b80 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73  tables.  nTabLis
35b90 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20  t is normally.  
35ba0 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62  ** equal to pTab
35bb0 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d  List->nSrc but m
35bc0 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65  ight be shortene
35bd0 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20  d to 1 if the.  
35be0 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  ** WHERE_ONETABL
35bf0 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
35c00 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  et..  */.  for(i
35c10 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
35c20 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
35c30 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d     createMask(pM
35c40 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
35c50 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
35c60 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
35c70 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74  EBUG.  {.    Bit
35c80 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d  mask toTheLeft =
35c90 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
35ca0 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
35cb0 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
35cc0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65    Bitmask m = ge
35cd0 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
35ce0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
35cf0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
35d00 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
35d10 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
35d20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
35d30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
35d40 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
35d50 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
35d60 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
35d70 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
35d80 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
35d90 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
35da0 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
35db0 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
35dc0 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
35dd0 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
35de0 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
35df0 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
35e00 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
35e10 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
35e20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
35e30 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
35e40 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
35e50 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
35e60 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
35e70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
35e80 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
35e90 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  WC);.  if( db->m
35ea0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
35eb0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
35ec0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  inError;.  }..  
35ed0 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
35ee0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
35ef0 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
35f00 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
35f10 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
35f20 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
35f30 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20  WC, pResultSet) 
35f40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
35f50 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67  DISTINCT marking
35f60 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20   is pointless.  
35f70 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20  Ignore it. */.  
35f80 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
35f90 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
35fa0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
35fb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
35fc0 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
35fd0 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45    /* Try to ORDE
35fe0 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20  R BY the result 
35ff0 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74  set to make dist
36000 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20  inct processing 
36010 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20  easier */.      
36020 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
36030 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54  gs |= WHERE_DIST
36040 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57  INCTBY;.      pW
36050 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
36060 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
36070 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
36080 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65  struct the Where
36090 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
360a0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
360b0 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
360c0 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
360d0 29 29 3b 0a 20 20 2f 2a 20 44 69 73 70 6c 61 79  ));.  /* Display
360e0 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
360f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
36100 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  /.#if defined(WH
36110 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
36120 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
36130 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
36140 45 58 50 4c 41 49 4e 29 0a 20 20 69 66 28 20 73  EXPLAIN).  if( s
36150 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
36160 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
36170 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 20  int i;.    Vdbe 
36180 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
36190 62 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  be;.    sqlite3E
361a0 78 70 6c 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a  xplainBegin(v);.
361b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
361c0 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  WLB.pWC->nTerm; 
361d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
361e0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
361f0 28 76 2c 20 22 23 25 2d 32 64 20 22 2c 20 69 29  (v, "#%-2d ", i)
36200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
36210 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b 0a 20  xplainPush(v);. 
36220 20 20 20 20 20 77 68 65 72 65 45 78 70 6c 61 69       whereExplai
36230 6e 54 65 72 6d 28 76 2c 20 26 73 57 4c 42 2e 70  nTerm(v, &sWLB.p
36240 57 43 2d 3e 61 5b 69 5d 29 3b 0a 20 20 20 20 20  WC->a[i]);.     
36250 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
36260 6f 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  op(v);.      sql
36270 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76 29  ite3ExplainNL(v)
36280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
36290 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73 68  te3ExplainFinish
362a0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
362b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22  DebugPrintf("%s"
362c0 2c 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  , sqlite3VdbeExp
362d0 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20 20  lanation(v));.  
362e0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e  }.#endif.  if( n
362f0 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68  TabList!=1 || wh
36300 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c  ereShortCut(&sWL
36310 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  B)==0 ){.    rc 
36320 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  = whereLoopAddAl
36330 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66  l(&sWLB);.    if
36340 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
36350 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a  eBeginError;.  .
36360 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61      /* Display a
36370 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ll of the WhereL
36380 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 66 20 77  oop objects if w
36390 68 65 72 65 74 72 61 63 65 20 69 73 20 65 6e 61  heretrace is ena
363a0 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 57  bled */.#ifdef W
363b0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
363c0 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 20 20  D /* !=0 */.    
363d0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
363e0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 57  Trace ){.      W
363f0 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20  hereLoop *p;.   
36400 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
36410 73 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61 62  static char zLab
36420 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37  el[] = "01234567
36430 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  89abcdefghijklmn
36440 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20  opqrstuvwyxz".  
36450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36470 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a       "ABCDEFGHIJ
36480 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a  KLMNOPQRSTUVWYXZ
36490 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  ";.      for(p=p
364a0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69  WInfo->pLoops, i
364b0 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  =0; p; p=p->pNex
364c0 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20  tLoop, i++){.   
364d0 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c       p->cId = zL
364e0 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c  abel[i%sizeof(zL
364f0 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20  abel)];.        
36500 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
36510 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
36520 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
36530 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61  f.  .    wherePa
36540 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
36550 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
36560 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
36570 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
36580 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57  rror;.    if( pW
36590 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
365a0 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61  {.       wherePa
365b0 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
365c0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
365d0 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  +1);.       if( 
365e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
365f0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
36600 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  inError;.    }. 
36610 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
36620 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
36630 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
36640 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
36650 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49  )!=0 ){.     pWI
36660 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28  nfo->revMask = (
36670 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20  Bitmask)(-1);.  
36680 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
36690 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62  nErr || NEVER(db
366a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20  ->mallocFailed) 
366b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
366c0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
366d0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
366e0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21 3d  CE_ENABLED /* !=
366f0 30 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  0 */.  if( sqlit
36700 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
36710 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
36720 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
36730 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
36740 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
36750 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
36760 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
36770 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  BSat>0 ){.      
36780 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
36790 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c  tf(" ORDERBY=%d,
367a0 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d  0x%llx", pWInfo-
367b0 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d  >nOBSat, pWInfo-
367c0 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  >revMask);.    }
367d0 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49  .    switch( pWI
367e0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29  nfo->eDistinct )
367f0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
36800 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
36810 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
36820 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
36830 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69  ("  DISTINCT=uni
36840 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62  que");.        b
36850 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
36860 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
36870 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
36880 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
36890 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
368a0 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65   DISTINCT=ordere
368b0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
368c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
368d0 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
368e0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a  TINCT_UNORDERED:
368f0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
36900 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
36910 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65   DISTINCT=unorde
36920 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
36930 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
36940 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
36950 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
36960 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
36970 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  ii<pWInfo->nLeve
36980 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
36990 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
369a0 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c  WInfo->a[ii].pWL
369b0 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  oop, sWLB.pWC);.
369c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
369d0 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
369e0 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f   omit tables fro
369f0 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20  m the join that 
36a00 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68  do not effect th
36a10 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66  e result */.  if
36a20 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
36a30 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c  >=2.   && pResul
36a40 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70  tSet!=0.   && Op
36a50 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
36a60 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69  d(db, SQLITE_Omi
36a70 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a  tNoopJoin).  ){.
36a80 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55      Bitmask tabU
36a90 73 65 64 20 3d 20 65 78 70 72 4c 69 73 74 54 61  sed = exprListTa
36aa0 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
36ab0 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a  t, pResultSet);.
36ac0 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72      if( sWLB.pOr
36ad0 64 65 72 42 79 20 29 20 74 61 62 55 73 65 64 20  derBy ) tabUsed 
36ae0 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
36af0 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
36b00 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a  sWLB.pOrderBy);.
36b10 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66      while( pWInf
36b20 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a  o->nLevel>=2 ){.
36b30 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
36b40 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20  *pTerm, *pEnd;. 
36b50 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49       pLoop = pWI
36b60 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e  nfo->a[pWInfo->n
36b70 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b  Level-1].pWLoop;
36b80 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e  .      if( (pWIn
36b90 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
36ba0 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69  pLoop->iTab].joi
36bb0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
36bc0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
36bd0 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
36be0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
36bf0 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20  DISTINCT)==0.   
36c00 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
36c10 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
36c20 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20  NEROW)==0.      
36c30 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
36c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36c50 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70  if( (tabUsed & p
36c60 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  Loop->maskSelf)!
36c70 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
36c80 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57    pEnd = sWLB.pW
36c90 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d  C->a + sWLB.pWC-
36ca0 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f  >nTerm;.      fo
36cb0 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
36cc0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
36cd0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
36ce0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
36cf0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
36d00 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20  ->maskSelf)!=0. 
36d10 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
36d20 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
36d30 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
36d40 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29  mJoin).        )
36d50 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
36d60 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
36d70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
36d80 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61  Term<pEnd ) brea
36d90 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  k;.      WHERETR
36da0 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e  ACE(0xffff, ("->
36db0 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f   drop loop %c no
36dc0 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70  t used\n", pLoop
36dd0 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70  ->cId));.      p
36de0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b  WInfo->nLevel--;
36df0 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d  .      nTabList-
36e00 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57  -;.    }.  }.  W
36e10 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
36e20 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  ,("*** Optimizer
36e30 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
36e40 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  ));.  pWInfo->pP
36e50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
36e60 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77   += pWInfo->nRow
36e70 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
36e80 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55  e caller is an U
36e90 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
36ea0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
36eb0 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  s requesting.  *
36ec0 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70  * to use a one-p
36ed0 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64  ass algorithm, d
36ee0 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73  etermine if this
36ef0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
36f00 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61  .  ** The one-pa
36f10 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c  ss algorithm onl
36f20 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57  y works if the W
36f30 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
36f40 74 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68 65 20  trains.  ** the 
36f50 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64  statement to upd
36f60 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ate a single row
36f70 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
36f80 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
36f90 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
36fa0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
36fb0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
36fc0 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
36fd0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
36fe0 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a  SS_DESIRED)!=0 .
36ff0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61     && (pWInfo->a
37000 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
37010 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
37020 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57  OW)!=0 ){.    pW
37030 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
37040 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 48 61 73  = 1;.    if( Has
37050 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e  Rowid(pTabList->
37060 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20  a[0].pTab) ){.  
37070 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
37080 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
37090 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
370a0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  NLY;.    }.  }..
370b0 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
370c0 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
370d0 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
370e0 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
370f0 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
37100 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
37110 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
37120 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
37130 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
37140 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
37150 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
37160 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
37170 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
37180 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
37190 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
371a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
371b0 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
371c0 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
371d0 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
371e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
371f0 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
37200 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
37210 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
37220 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
37230 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
37240 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
37250 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
37260 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
37270 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
37280 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
37290 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
372a0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
372b0 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
372c0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
372d0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
372e0 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
372f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37300 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
37310 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
37320 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
37330 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
37340 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
37350 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
37360 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
37370 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
37380 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
37390 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
373a0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
373b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
373c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
373d0 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
373e0 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
373f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
37400 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
37410 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
37420 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
37430 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
37440 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
37450 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
37460 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
37470 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
37480 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
37490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
374a0 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61   op = OP_OpenRea
374b0 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  d;.      if( pWI
374c0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29  nfo->okOnePass )
374d0 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  {.        op = O
374e0 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
374f0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43       pWInfo->aiC
37500 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70  urOnePass[0] = p
37510 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
37520 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ;.      };.     
37530 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
37540 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  e(pParse, pTabIt
37550 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62  em->iCursor, iDb
37560 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20  , pTab, op);.   
37570 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
37580 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c  tem->iCursor==pL
37590 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b  evel->iTabCur );
375a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
375b0 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
375c0 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
375d0 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
375e0 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49    testcase( !pWI
375f0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
37600 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
37610 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  S );.      if( !
37620 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
37630 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c  s && pTab->nCol<
37640 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64 28  BMS && HasRowid(
37650 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
37660 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
37670 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
37680 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
37690 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
376a0 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
376b0 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
376c0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
376d0 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
376e0 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a  rentAddr(v)-1, .
376f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37700 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
37710 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29  TE_INT_TO_PTR(n)
37720 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
37730 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
37740 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
37750 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
37760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
37770 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
37780 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
37790 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
377a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
377b0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
377c0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
377d0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
377e0 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Ix = pLoop->u.bt
377f0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
37800 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b    int iIndexCur;
37810 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
37820 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
37830 20 20 20 2f 2a 20 69 49 64 78 43 75 72 20 69 73     /* iIdxCur is
37840 20 61 6c 77 61 79 73 20 73 65 74 20 69 66 20 74   always set if t
37850 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  o a positive val
37860 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73  ue if ONEPASS is
37870 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20   possible */.   
37880 20 20 20 61 73 73 65 72 74 28 20 69 49 64 78 43     assert( iIdxC
37890 75 72 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f  ur!=0 || (pWInfo
378a0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
378b0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
378c0 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  IRED)==0 );.    
378d0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
378e0 70 54 61 62 29 20 26 26 20 70 49 78 2d 3e 61 75  pTab) && pIx->au
378f0 74 6f 49 6e 64 65 78 3d 3d 32 0a 20 20 20 20 20  toIndex==2.     
37900 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
37910 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
37920 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20 20 20  E_ONLY)!=0.     
37930 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
37940 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20  his is one term 
37950 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a  of an OR-optimiz
37960 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20  ation using the 
37970 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61  PRIMARY KEY of a
37980 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48  .        ** WITH
37990 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
379a0 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20    No need for a 
379b0 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a  separate index *
379c0 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  /.        iIndex
379d0 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54  Cur = pLevel->iT
379e0 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f  abCur;.        o
379f0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
37a00 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f  se if( pWInfo->o
37a10 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20  kOnePass ){.    
37a20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20      Index *pJ = 
37a30 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
37a40 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  pIndex;.        
37a50 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78  iIndexCur = iIdx
37a60 43 75 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Cur;.        ass
37a70 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ert( wctrlFlags 
37a80 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
37a90 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20  DESIRED );.     
37aa0 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
37ab0 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20  (pJ) && pJ!=pIx 
37ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e  ){.          iIn
37ad0 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20  dexCur++;.      
37ae0 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65      pJ = pJ->pNe
37af0 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
37b00 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70        op = OP_Op
37b10 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20  enWrite;.       
37b20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
37b30 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65  ePass[1] = iInde
37b40 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xCur;.      }els
37b50 65 20 69 66 28 20 69 49 64 78 43 75 72 20 26 26  e if( iIdxCur &&
37b60 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
37b70 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
37b80 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
37b90 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49    iIndexCur = iI
37ba0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c  dxCur;.      }el
37bb0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64  se{.        iInd
37bc0 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  exCur = pParse->
37bd0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nTab++;.      }.
37be0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
37bf0 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75  dxCur = iIndexCu
37c00 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
37c10 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
37c20 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
37c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49        assert( iI
37c40 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  ndexCur>=0 );.  
37c50 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20      if( op ){.  
37c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37c70 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
37c80 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74  IndexCur, pIx->t
37c90 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
37ca0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
37cb0 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
37cc0 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20  e, pIx);.       
37cd0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
37ce0 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
37cf0 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
37d00 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d   }.    if( iDb>=
37d10 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56  0 ) sqlite3CodeV
37d20 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
37d30 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f  se, iDb);.    no
37d40 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
37d50 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
37d60 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e  kSet, pTabItem->
37d70 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  iCursor);.  }.  
37d80 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
37d90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
37da0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
37db0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
37dc0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
37dd0 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47  inError;..  /* G
37de0 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
37df0 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
37e00 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
37e10 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
37e20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
37e30 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
37e40 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
37e50 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
37e60 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
37e70 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
37e80 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
37e90 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62  or(ii=0; ii<nTab
37ea0 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  List; ii++){.   
37eb0 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
37ec0 6f 2d 3e 61 5b 69 69 5d 3b 0a 23 69 66 6e 64 65  o->a[ii];.#ifnde
37ed0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
37ee0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
37ef0 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
37f00 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
37f10 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
37f20 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
37f30 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
37f40 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  cIndex(pParse, &
37f50 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20  pWInfo->sWC,.   
37f60 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
37f70 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
37f80 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61  ->iFrom], notRea
37f90 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  dy, pLevel);.   
37fa0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
37fb0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
37fc0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
37fd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
37fe0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
37ff0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
38000 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c  , pLevel, ii, pL
38010 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74  evel->iFrom, wct
38020 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 70 4c  rlFlags);.    pL
38030 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d  evel->addrBody =
38040 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
38050 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
38060 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f  notReady = codeO
38070 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e  neLoopStart(pWIn
38080 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79  fo, ii, notReady
38090 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69  );.    pWInfo->i
380a0 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65  Continue = pLeve
380b0 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d  l->addrCont;.  }
380c0 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a  ..  /* Done. */.
380d0 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
380e0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
380f0 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20  HERE-core"));.  
38100 72 65 74 75 72 6e